synchronized關(guān)鍵字
1 簡(jiǎn)單介紹
- synchronized 是java語(yǔ)言關(guān)鍵字,當(dāng)它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候彤断,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼潮剪。
- synchronized 關(guān)鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。
2 可以修飾哪些內(nèi)容
一自晰、 修飾一個(gè)代碼塊,被修飾的代碼塊稱為同步語(yǔ)句塊,其作用的范圍是大括號(hào){}括起來(lái)的代碼屠阻,作用的對(duì)象是調(diào)用這個(gè)代碼塊的對(duì)象;
二额各、修飾一個(gè)方法国觉,被修飾的方法稱為同步方法,其作用的范圍是整個(gè)方法虾啦,作用的對(duì)象是調(diào)用這個(gè)方法的對(duì)象麻诀;
三、修飾一個(gè)靜態(tài)的方法傲醉,其作用的范圍是整個(gè)靜態(tài)方法蝇闭,作用的對(duì)象是這個(gè)類的所有對(duì)象;
四硬毕、修飾一個(gè)類呻引,其作用的范圍是synchronized后面括號(hào)括起來(lái)的部分,作用的對(duì)象是這個(gè)類的所有對(duì)象吐咳。
3.synchonized(this)和synchonized(object)區(qū)別
其實(shí)并沒(méi)有很大的區(qū)別逻悠,synchonized(object)本身就包含synchonized(this)這種情況,使用的場(chǎng)景都是對(duì)一個(gè)代碼塊進(jìn)行加鎖韭脊,效率比直接在方法名上加synchonized高一些(下面分析)童谒,唯一的區(qū)別就是對(duì)象的不同。
-
對(duì)synchronized(this)的一些理解
一沪羔、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí)饥伊,一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
二琅豆、然而愉豺,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊茫因。
三粒氧、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí)节腐,其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。
四摘盆、當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí)翼雀,它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果孩擂,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞狼渊。
4.sychonized method 和 synchonized代碼塊的效率問(wèn)題
- 使用前者的對(duì)象會(huì)獲取該對(duì)象中所有synchonized的鎖,也就是其他線程不能訪問(wèn)所有加了synchonized前綴的方法(不僅僅只是當(dāng)前運(yùn)行的方法)类垦,影響了其他線程同步方法的訪問(wèn)狈邑,降低了效率。而后者只對(duì)當(dāng)前代碼塊加鎖蚤认,其他的同步方法不受影響米苹。
5.結(jié)論
1.synchronized 方法控制對(duì)類成員變量的訪問(wèn):每個(gè)類實(shí)例對(duì)應(yīng)一把鎖,每個(gè) synchronized 方法都必須獲得調(diào)用該方法的類實(shí)例的鎖方能執(zhí)行砰琢,否則所屬線程阻塞蘸嘶,方法一旦執(zhí)行,就獨(dú)占該鎖陪汽,直到從該方法返回時(shí)才將鎖釋放训唱,此后被阻塞的線程方能獲得該鎖,重新進(jìn)入可執(zhí)行狀態(tài)挚冤。這種機(jī)制確保了同一時(shí)刻對(duì)于每一個(gè)類實(shí)例况增,其所有聲明為 synchronized 的成員函數(shù)中至多只有一個(gè)處于可執(zhí)行狀態(tài)(因?yàn)橹炼嘀挥幸粋€(gè)能夠獲得該類實(shí)例對(duì)應(yīng)的鎖),從而有效避免了類成員變量的訪問(wèn)沖突(只要所有可能訪問(wèn)類成員變量的方法均被聲明為 synchronized)训挡。
2.synchronized 塊是這樣一個(gè)代碼塊澳骤,其中的代碼必須獲得對(duì)象 syncObject (如前所述,可以是類實(shí)例或類)的鎖方能執(zhí)行舍哄。由于可以針對(duì)任意代碼塊宴凉,且可任意指定上鎖的對(duì)象,故靈活性較高表悬。
3.在static方法前加synchronized:靜態(tài)方法屬于類方法弥锄,它屬于這個(gè)類,獲取到的鎖,是屬于類的鎖籽暇。
4.在普通方法前加synchronized:非static方法獲取到的鎖温治,是屬于當(dāng)前對(duì)象的鎖。
5.類鎖和對(duì)象鎖不同戒悠,synchronized修飾不加static的方法熬荆,鎖是加在單個(gè)對(duì)象上,不同的對(duì)象沒(méi)有競(jìng)爭(zhēng)關(guān)系绸狐;修飾加了static的方法卤恳,鎖是加載類上,這個(gè)類所有的對(duì)象競(jìng)爭(zhēng)一把鎖寒矿。