java synchronized 静态_Java之Synchronized修饰实例方法和静态方法
一、Synchronized修飾實(shí)例方法,實(shí)際上是對調(diào)用該方法的對象加鎖,俗稱“對象鎖”
情況一:?同一個對象在兩個線程中分別訪問該對象的兩個同步實(shí)例方法
結(jié)果:會產(chǎn)生互斥?
原因:因?yàn)殒i針對的是對象,當(dāng)對象調(diào)用?一個synchronized方法時,其他同步方法需要等待其執(zhí)行結(jié)束并釋放鎖之后才能執(zhí)行
例子:
synchronized修飾實(shí)例方法情況一
?運(yùn)行結(jié)果:(可能出現(xiàn)的情況)
1、Thread-0
得到鎖?-->10s之后-->Thread-0
釋放鎖-->Thread-1
得到鎖?-->Thread-1
釋放鎖?
2、Thread-1
得到鎖?-->Thread-1
釋放鎖-->??Thread-0
得到鎖?-->10s之后-->Thread-0
釋放鎖
情況二:不同對象在兩個線程中分別調(diào)用同一個?同步實(shí)例方法
結(jié)果:不會互斥
原因:因?yàn)槭莾蓚€對象,鎖針對的是對象,并不是方法,所以可以并發(fā)執(zhí)行,不會互斥。
例子:
synchronized修飾實(shí)例方法情況二
?運(yùn)行結(jié)果:(可能出現(xiàn)的情況)
1、?Thread-0
得到鎖?-->Thread-1
得到鎖?-->Thread-1
釋放鎖?-->10s之后-->Thread-0釋放鎖
2、Thread-1 得到鎖?-->Thread-1
釋放鎖-->??Thread-0
得到鎖?-->10s之后-->Thread-0
釋放鎖
3、?Thread-0
得到鎖?-->Thread-1
得到鎖-->??Thread-1
釋放鎖?-->10s之后-->Thread-0
釋放鎖
4、?Thread-1
得到鎖?-->Thread-0
得到鎖-->??Thread-1
釋放鎖?-->10s之后-->Thread-0
釋放鎖?
二、Synchronized修飾靜態(tài)方法,實(shí)際上是對該類對象,俗稱“類鎖”?
情況一:用類直接在兩個線程中調(diào)用兩個不同的同步靜態(tài)方法
結(jié)果:會產(chǎn)生互斥
原因:因?yàn)閷o態(tài)方法加鎖,實(shí)際上是對類加鎖,類只有一個。因此當(dāng)一個同步靜態(tài)方法被訪問時,該類已處于被鎖狀態(tài)。此時其他同步靜態(tài)方法不能被訪問?(未用Synchronized修飾的靜態(tài)方法仍可以訪問)
例子:
synchronized修飾靜態(tài)方法情況一
?運(yùn)行結(jié)果:(可能出現(xiàn)的情況)
1、Thread-1 得到鎖-->Thread-1
釋放鎖-->Thread-0
得到鎖-->10s之后-->Thread-0 釋放鎖
2、?Thread-0
得到鎖-->10s之后-->Thread-0
釋放鎖-->Thread-1 得到鎖-->Thread-1釋放鎖
情況二:用一個類的靜態(tài)對象在兩個線程中調(diào)用同步靜態(tài)方法
結(jié)果:會產(chǎn)生互斥
原因:與??同一個對象在兩個線程中分別訪問該對象的兩個同步實(shí)例方法情況相同。本質(zhì)上還是對類的加鎖
例子:
synchronized修飾靜態(tài)方法情況二
?運(yùn)行結(jié)果:(可能出現(xiàn)的情況)
1、Thread-0 得到鎖-->10s之后-->Thread-0
釋放鎖-->Thread-1 得到鎖-->Thread-1 釋放鎖
2、?Thread-1
得到鎖-->Thread-1 釋放鎖-->Thread-0
得到鎖-->10s之后-->Thread-0 釋放鎖
?情況三:一個對象在兩個線程中分別調(diào)用一個同步靜態(tài)方法和一個同步實(shí)例方法
結(jié)果:不會產(chǎn)生互斥
原因:雖然是一個對象調(diào)用,但是兩個方法的鎖類型不同,調(diào)用靜態(tài)方法實(shí)際上是對類對象在調(diào)用,而調(diào)用實(shí)例方法實(shí)際上是對實(shí)例對象在調(diào)用。因?yàn)檫@兩個方法并不是一個對象鎖,因?yàn)椴粫コ?#xff0c;會并發(fā)執(zhí)行
例子:
synchronized修飾靜態(tài)方法情況三
?運(yùn)行結(jié)果:(可能出現(xiàn)的情況)
1、Thread-0 得到鎖-->Thread-1
得到鎖-->10s之后-->Thread-1
釋放鎖-->Thread-0 釋放鎖
2、Thread-0 得到鎖-->Thread-1
得到鎖-->10s之后-->Thread-0
釋放鎖-->Thread-1 釋放鎖?
3、Thread-1 得到鎖-->Thread-0
得到鎖-->10s之后-->Thread-0
釋放鎖-->Thread-1
釋放鎖??
3、Thread-1 得到鎖-->Thread-0
得到鎖-->10s之后-->Thread-1
釋放鎖-->Thread-0釋放鎖?
?三、結(jié)論
?1、靜態(tài)方法的鎖和實(shí)例方法的鎖,默認(rèn)是不同的對象鎖
2、靜態(tài)方法加鎖,能和該類中所有用synchronized修飾靜態(tài)方法的相互互斥,和?未用synchronized修飾的靜態(tài)方法不互斥
3、靜態(tài)?方法鎖實(shí)際是對類對象加鎖,實(shí)例方法加鎖實(shí)際是對實(shí)例對象加鎖
四、參考文章
總結(jié)
以上是生活随笔為你收集整理的java synchronized 静态_Java之Synchronized修饰实例方法和静态方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php sqlite id自增,Andr
- 下一篇: java static 修饰变量吗_Ja