一個例項中,多個synchronized方法的呼叫
- public class ThreadA extends Thread {
- private MyObject object;
- public ThreadA(MyObject object){
- this.object = object;
- }
- public void run(){
- super.run();
- object.menthodA();
- }
- }
- public class ThreadB extends Thread {
- private MyObject object;
- public ThreadB(MyObject object){
- this.object = object;
- }
- public void run(){
- super.run();
- object.methodB();
- }
- }
- public class Run {
- public static void main(String args[]){
- MyObject myObject = new MyObject();
- ThreadA threadA = new ThreadA(myObject);
- threadA.setName("A");
- threadA.start();
- ThreadB threadB = new ThreadB(myObject);
- threadB.setName("B");
- threadB.start();
- }
- }
程式碼如上所示,MyObject類有兩個方法,分別建立兩個執行緒呼叫方法A和方法B:
1、方法A和方法B都沒有加synchronized關鍵字時,呼叫方法A的時候可進入方法B;
2、方法A加synchronized關鍵字而方法B沒有加時,呼叫方法A的時候可以進入方法B;
3、方法A和方法B都加了synchronized關鍵字時,呼叫方法A之後,必須等A執行完成才能進入方法B;
4、方法A和方法B都加了synchronized關鍵字時,且方法A加了wait()方法時,呼叫方法A的時候可以進入方法B;
5、方法A加了synchronized關鍵字,而方法B為static靜態方法時,呼叫方法A的時候可進入方法B;
6、方法A和方法B都是static靜態方法,且都加了synchronized關鍵字,則呼叫方法A之後,需要等A執行完成才能進入方法B;
7、方法A和方法B都是static靜態方法,且都加了synchronized關鍵字,建立不同的執行緒分別呼叫A和B,需要等A執行完成才能執行B(因為static方法是單例項的,A持有的是Class鎖,Class鎖可以對類的所有物件例項起作用)
總結:
同一個object中多個方法都加了synchronized關鍵字的時候,其中呼叫任意方法之後需等該方法執行完成才能呼叫其他方法,即同步的,阻塞的;
此結論同樣適用於對於object中使用synchronized(this)同步程式碼塊的場景;
synchronized鎖定的都是當前物件!
轉載自:https://blog.csdn.net/aiyawalie/article/details/53261823
相關文章
- oracle一個listener偵聽多個例項的配置Oracle
- Linux中執行多個MySQL例項LinuxMySql
- docker redis 多個例項DockerRedis
- javascript將字串中的多個空格替換為一個空格的正則例項JavaScript字串
- 在Windows中執行多個MySQL例項WindowsMySql
- 分享一個Laravel中的管道的使用例項Laravel
- 在 React 中管理同一元件的多個例項中的狀態React元件
- 如何區分例項化網格中的每個例項
- frida 建立一個ArrayList例項
- 當多個UITextView使用同一個UIView例項出現凍屏現象UITextView
- 無法訪問的成員例項化一個方法在角的另一種方法
- CompletableFuture中實現多個 REST 呼叫REST
- python呼叫方法必須例項化麼Python
- 多個資料庫是否可以共有一個Oracle 11g RAC例項KG資料庫Oracle
- SQL Server誤區 一個例項多個映象和日誌傳送延遲SQLServer
- laravel 在一個控制器的方法中呼叫其他控制器中的方法Laravel
- 在例項中呼叫 Invoke 型別的類型別
- 構建一個 @synchronizedsynchronized
- 一個馬爾科夫鏈例項馬爾科夫
- 3.1.4 準備啟動一個例項
- 一個pyspark 開發練習例項Spark
- 分享一個SQLite 效能優化例項SQLite優化
- Qt中多個原始檔中呼叫同一引數或物件等QT物件
- python例項方法中self的作用Python
- 無線AP組網例項:多個無線AP間無線組網的方法教程
- mybatis 同一張表的資料被對映到 一個結果物件例項 的 多個屬性物件 上MyBatis物件
- MySQL 拷貝一個InnoDB分割槽表到另一個例項MySql
- python使用ctypes呼叫擴充套件模組的例項方法Python套件
- Tee命令的幾個使用例項
- php例項化物件的例項方法PHP物件
- Python中dict支援多個key的方法Python
- 不使用synchronized和lock,如何實現一個執行緒安全的單例?synchronized執行緒單例
- 多個excel檔案合併到一個檔案中的多個sheet表中Excel
- 如何用python判斷列表中是否包含多個字串中的一個或多個?Python字串
- 3個例項介紹shell指令碼中幾個特殊引數的用法指令碼
- vue在一個函式中呼叫另外一個函式Vue函式
- ArcGIS開發(二)——一個基本視窗的例項化
- frameset巢狀多個html,在一個html的js中呼叫另一個html的變數和函式(導航欄更新個人圖示)巢狀HTMLJS變數函式