程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻Synchronized和java.util.concurrent.locks.Lock的差別詳解

深刻Synchronized和java.util.concurrent.locks.Lock的差別詳解

編輯:關於JAVA

深刻Synchronized和java.util.concurrent.locks.Lock的差別詳解。本站提示廣大學習愛好者:(深刻Synchronized和java.util.concurrent.locks.Lock的差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻Synchronized和java.util.concurrent.locks.Lock的差別詳解正文


重要雷同點:Lock能完成Synchronized所完成的一切功效。
重要分歧點:Lock有比Synchronized更准確的線程予以和更好的機能。Synchronized會主動釋放鎖,然則Lock必定請求法式員手工釋放,而且必需在finally從句中釋放。
synchronized 潤飾辦法時 表現統一個對象在分歧的線程中 表示為同隊伍列
假如實例化分歧的對象 那末synchronized就不會湧現同步後果了。
1.對象的鎖
一切對象都主動含有單一的鎖。
JVM擔任跟蹤對象被加鎖的次數。假如一個對象被解鎖,其計數變成0。在義務(線程)第一次給對象加鎖的時刻,計數變成1。每當這個雷同的義務(線程)在此對象上取得鎖時,計數會遞增。
只要起首取得鎖的義務(線程)能力持續獲得該對象上的多個鎖。
每當義務分開一個synchronized辦法,計數遞加,當計數為0的時刻,鎖被完整釋放,此時其余義務便可以應用此資本。
2.synchronized同步塊
2.1同步到單一對象鎖
當應用同步塊時,假如辦法下的同步塊都同步到一個對象上的鎖,則一切的義務(線程)只能互斥的進入這些同步塊。
Resource1.java演示了三個線程(包含main線程)試圖進入某個類的三個分歧的辦法的同步塊中,固然這些同步塊處在分歧的辦法中,但因為是同步到統一個對象(以後對象 synchronized (this)),所以對它們的辦法仍然是互斥的。
好比

Class Test
{
    public static User user=null;
      Public synchronized void add(User u)
{
     user=u;
     Dao.save(user)
}
}

假如在線程1中

Test test=new Test();
User u=new User();
u.setUserName(“liaomin”);
u.setUserPassword(“liaomin”);
Test.add(u);

假如在線程2中

Test tes1t=new Test();
User u1=new User();
u1.setUserName(“huqun”);
u1.setUserPassword(“huqun”);
Tes1t.add(u1);

那末 如今線程1 和線程2同時啟動 假如對象new的不是統一個Test
那末湧現線程穿插的話 那末拔出數據庫中的數據就是雷同的
由於你的user變量時靜態的   你給他賦值第一次 假設還沒有save的時刻
別的一個線程轉變了user的值 那末第一個線程拔出時也就是第二次付與的值了

所以要完成同步 那末可以改辦法為靜態的就可以到達同步的後果了
修正以下

Public static synchronized void add(User u)
{
     user=u;
     Dao.save(user)
}

修正為static的辦法是存在於堆中
是全局辦法 針關於一切實例化與未 實例化的對象只存在一個 所以會湧現同隊伍列
固然不消static 也能夠 那就用lock

Class Test
{
public static User user=null;
Lock lock=new ReentrantLock();

      Public void add(User u)
{
lock.lock();
     user=u;
     Dao.save(user);
lock.unlock();
}
}

如許不管你new若干個對象都邑是線程同步的
相當於

Public static synchronized void add(User u)
{
     user=u;
     Dao.save(user)
}

同時 lock機能上高於synchronized
只是lock須要手動封閉
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved