執行緒 三 synchronized

2021-10-23 13:45:50 字數 2233 閱讀 4249

概念:

synchronized 用來做執行緒同步;

物件鎖 與 類鎖:

synchronized加到非靜態方法或**塊時,給物件加鎖,多個執行緒執行該物件的同步方法會互斥

多個物件執行物件中的同步方法不會互斥。

synchronized加到靜態方法或類時,鎖的是這個類,多個執行緒多個物件執行物件中的同步方法時都會互斥

對以上說明通過**來演示以便方便理解。

1.驗證修飾非靜態方法

public class synchronizedtest 

}).start();

new thread(new runnable()

}).start();

}public synchronized void test1() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + " : " + i);}}

}

public class synchronizedtest 

}).start();

new thread(new runnable()

}).start();

}public synchronized void test1() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + " : " + i);}}

public synchronized void test2() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + " : " + i);}}

}}

執行結果相同如下:

表名:兩個執行緒執行的同一物件中的同步方法(同步**塊),會互斥,兩個執行緒執行的同一物件中兩個不同的同步方法(同步**塊),還是會互斥

public class synchronizedtest 

}).start();

new thread(new runnable()

}).start();

}public synchronized void test1() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + " : " + i);}}

}

執行結果相同如下:

表名:兩個執行緒分別執行不同物件中的同步方法(同步**塊)不會互斥。  

總結:說明synchronized修飾非靜態方法(**塊)時,是給物件加鎖。

2.驗證修飾靜態方法

public class synchronizedtest 

}).start();

new thread(new runnable()

}).start();

}public static synchronized void test1() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + " : " + i);}}

}

執行結果如下:

表名:兩個執行緒分別執行不同物件中的同步方法(同步**塊)仍然會互斥。

總結:說明synchronized修飾靜態方法(**塊)時,鎖的是這個類。既然修飾靜態方法時鎖的是類,多個執行緒執行類中同步方法時會互斥,那麼直接將synchronized加到類上,鎖這個類肯定同修飾靜態方法效果一樣,都互斥。

執行緒synchronized 例子

public class foo public int fix int y return x public class myrunnable implements runnable catch interruptedexception e system.out.println thread.curr...

執行緒同步synchronized

synchronized只是保證在同乙個時刻,其他執行緒不能訪問鎖定的資源,但是其他方法或者是變數不能鎖定控制的 synchronized obj 上面語法格式中synchronized後括號裡的obj就是同步監視器,上面 的含義是 執行緒開始執行同步 塊之前,必須先獲得對同步監視器的鎖定。任何時刻...

執行緒鎖 synchronized

使用 synchronized解決執行緒同步問題相比較nslock要簡單一些,日常開發中也更推薦使用此方法。首先選擇乙個物件作為同步物件 一般使用self 然後將 加鎖 爭奪資源的讀取 修改 放到 塊中。synchronized中的 執行時先檢查同步物件是否被另乙個執行緒占用,如果占用該執行緒就會處...