Java 多執行緒學習筆記 4 多執行緒共享資料

2021-08-13 08:21:38 字數 2352 閱讀 3966

我們經常說某個變數是執行緒非安全的, 某個變數是執行緒安全, 這裡 是否安全 針對的是類的例項變數, 如果是方法內部的私有變數, 不會存在這個問題

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/10.

*/public

class

threaddata else

system.out.println(name + " got " + count);

} catch (interruptedexception e)

}}

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/9.

*/public

class

thread7a

implements

runnable

@override

public

void

run()

}

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/10.

*/public

class

thread7b

implements

runnable

@override

public

void

run()

}

寫個test

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/10.

*/public

class

test7

}

得到的結論是

v  got 20

a got 20

顯然 此時的count 是非執行緒安全的, 就是因為在給count 賦值的時候衝突了,那麼該如何避免呢?使用synchronized 關鍵字修飾

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/10.

*/public

class

threaddata else

} catch (interruptedexception e)

}}

a  got 10

v got 20

結論是: 兩個執行緒訪問同乙個物件中的同步方法的時候 一定是執行緒安全的,但是如果訪問的是多個物件呢?

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/10.

*/public

class

threaddata else

system.out.println(name + " got " + count);

} catch (interruptedexception e)

}}

package smaug.cloud.provider.thread.t7;

/** * created by naonao on 17/12/10.

*/public

class

test7

}

我們得到的輸出結果是啥捏

a

set over

v set over

v got 20

a got 10

兩個執行緒去訪問同乙個類的兩個不同例項的相同方法時,**是非同步執行的哦,synchronized 關鍵字取得鎖是 物件鎖,哪個執行緒優先獲取到鎖就可以優先執行,其他執行緒只能等待

總結a 執行緒持有object物件的lock 鎖, b執行緒可以非同步的方式呼叫object物件中的非synchronized 方法

a執行緒持有object物件的lock鎖,b如果在這時呼叫object物件中的synchronized 方法 則需等待,也就是同步

synchronized 具有可重入鎖的機制, 可以自己再次獲取自己的內部鎖

當執行緒執行的**出現異常的時候, 會釋放其持有的鎖

同步鎖不具備繼承性

Java多執行緒學習筆記

程序與執行緒 1.程序 執行中的程式 乙個程序至少包含乙個執行緒 2.執行緒 程序中負責程式執行的執行單元 執行緒本身依靠程式進行執行 執行緒是程式中的順序控制流,只能使用分配給程式的資源和環境 3.單執行緒 程式中只存在乙個執行緒,實際上主方法就是乙個主線程 4.多執行緒 在乙個程式中執行多個任務...

java多執行緒學習筆記

1 執行緒是乙個程式內部不同的執行路徑 2 生成執行緒只要能使用介面就不要繼承,繼承後就不能繼承其他的類,比較死。而且繼承的run方法不能丟擲與父類不同的異常。比如sleep的intterruptedexception 3 start方法只是說我準備好了,進入就緒狀態了,等待排程後才進入執行狀態 4...

Java多執行緒筆記

synchronized修飾符是不會被子類繼承的。也就是說,乙個執行緒安全的可繼承類,有可在子類化時喪失安全性 p60 當執行緒在寫指定欄位的值時,若這個字段不是volatile也沒有用synchronized同步化時,其它執行緒可能看不到這種變化。這不是可不可以分割的問題,而是其它執行緒是否可見的...