欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 多線程Synchronized和Lock的區(qū)別

 更新時(shí)間:2021年01月04日 09:19:37   作者:zsq_fengchen  
這篇文章主要介紹了Java 多線程Synchronized和Lock的區(qū)別,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

引言

  在多線程中,為了使線程安全,我們經(jīng)常會(huì)使用synchronized和Lock進(jìn)行代碼同步和加鎖,但是具體兩者有什么區(qū)別,什么場(chǎng)景下適合用什么可能還不大清楚,主要的區(qū)別大致如下:

區(qū)別

    1、synchronized是java關(guān)鍵字,而Lock是java中的一個(gè)接口

    2、synchronized會(huì)自動(dòng)釋放鎖,而Lock必須手動(dòng)釋放鎖

    3、synchronized是不可中斷的,Lock可以中斷也可以不中斷

    4、通過(guò)Lock可以知道線程有沒(méi)有拿到鎖,而synchronized不能

    5、synchronized能鎖住方法和代碼塊,而Lock只能鎖住代碼塊

    6、Lock可以使用讀鎖提高多線程讀效率

    7、synchronized是非公平鎖,ReentranLock可以控制是否公平鎖

從Lock接口中我們可以看到主要有5個(gè)方法,這些方法的功能從注釋中可以看出:

lock():獲取鎖,如果鎖被暫用則一直等待
unlock():釋放鎖
tryLock(): 注意返回類型是boolean,如果獲取鎖的時(shí)候鎖被占用就返回false,否則返回true
tryLock(long time, TimeUnit unit):比起tryLock()就是給了一個(gè)時(shí)間期限,保證等待參數(shù)時(shí)間
lockInterruptibly():用該鎖的獲得方式,如果線程在獲取鎖的階段進(jìn)入了等待,那么可以中斷此線程,先去做別的事   通過(guò) 以上的解釋,大致可以解釋在上個(gè)部分中“鎖類型(lockInterruptibly())”,“鎖狀態(tài)(tryLock())”等問(wèn)題,還有就是前面子所獲取的過(guò)程我所寫(xiě)的“大致就是可以嘗試獲得鎖,線程可以不會(huì)一直等待”用了“可以”的原因。

lock():

public class LockTest {
  private Lock lock = new ReentrantLock();

  private void method(Thread thread) {
    lock.lock();
    try {
      System.out.println(thread.getName() + " has gotten the lock!");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      System.out.println(thread.getName() + " has unlocked the lock!");
      lock.unlock();
    }
  }

  public static void main(String[] args) {
    final LockTest test = new LockTest();

    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        test.method(Thread.currentThread());
      }
    }, "t1");
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        test.method(Thread.currentThread());
      }
    }, "t2");
    t1.start();
    t2.start();
  }

}

運(yùn)行結(jié)果:

t1 has gotten the lock!
t1 has unlocked the lock!
t2 has gotten the lock!
t2 has unlocked the lock!

tryLock():

public class LockTest {
  private Lock lock = new ReentrantLock();

  private void method(Thread thread) {

    if (lock.tryLock()) {
      lock.lock();
      try {
        System.out.println(thread.getName() + " has gotten the lock!");
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        System.out.println(thread.getName() + " has unlocked the lock!");
        lock.unlock();
      }
    } else {
      System.out.println("I'm "+thread.getName()+". Someone has gotten the lock!");
    }
  }

  public static void main(String[] args) {
    LockTest test = new LockTest();

    Thread t1 = new Thread(() -> test.method(Thread.currentThread()), "t1");
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        test.method(Thread.currentThread());
      }
    }, "t2");
    t1.start();
    t2.start();
  }
}

運(yùn)行結(jié)果:

t1 has gotten the lock!
t1 has unlocked the lock!
I'm t2. Someone has gotten the lock!

看到這里相信大家也都會(huì)使用如何使用Lock了吧,關(guān)于tryLock(long time, TimeUnit unit)和lockInterruptibly()不再贅述。前者主要存在一個(gè)等待時(shí)間,在測(cè)試代碼中寫(xiě)入一個(gè)等待時(shí)間,后者主要是等待中斷,會(huì)拋出一個(gè)中斷異常,常用度不高,喜歡探究可以自己深入研究。

以上就是Java 多線程Synchronized和Lock的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Java 多線程Synchronized和Lock的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)掃雷游戲入門(mén)程序

    java實(shí)現(xiàn)掃雷游戲入門(mén)程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)掃雷游戲入門(mén)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java下界通配符(? super Type)的使用

    Java下界通配符(? super Type)的使用

    在Java中,? super Type是一個(gè)下界通配符,本文主要介紹了Java下界通配符(? super Type)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot實(shí)現(xiàn)各種參數(shù)校驗(yàn)總結(jié)(建議收藏!)

    SpringBoot實(shí)現(xiàn)各種參數(shù)校驗(yàn)總結(jié)(建議收藏!)

    本文深入解析了Spring?Validation的使用方法、實(shí)現(xiàn)原理及最佳實(shí)踐,詳細(xì)介紹了各種參數(shù)校驗(yàn)場(chǎng)景,如requestBody和requestParam/PathVariable的使用,并探討了分組校驗(yàn)、嵌套校驗(yàn)和自定義校驗(yàn)的高級(jí)應(yīng)用,需要的朋友可以參考下
    2024-09-09
  • Java中的異步回調(diào)問(wèn)題

    Java中的異步回調(diào)問(wèn)題

    這篇文章主要介紹了Java中的異步回調(diào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí)

    這篇文章主要為大家介紹了Spring?Boot源碼實(shí)現(xiàn)StopWatch優(yōu)雅統(tǒng)計(jì)耗時(shí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Eclipse Validating緩慢的優(yōu)化

    詳解Eclipse Validating緩慢的優(yōu)化

    這篇文章主要介紹了詳解Eclipse Validating緩慢的優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java8 Lambda表達(dá)式模板方法實(shí)現(xiàn)解析

    Java8 Lambda表達(dá)式模板方法實(shí)現(xiàn)解析

    這篇文章主要介紹了Java8 Lambda表達(dá)式模板方法實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringMVC 限流的示例代碼

    SpringMVC 限流的示例代碼

    這篇文章主要介紹了SpringMVC 限流的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳解SpringBoot如何使用JWT實(shí)現(xiàn)身份認(rèn)證和授權(quán)

    詳解SpringBoot如何使用JWT實(shí)現(xiàn)身份認(rèn)證和授權(quán)

    JSON?Web?Token(JWT)是一種用于在網(wǎng)絡(luò)應(yīng)用之間安全傳遞信息的開(kāi)放標(biāo)準(zhǔn),本文主要為大家介紹了如何在Spring?Boot中使用JWT實(shí)現(xiàn)身份認(rèn)證和授權(quán),需要的可以了解下
    2023-10-10
  • 基于Failed?to?load?ApplicationContext異常的解決思路

    基于Failed?to?load?ApplicationContext異常的解決思路

    這篇文章主要介紹了基于Failed?to?load?ApplicationContext異常的解決思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論