一個例項中,多個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多個例項啟動方法Oracle
- oracle一個例項配置多個listener或多個埠Oracle
- oracle一個別例項配置多個listener或多個埠Oracle
- oracle一個listener偵聽多個例項的配置Oracle
- MySQL在Windows上安裝多個例項的方法MySqlWindows
- docker redis 多個例項DockerRedis
- javascript將字串中的多個空格替換為一個空格的正則例項JavaScript字串
- Linux中執行多個MySQL例項LinuxMySql
- 在Windows中執行多個MySQL例項WindowsMySql
- 多個mapreduce連線例項
- 分享一個Laravel中的管道的使用例項Laravel
- 在 React 中管理同一元件的多個例項中的狀態React元件
- oracle 多個例項監聽不到Oracle
- oracle:一臺主機多個例項,sqlplus 預設連線到哪個例項的問題OracleSQL
- 如何為一個例項動態替換方法
- on()方法一次註冊多個事件處理函式程式碼例項事件函式
- 一臺MySQL資料庫啟動多個例項MySql資料庫
- 單例模式 - 只有一個例項單例模式
- java多型-優化上個例項Java多型優化
- oracle 多個例項安裝監聽Oracle
- RAC環境一個例項何時會歸檔另一個例項的日誌
- phpcmsV9呼叫多個模型中的最新內容的解決方法PHP模型
- mysql搭建多個例項(mysqld_multi的使用)MySql
- laravel 在一個控制器的方法中呼叫其他控制器中的方法Laravel
- 第一個jsp例項JS
- 當多個UITextView使用同一個UIView例項出現凍屏現象UITextView
- 構建一個 @synchronizedsynchronized
- dddsample一個可執行的例項
- CompletableFuture中實現多個 REST 呼叫REST
- Linux中的15個‘echo’ 命令例項Linux
- mysqld_multi安裝多個mysql例項MySql
- mysqld_multi啟動多個mysql例項MySql
- 連線RAC資料庫中單個例項(一)資料庫
- 關於packages中多個同名程式(procedure)的呼叫Package
- Struts2中一個簡單的入門例項
- SQL Server誤區 一個例項多個映象和日誌傳送延遲SQLServer
- 多個資料庫是否可以共有一個Oracle 11g RAC例項KG資料庫Oracle
- JDBC連線自定義sqlserver資料庫例項名(多個例項)JDBCSQLServer資料庫