多執行緒 synchronized同步方法

2021-08-16 02:21:47 字數 2312 閱讀 8412

1、方法中的變數不存在非執行緒安全問題

hasselfprivatenum	publicclasshasselfprivatenumelse

system.out.println(username+"num="+num);

}catch(interruptedexceptione)

} }threada publicclassthreadaextendsthread

@override

publicvoidrun()

}threadb publicclassthreadbextendsthread

@override

publicvoidrun()

}run publicclassrun

}

2、多個執行緒訪問物件變數,出現非執行緒安全問題

改動privateintnum=

0放在類中,而不是方法中

結果值被覆蓋(出現執行緒安全問題)

解決addi

方法上加

synchronized

3、建立多個物件會產生多個鎖改動在

run類中建立多個

hasselfprivatenum例項物件即可

4、a執行緒先持有

object

物件的lock鎖,b

執行緒可以以非同步的方式呼叫

object

物件中的非

synchronized

型別的方法

a執行緒先持有

object

物件的lock鎖,b

執行緒如果在這時呼叫

object

物件中的

synchronized

型別的方法則需要等待,也就是同步

myobject	publicclassmyobjectcatch(interruptedexceptione)	}	

synchronizedpublicvoidmethodb()catch(interruptedexceptione)

} }threada publicclassthreadaextendsthread

@override

publicvoidrun()

}threadb publicclassthreadbextendsthread

@override

publicvoidrun()

}run publicclassrun

}

5、髒讀

a執行緒呼叫

anyobject

物件加入

synchronized

關鍵字的

x方法時,其他執行緒必須等

a執行緒執行完畢才可以呼叫

x方法,但

b執行緒可以隨意呼叫其他非

synchronized

同步方法

a執行緒呼叫

anyobject

物件加入

synchronized

關鍵字的

x方法時,

b執行緒如果呼叫

synchronized

關鍵字的非

x方法時,必須等

a執行緒將

x方法執行完才可以呼叫

6、synchronized

鎖重入乙個

synchronized

方法的內部呼叫本類的其他

synchronized

方法時,是可以得到鎖的

當存在父子類繼承關係時,子類完全可以通過「可重入鎖」呼叫父類的同步方法

7、a執行緒出現異常並釋放鎖,

b執行緒進入方法正常列印,也就是說出現異常的鎖被自動釋放了

service	publicclassservice

} }else

} }threada publicclassthreadaextendsthread

@override

publicvoidrun()

}threadb publicclassthreadbextendsthread

@override

publicvoidrun()

}run publicclassruncatch(interruptedexceptione)

} }

8、同步不能繼承,父類的方法中有

synchronized

關鍵字,執行子類的方法時,必須在子類的方法中新增

synchronized

關鍵字,才可以實現同步執行

多執行緒之Synchronized

作用 阻塞執行緒,保證同一時刻最多只有1個執行緒執行。原理 依賴 jvm 實現同步,底層通過乙個監視器物件 monitor 完成,wait notify 等方法也依賴於 monitor 物件。使用 synchronized 修飾 塊 類的例項方法 靜態方法 synchronized同步鎖的型別 物件...

多執行緒 執行緒互斥之synchronized 詳解

定義 執行緒互斥是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。我們都知道保證執行緒完整執行。則需要對其加鎖。使用synchronized關鍵字。在這裡鎖的物件理論上可以為任何物件。塊同步 public void output ...

Java多執行緒之synchronized關鍵字

package thread public class test class ticket implements runnable try catch interruptedexception e 結果如圖 從結果可以看到能夠實現多執行緒的買票 package thread public class...