理解synchronized

  • 實(shí)例同步方法
  • 靜態(tài)同步方法
  • 實(shí)例同步方法塊
  • 靜態(tài)同步方法快
  • 每一個(gè)類都對(duì)應(yīng)一個(gè)Class對(duì)象,這個(gè)Class對(duì)象只有一個(gè)鎖,因此可將該鎖視作是類鎖。
  • 每一個(gè)類可以被實(shí)例化成無(wú)數(shù)個(gè)對(duì)象,而每一個(gè)對(duì)象只有一個(gè)鎖。
  • 對(duì)于多個(gè)線程,同時(shí)訪問(wèn)一個(gè)類的類成員變量,或者訪問(wèn)一個(gè)對(duì)象的成員變量,就會(huì)造成線程安全問(wèn)題。對(duì)于這些共享的數(shù)據(jù)會(huì)造成讀取不一致的問(wèn)題。
synchronized_structure.png

共享實(shí)例對(duì)象


多個(gè)線程共享同一個(gè)實(shí)例對(duì)象,那么對(duì)于實(shí)例對(duì)象的實(shí)例變量就會(huì)造成線程安全的問(wèn)題。在共享對(duì)象的方法中,如果有訪問(wèn)到共享的這些實(shí)例變量,則需要通過(guò)實(shí)例對(duì)象唯一的鎖來(lái)達(dá)到互斥。因此有兩種方法可以達(dá)到目的,1、在調(diào)用的實(shí)例方法上上鎖。2、加入同步塊。

synchronized_instance.png
  • 通過(guò)在實(shí)例方法上上鎖,表明只要擁有當(dāng)前所在的實(shí)例對(duì)象的鎖,才可以訪問(wèn)該方法。因?yàn)殒i只有一把,因此保證同一個(gè)時(shí)刻只有一個(gè)線程訪問(wèn)同步的實(shí)例方法。
    public/private/protected synchronized void methodName(){ //操作 }
  • 通過(guò)同步塊達(dá)到互斥的目的,多個(gè)線程驅(qū)動(dòng)同步快所在的方法執(zhí)行時(shí),如果同步塊是使得某個(gè)共享的實(shí)例對(duì)象的實(shí)例成員變量達(dá)到互斥,則線程進(jìn)入同步塊必須擁有這個(gè)實(shí)例對(duì)象的鎖才行,因此保證同一個(gè)時(shí)刻只能有一個(gè)線程進(jìn)入該同步塊。
    synchronized(共享對(duì)象){ //操作 }

共享Class對(duì)象


synchronized_static.png
  • 通過(guò)在靜態(tài)方法上上鎖,表明只有當(dāng)前類對(duì)應(yīng)的Class對(duì)象的鎖,才可以訪問(wèn)該靜態(tài)方法。因?yàn)橐粋€(gè)Class對(duì)象只有一把鎖,因此可以保證同一個(gè)時(shí)刻只能有用一個(gè)線程進(jìn)入該靜態(tài)方法。
    public/private/protected synchronized static void methodName(){ //操作 }
  • 使用同步塊。多個(gè)線程驅(qū)動(dòng)同步塊所在的方法時(shí),如果同步塊的目的是為了使得共享的某個(gè)類的類變量互斥,則線程進(jìn)入到同步塊必須擁有這個(gè)類的鎖才行,從而保證同一個(gè)時(shí)刻只能有同一個(gè)線程進(jìn)入該同步塊。
    synchronized(共享類.class){ //操作 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容