併發程式設計筆記

2021-07-02 08:01:40 字數 2102 閱讀 2481

public

void

somemethod()

public

void

somemethod()

public

void

method2(localobject localobject)

public

class

notthreadsafe

}notthreadsafe sharedinstance = new notthreadsafe();

new thread(new myrunnable(sharedinstance)).start();

new thread(new myrunnable(sharedinstance)).start();

public

class

myrunnable

implements

runnable

public

void

run()

}

小結

1.區域性變數中的基本資料型別(8種)永遠是執行緒安全的。

2.區域性變數中的物件型別只要不會被其他執行緒訪問到,也是執行緒安全的。

3.乙個物件例項被多個執行緒同時訪問時,他的成員變數就可能是執行緒不安全的。

如果乙個資源的建立,使用,銷毀都在同乙個執行緒內完成,

且永遠不會脫離該執行緒的控制,則該資源的使用就是執行緒安全的。

小結

同乙個資源或者物件本身是執行緒安全的,不一定保證這個應用是執行緒安全。如:

對資料庫資料表的插入更新操作,偽**如下:

if(資料庫有該記錄)

else

由於多執行緒下操作,可能會出現 同時插入多條相同記錄的資料。

當多個執行緒同時訪問同乙個資源,並且其中的乙個或者多個執行緒對這個資源進行了寫操作,才會產生競態條件。多個執行緒同時讀同乙個資源不會產生競態條件。

public

class immutablevalue

public

intgetvalue()

}

請注意immutablevalue類的成員變數value是通過建構函式賦值的,並且在類中沒有set方法。這意味著一旦immutablevalue例項被建立,value變數就不能再被修改,這就是不可變性。但你可以通過getvalue()方法讀取這個變數的值。

如果你需要對immutablevalue類的例項進行操作,可以通過得到value變數後建立乙個新的例項來實現,下面是乙個對value變數進行加法操作的示例:

public

class immutablevalue

public

intgetvalue()

public immutablevalue add(int valuetoadd)

}

請注意add()方法以加法操作的結果作為乙個新的immutablevalue類例項返回,而不是直接對它自己的value變數進行操作。

物件的不變性,就能保證執行緒安全嗎,答案是否定的,請參考一下節。

public

void calculator

public

void

setvalue(immutablevalue newvalue)

public

void

add(int newvalue)

}

calculator類持有乙個指向immutablevalue例項的引用。注意,通過setvalue()方法和add()方法可能會改變這個引用。因此,即使calculator類內部使用了乙個不可變物件,但calculator類本身還是可變的,因此calculator類不是執行緒安全的。換句話說:immutablevalue類是執行緒安全的,但使用它的類不是。當嘗試通過不可變性去獲得執行緒安全時,這點是需要牢記的。

要使calculator類實現執行緒安全,將getvalue()、setvalue()和add()方法都宣告為同步方法即可。

併發程式設計筆記(一)

1.執行緒安全 執行緒安全是指當多個執行緒同時訪問乙個物件 方法 類 的時候,該物件 方法 類 都能表現出正確的行為,那麼就表示是執行緒安全的。2.synchronized關鍵字 synchronized可以加在任意的物件或方法上,我們稱之為互斥區。當多個執行緒訪問互斥區的時候,是按照排隊的形式訪問...

併發程式設計學習筆記

併發程式設計第2章,基礎篇 2.1執行緒安全 1併發程式設計即是要控制對共享的可變的變數的訪問操作順序 2保證同步的方法,在語法 級別來說,可以使用synchronized,volatile,或者是現式的鎖,或者使用原子變數 3好的設計是避免執行緒危險的良方,使用oo的方法盡量避免執行緒的隱患。4執...

併發程式設計實戰筆記

template iterator 迭代器型別,t 內建資料型別 accumulate block iterator first,iterator last,t result templatet parallel accumulate iterator first,iterator last,t i...