synchronized 与 ReentrantLock
2019獨角獸企業重金招聘Python工程師標準>>>
synchronized 作用于非靜態方法
public class Sync implements Runnable{private static int count;public Sync() {count = 0;}public synchronized void add() {for (int i = 0; i < 5; i++) {try {System.out.println(Thread.currentThread().getName() + " --- " + (++count));Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}@Overridepublic void run() {add();} }test1? :
public void test() {Sync sync1 = new Sync();Sync sync2 = new Sync();Thread t1 = new Thread(sync1);t1.start();Thread t2 = new Thread(sync2);t2.start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}由于兩個線程傳入了兩個不同的 Sync 對象,相當于兩把鎖。運行結果是兩個線程互相切換的;如果傳入的是同一個對象,線程之間不會亂序,因為是同一把鎖,會互斥等待。
以下兩種寫法等價: public synchronized void method( ) {//todo}public void method( ) {synchronized (this){ //todo} }以下兩種寫法也是等價的: public static synchronized void method( ) {//todo}public void method( ) {synchronized (xxx.class){ //todo} }如果 Sync 類的 add 方法上面加 static 關鍵字,同樣運行test1 的代碼結果不會亂序。因為這時 Sync 類的所有對象共享一把鎖。
總結:
無論synchronized關鍵字加在方法上還是對象上,如果它作用的對象是非靜態的,則它取得的鎖是對象;
如果synchronized作用的對象是一個靜態方法或一個類,則它取得的鎖是對類,該類所有的對象同一把鎖。
如果加的是對象鎖,每個對象只有一個鎖(lock)與之相關聯,誰拿到這個鎖誰就可以運行它所控制的那段代碼
????????除了使用 synchronized 之外, 我們還可以使用 ReentrantLock 來實現同步。 ReentrantLock 與 synchronized 相似,都具備線程重入特性,只是寫法上有點區別。ReentrantLock 需要顯示的聲明出來,并配合(lock( ), unlock( ), try/finally 語句塊來完成)。ReentrantLock 增加了一些高級功能:
轉載于:https://my.oschina.net/freedemon/blog/1810155
總結
以上是生活随笔為你收集整理的synchronized 与 ReentrantLock的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error: style attribu
- 下一篇: 5月28日任务 Apache和PHP结合