synchronized可以修飾**塊和方法,方法又分為靜態方法和普通方法,那麼一言概之:執行緒執行的時候當有synchronized時,他獲取的是類鎖或例項鎖然後才能執行。
**準備:
構造四類同步方法:
public synchronized void a() catch (interruptedexception e)
}public synchronized void b()
public static synchronized void c() catch (interruptedexception e)
}public static synchronized void d()
通過sleep來實現操作差
案例1:如果某一物件有多個同步方法,那麼其只能排隊訪問其對應的同步方法,因為此時是物件鎖
public static void testinstance1()
}, "t1").start();
new thread(new runnable()
}, "t2").start();
}
輸出:
a然後開始等待,方法a執行完之後輸出b
案例2:多個例項,訪問各自不同的同步方法時不受影響:
public static void testinstance2()
}, "t1").start();
new thread(new runnable()
}, "t2").start();
}
輸出:ab
方法a未執行結束
案例3:當同步訪問靜態方法和非靜態方法時不受影響,因為他們是兩個不同的鎖,靜態方法是類鎖而非靜態方法為例項鎖:
public static void testinstance3()
}, "t1").start();
new thread(new runnable()
}, "t2").start();
}
輸出:
astatic c
而a方法未執行結束,例項鎖未釋放
案例4:當併發訪問兩個非靜態方法是需要同步等待:
public static void testinstance4()
}, "t2").start();
new thread(new runnable()
}, "t1").start();
}
輸出:
static c
等c執行完成之後釋放了類鎖之後輸出static d
結論:
1.靜態方法鎖的是類,而非靜態方法鎖的是當前的例項,兩把不同的鎖互不影響;
2.類鎖只有一把,而不同的例項其鎖不同;
3.靜態**塊效果等同;
執行緒鎖 synchronized
使用 synchronized解決執行緒同步問題相比較nslock要簡單一些,日常開發中也更推薦使用此方法。首先選擇乙個物件作為同步物件 一般使用self 然後將 加鎖 爭奪資源的讀取 修改 放到 塊中。synchronized中的 執行時先檢查同步物件是否被另乙個執行緒占用,如果占用該執行緒就會處...
執行緒之 鎖 synchronized鎖
多執行緒中有寫程式是由一寫bug的,學習執行緒鎖,很經典的例子,買票案例 有a,b,c三個視窗,同時售賣100張票,最後可能會出現賣了重複的票,或者多賣了,賣超了等執行緒不安全問題 看乙個執行緒不安全的賣票 小明,小張,小王同時去買票,就會出現上面的執行緒不安全問題,因為,視窗1賣了1張票,而另外兩...
synchronized內建鎖詳解
synchronized內建鎖詳解 多執行緒訪問同一共享可變資源的情況下,會出現執行緒不安全問題,經典案例購買火車票 public class testthread2 public void getticket system.out.println thread.currentthread getn...