synchronized
public class sync
@override
public void run()
} public void pf(int i) catch (interruptedexception e)
system.err.println(i+":"+new date().gettime());
} public static void main(string args) throws interruptedexception
}
輸出結果為:
t-0:1-1540263348943
t-1:2-1540263348943
2:1540263350943
1:1540263352943
t-0:執行消耗4s t-1執行消耗2s,說明同時執行pf()。
修改pf()方法:
public void pf(int i) catch (interruptedexception e)
system.err.println(i);
} }
執行結果:
t-1:2-1540263491240
t-0:1-1540263491241
2:1540263493241
1:1540263497241
t-1:消耗 2s t-0消耗6s 說明t-1先占用pf()方法執行完之後才釋放的鎖,之後t-0才進到pf()方法
@override
public void run()
run方法修改。
執行結果:
t-0:1-1540263718637
t-1:2-1540263718637
2:1540263720638
1:1540263722638
t-0消耗4s t-1消耗2s,發現t-0並沒有對pf()方法進行上鎖。問題在於synchronized(this){}鎖的是這個類的例項物件。
public void pf(int i) catch (interruptedexception e)
system.err.println(i+":"+new date().gettime());
} }
修改pf()方法其他不變
執行結果:
t-0:1-1540264086174
t-1:2-1540264086174
1:1540264090175
2:1540264092175
t-0消耗4s t-1消耗6s,發現t-0對pf()方法加了鎖。run方法中還是sync sync = new sync();synchronized(sync.class){}鎖的是類物件。
執行緒的共享 synchronized
執行緒的共享 synchronized synchronized 修飾方法,或是作用於塊,但是無論如何,我們都應該視其為乙個禁入條件,也就是說,synchronized應該使用的場景是 當乙個方法有可能被並行執行時,而其內部有對資料進行增刪改的操作時,需要被保證其進入條件,此時可選擇使用,synch...
執行緒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就是同步監視器,上面 的含義是 執行緒開始執行同步 塊之前,必須先獲得對同步監視器的鎖定。任何時刻...