1. 程式人生 > 程式設計 >Java lock同步鎖使用例項解析

Java lock同步鎖使用例項解析

這篇文章主要介紹了Java lock同步鎖使用例項解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

  1)Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現,synchronized是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在程式碼執行時出現異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過程式碼實現的,要保證鎖定一定會被釋放,就必須將 unLock()放到finally{} 中;

  2)synchronized在發生異常時,會自動釋放執行緒佔有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

  3)Lock可以讓等待鎖的執行緒響應中斷,執行緒可以中斷去幹別的事務,而synchronized卻不行,使用synchronized時,等待的執行緒會一直等待下去,不能夠響應中斷;

  4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

  5)Lock可以提高多個執行緒進行讀操作的效率。

  在效能上來說,如果競爭資源不激烈,兩者的效能是差不多的,而當競爭資源非常激烈時(即有大量執行緒同時競爭),此時Lock的效能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。

package lock;

/*
方式三:
  Lock鎖
synchronized和lock的不同
1.sychronized在執行完相應程式碼塊以後屬於自動釋放同步監視器,lock需要手動啟動同步
建議優先使用lock->同步方法塊->同步方法(在方法體之外)

實現Runnable物件被三個執行緒呼叫,然後這個物件的run方法裡貢獻資源操作器被lock上鎖了

@author zsben
@create 2020-01-03 23:55
*/

import java.util.concurrent.locks.ReentrantLock;

class Window implements Runnable{

  private int ticket = 100;

  //1.例項化lock
  private ReentrantLock lock = new ReentrantLock(true);//fair=true:公平鎖,執行緒先來後到

  @Override
  public void run() {
    while(true){
      try{
        //2.呼叫lock方法
        lock.lock();

        if(ticket>0){

          try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }

          System.out.println(Thread.currentThread().getName()+": "+ticket);
          ticket--;
        }else break;
      }
      finally {
        //3.呼叫解鎖方法
        lock.unlock();
      }
    }
  }
}

public class LockTest {

  public static void main(String[] args) {
    Window w = new Window();

    Thread t1 = new Thread(w);
    Thread t2 = new Thread(w);
    Thread t3 = new Thread(w);

    t1.start();
    t2.start();
    t3.start();

  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。