我們經常說某個變數是執行緒非安全的, 某個變數是執行緒安全, 這裡 是否安全 針對的是類的例項變數, 如果是方法內部的私有變數, 不會存在這個問題
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同步化時,其它執行緒可能看不到這種變化。這不是可不可以分割的問題,而是其它執行緒是否可見的...