- 實(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){ //操作 }