Java?同步關(guān)鍵字(synchronized)
Java中的同步塊用synchronized標記古涧。同步塊在Java中是同步在某個對象上馍乙。所有同步在一個對象上的同步塊在同時只能被一個線程進入并執(zhí)行操作。所有其他等待進入該同步塊的線程將被阻塞炎辨,直到執(zhí)行該同步塊中的線程退出捕透。
有四種不同的同步塊:
實例方法
靜態(tài)方法
實例方法中的同步塊
靜態(tài)方法中的同步塊
同步目的就是保證寫資源的唯一性;那么當(dāng)一個資源需要的同步的時候用同步代碼塊碴萧,當(dāng)一個方法中很多資源需要同步的時候乙嘀,用同步方法更方便。我們也不關(guān)心這個方法是不是靜態(tài)的破喻,只關(guān)心它有沒有操作共享資源虎谢。
實例:
public class Counter{
? ? long count = 0;
? ? public synchronized void add(long value){
? ? ? this.count += value;
? ? }
? }
? public class CounterThread extends Thread{
? ? protected Counter counter = null;
? ? public CounterThread(Counter counter){
? ? ? ? this.counter = counter;
? ? }
? ? public void run() {
for(int i=0; i<10; i++){
? ? ? ? ? counter.add(i);
? ? ? ? }
? ? }
? }
? public class Example {
? ? public static void main(String[] args){
? ? ? Counter counter = new Counter();? ?
//兩個thread對同一個實例進行操作,每次 只有一個線程可以 執(zhí)行同步方法
//如果new兩個實例兩個線程分別引用的是不同的實例低缩,則執(zhí)行同步方法不會有任何一個線程會阻塞
//如果同步方法是靜態(tài)方法或靜態(tài)代碼塊嘉冒,兩個線程引用的是類對象,整個jvm中只有一個對象咆繁, 每次?只有一個線程可以?執(zhí)行同步方法
? ? ? Thread? threadA = new CounterThread(counter);
? ? ? Thread? threadB = new CounterThread(counter);
? ? ? threadA.start();
? ? ? threadB.start();
? ? }
? }