多執行緒靜態方法同步
public class StaticSynTest extends Thread {
StaticMothod sm;
public StaticSynTest(StaticMothod sm){
this.sm = sm;
}
public static void main(String[] args) {
StaticMothod sm1 = new StaticMothod();
StaticSynTest sst1 = new StaticSynTest(sm1);
StaticSynTest sst2 = new StaticSynTest(sm1);
StaticSynTest sst3 = new StaticSynTest(sm1);
sst1.setName("sst1");
sst2.setName("sst2");
sst3.setName("sst3");
sst1.start();
sst2.start();
sst3.start();
}
public void run(){
this.sm.b(Thread.currentThread().getName());
this.sm.b1(Thread.currentThread().getName());
StaticMothod.a(Thread.currentThread().getName());
StaticMothod.a1(Thread.currentThread().getName());
}
}
class StaticMothod{
public synchronized static void a(String name){
System.out.println(name+":a in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":a out");
}
public synchronized static void a1(String name){
System.out.println(name+":a1 in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":a1 out");
}
public synchronized void b(String name){
System.out.println(name+":b in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":b out");
}
public synchronized void b1(String name){
System.out.println(name+":b1 in");
try{
Thread.sleep(2000);
System.out.println("");
}
catch(InterruptedException e){
}
System.out.println(name+":b1 out");
}
}
輸出結果為:
sst1:b in
sst1:b out
sst2:b in
sst2:b out
sst3:b in
sst3:b out
sst1:b1 in
sst1:b1 out
sst1:a in
sst2:b1 in
sst1:a out
sst1:a1 in
sst2:b1 out
sst3:b1 in
sst3:b1 out
sst1:a1 out
sst2:a in
sst2:a out
sst3:a in
sst3:a out
sst2:a1 in
sst2:a1 out
sst3:a1 in
sst3:a1 out
結論:
1、當前執行緒呼叫類的同步靜態方法時,其它執行緒可以進入該類例項的其它非靜態方法,不能進入類的其它靜態方法。
2、同理,當前進入同步的例項方法時,其它執行緒可以進入該類的靜態方法,但是不能進入該類的其它非靜態方法。
原因:靜態方法同步是獲取StaticSynTest.class鎖,而例項方法獲取的是該“例項物件”的鎖,它們互不干涉。
相關文章
- 多執行緒和多執行緒同步執行緒
- 執行緒同步方法執行緒
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 非同步VS多執行緒非同步執行緒
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 多執行緒(2)-執行緒同步條件變數執行緒變數
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- C#多執行緒開發-執行緒同步 02C#執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- 多執行緒(五)---執行緒的Yield方法執行緒
- Dart 非同步與多執行緒Dart非同步執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- 多執行緒的三種實現方式及靜態代理模式執行緒模式
- 多執行緒的同步和非同步學習執行緒非同步
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- 靜態變數在多執行緒環境下的初始化是執行緒安全的嗎?變數執行緒
- Java執行緒狀態及同步鎖Java執行緒
- 多執行緒與併發----Semaphere同步執行緒
- 多執行緒的執行緒狀態及相關操作執行緒
- 最全java多執行緒總結2--如何進行執行緒同步Java執行緒
- Java多執行緒程式設計筆記2:synchronized同步方法Java執行緒程式設計筆記synchronized
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- 多執行緒併發:以AQS中acquire()方法為例來分析多執行緒間的同步與協作執行緒AQSUI
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- 多執行緒核心技術(1)-執行緒的基本方法執行緒
- Java多執行緒同步工具類之SemaphoreJava執行緒
- Java多執行緒同步工具類之CyclicBarrierJava執行緒
- Java多執行緒同步工具類之CountDownLatchJava執行緒CountDownLatch
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒