最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java并發(fā)之Lock接口的深入講解

 更新時(shí)間:2021年08月04日 10:36:07   作者:毅航同學(xué)  
從Java 5之后,在java.util.concurrent.locks包下提供了另外一種方式來實(shí)現(xiàn)同步訪問.那就是Lock,這篇文章主要給大家介紹了關(guān)于java并發(fā)之Lock接口的相關(guān)資料,需要的朋友可以參考下

Juc中各種各樣鎖信息

在java的juc包為我們提供了各種各樣的鎖信息。如果細(xì)心來看其大部分都會(huì)實(shí)現(xiàn)一個(gè)名為L(zhǎng)OCK的接口信息本文皆在幫你回顧Lock信息;

通過本文你將了解到如下內(nèi)容:

1.Lock和synchronized的對(duì)比

2.Lock中常見API的總結(jié)

synchronized面臨缺點(diǎn)

鎖的出現(xiàn)主要是為了保證在并發(fā)訪問共享資源時(shí)不出現(xiàn)錯(cuò)。 在java中如果不考慮性能損耗問題,那么對(duì)共享的資源信息加上synchrionzed關(guān)鍵字基本就可以解決大多數(shù)并發(fā)帶來的問題,但是也隨之帶來靈活性和效率上的問題:

 效率方面:

1.     此種情況下鎖的釋放情況較少,很容易到導(dǎo)致一直獨(dú)占資源而導(dǎo)致性能的下降。

2.     當(dāng)我們?cè)噲D獲取鎖時(shí)不能直接指定具體條件

3.    不能中斷正在試圖獲得鎖的線程

靈活性:

 1.  當(dāng)獲得鎖資源后,無法得知是否獲得鎖信息

 2.  僅當(dāng)程序異常或順利執(zhí)行完時(shí)才會(huì)釋放鎖信息,缺乏主動(dòng)釋放鎖的時(shí)機(jī)。

不適用的場(chǎng)景

場(chǎng)景1 :

當(dāng)我們使用synchronized時(shí),假如某線程獲取到鎖之后由于要等待IO或者其他原因進(jìn)入阻塞狀態(tài),同時(shí)未釋放鎖信息,那么此時(shí)其他線程就只能一直等待。所以此時(shí)就需要synchronized有一種機(jī)制:避免等待的線程一直無期限地等待下去。
場(chǎng)景2 :

在讀文件信息形式,不同線程的寫操作是相互沖突的。但是讀操作并不會(huì)導(dǎo)致沖突。如果我們不加考慮的為資源信息加上synchronized關(guān)鍵字,那么當(dāng)多線程同時(shí)操作時(shí),只有一個(gè)線程可以獲取到資源,其他未獲得鎖信息的線程只能進(jìn)入等待狀態(tài),從而導(dǎo)致讀寫效率不高。

Lock接口

Lock接口是對(duì)關(guān)鍵字synchronized的補(bǔ)充和擴(kuò)展,它允許我們可以在線程安全的情況下更加靈活的操作共享資源信息。

常見用法:

Lock最佳實(shí)踐:

1.lock(),unlock()

一般來說,使用Lock必須在try…catch…塊中進(jìn)行,并且將釋放鎖的操作放在finally塊中進(jìn)行。這是因?yàn)閘ock并不會(huì)像synchronized那樣在異常時(shí)釋放鎖,所以必須保證有手動(dòng)釋放的過程,這樣才能保證其它線程有獲取鎖的機(jī)會(huì)。

//  加鎖
lock.lock();
try{
    //處理任務(wù)
}catch(Exception ex){
​
}finally{
    //釋放鎖  (鎖的釋放一般放入到finally塊中進(jìn)行,這樣保證了總會(huì)對(duì)鎖信息進(jìn)行釋放)
    lock.unlock();   
}

2. tryLock() & tryLock(long time, TimeUnit unit)

tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true;如果獲取失?。存i已被其他線程獲取),則返回false,也就是說,這個(gè)方法無論如何都會(huì)立即返回即使其無法獲取到鎖也不會(huì)一致等待。

tryLock(long time, TimeUnit unit)方法和tryLock()方法是類似的,只不過區(qū)別在于這個(gè)方法在拿不到鎖時(shí)會(huì)等待一定的時(shí)間,在時(shí)間期限之內(nèi)如果還拿不到鎖,就返回false

如果一開始拿到鎖或者在等待期間內(nèi)拿到了鎖,則返回true。一般情況下,通過tryLock來獲取鎖時(shí)是這樣使用的:

Lock lock = ...;
if(lock.tryLock()) {
     try{
         //處理任務(wù)
     }catch(Exception ex){
​
     }finally{
         lock.unlock();   //釋放鎖
     } 
}else {
    //如果不能獲取鎖,則直接做其他事情
}

3. lockInterruptibly()  

lockInterruptibly()方法比較特殊,當(dāng)通過這個(gè)方法去獲取鎖時(shí),如果線程 正在等待獲取鎖,則這個(gè)線程能夠 響應(yīng)中斷,即中斷線程的等待狀態(tài)。

例如,當(dāng)兩個(gè)線程同時(shí)通過lock.lockInterruptibly()想獲取某個(gè)鎖時(shí),假若此時(shí)線程A獲取到了鎖,而線程B只有在等待,那么對(duì)線程B調(diào)用threadB.interrupt()方法能夠中斷線程B的等待過程。

public void method() throws InterruptedException {
    lock.lockInterruptibly();
    try {  
     //.....
    }
    finally {
        lock.unlock();
    }  
}

當(dāng)一個(gè)線程獲取了鎖之后,是不會(huì)被interrupt()方法中斷的。因?yàn)閕nterrupt()方法只能中斷阻塞過程中的線程而不能中斷正在運(yùn)行過程中的線程。而在 synchronized 中,當(dāng)一個(gè)線程處于等待某個(gè)鎖的狀態(tài),是無法被中斷的,只有一直等待下去,這也就是我們需要手動(dòng)釋放鎖的原因。

給出如下的例子來進(jìn)行驗(yàn)證:創(chuàng)建兩個(gè)線程來共同爭(zhēng)搶lock鎖信息

public class LockInterruptibly implements Runnable {
​
    private Lock lock = new ReentrantLock();
public static void main(String[] args) {
    LockInterruptibly lockInterruptibly = new LockInterruptibly();
    Thread thread0 = new Thread(lockInterruptibly);
    Thread thread1 = new Thread(lockInterruptibly);
    thread0.start();
​
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    thread1.start();
    thread1.interrupt();
}
   // 任務(wù)執(zhí)行邏輯
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "嘗試獲取鎖");
        try {
            lock.lockInterruptibly();
            try {
                System.out.println(Thread.currentThread().getName() + "獲取到了鎖");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + "睡眠期間被中斷了");
            } finally {
                lock.unlock();
                System.out.println(Thread.currentThread().getName() + "釋放了鎖");
            }
        } catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName() + "獲得鎖期間被中斷了");
        }
    }
}
​

執(zhí)行結(jié)果:

Thread-0嘗試獲取鎖
Thread-0獲取到了鎖
Thread-1嘗試獲取鎖
Thread-1獲得鎖期間被中斷了
Thread-0釋放了鎖

通過結(jié)果信息我們可以看出,lockInterruptibly()僅能中斷正在等待的線程信息,而無法中斷正在運(yùn)行的線程。

對(duì)比 Lock和tryLock的區(qū)別

lock和tryLock都可以獲取到鎖信息,但兩者之間還是存在些差異的。 具體如下:

1: lock拿不到鎖會(huì)一直等待。tryLock是去嘗試,拿不到就返回false,拿到返回true。

2: tryLock是可以被打斷的,被中斷的,lock是不可以。

// 實(shí)例代碼 
public class LockDemo  implements Runnable{
  static Lock lock1 = new ReentrantLock();
    @Override
    public void run() {
        // 分別演示 lock,trylock區(qū)別
        // lock1.lock();
        lock1.tryLock();
        System.out.println("線程 " + Thread.currentThread().getName() + " 獲取到鎖信息 ");
    }
    
    
    public static void main(String[] args) throws InterruptedException {
        LockDemo r1 = new LockDemo();
        LockDemo r2 = new LockDemo();
        r1.flag = true;
        r2.flag = false;
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);
​
        t1.start();
        Thread.sleep(1000);
        // 中斷
        t2.start();
        t2.interrupt();
    }
}
​

結(jié)果信息:

當(dāng)執(zhí)行l(wèi)ock1.lock()時(shí)的輸出:可以看到lock方法并不能響應(yīng)中斷信息,如果不解鎖則會(huì)一致持有鎖信息!

對(duì)于tryLock而言其可以響應(yīng)中斷

總結(jié)

本篇對(duì)Lock接口中常用到的Api進(jìn)行了分析和總結(jié),同時(shí)分析了Lock接口和synchronized關(guān)鍵之間的關(guān)系,希望對(duì)你能有所啟發(fā).

到此這篇關(guān)于java并發(fā)之Lock接口的文章就介紹到這了,更多相關(guān)java并發(fā)Lock接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳細(xì)總結(jié)IDEA中打jar包的兩種方式

    詳細(xì)總結(jié)IDEA中打jar包的兩種方式

    發(fā)現(xiàn)有很多小伙伴都不會(huì)用IDEA打jar包,今天給大家詳細(xì)總結(jié)了兩種IDEA打jar包的方式,對(duì)正在學(xué)習(xí)IDEA使用的小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • 解析spring-boot-starter-parent簡(jiǎn)介

    解析spring-boot-starter-parent簡(jiǎn)介

    本文通過代碼的形式給大家介紹了spring-boot-starter-parent的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2018-09-09
  • Java中Exception和Error的區(qū)別詳解

    Java中Exception和Error的區(qū)別詳解

    在 Java 開發(fā)面試中,Exception 和 Error 的區(qū)別是一個(gè)經(jīng)典問題,這個(gè)問題不僅考察我們對(duì) Java 異常處理機(jī)制的理解,還考察我們?cè)趯?shí)際開發(fā)中如何處理異常的能力,所以本文主要給大家介紹一下Java中Exception和Error的區(qū)別,需要的朋友可以參考下
    2025-04-04
  • java list用法示例詳解

    java list用法示例詳解

    java中可變數(shù)組的原理就是不斷的創(chuàng)建新的數(shù)組,將原數(shù)組加到新的數(shù)組中,下文對(duì)java list用法做了詳解
    2014-01-01
  • Java實(shí)現(xiàn)獲取cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)等信息的方法示例

    Java實(shí)現(xiàn)獲取cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)等信息的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)獲取cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)等信息的方法,涉及java使用第三方j(luò)ar包針對(duì)本機(jī)硬件的cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)信息等的讀取相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

    Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

    這篇文章主要介紹了Java安全框架——Shiro的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Shiro,感興趣的朋友可以了解下
    2021-04-04
  • java實(shí)現(xiàn)給圖片加鋪滿的網(wǎng)格式文字水印

    java實(shí)現(xiàn)給圖片加鋪滿的網(wǎng)格式文字水印

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)給圖片加鋪滿的網(wǎng)格式文字水印的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用Java實(shí)現(xiàn)驗(yàn)證碼程序

    使用Java實(shí)現(xiàn)驗(yàn)證碼程序

    這篇文章主要為大家詳細(xì)介紹了使用Java實(shí)現(xiàn)驗(yàn)證碼程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot中HTTP請(qǐng)求不通的原因級(jí)解決方法

    SpringBoot中HTTP請(qǐng)求不通的原因級(jí)解決方法

    HTTP 請(qǐng)求是指從客戶端到服務(wù)器的請(qǐng)求消息,對(duì)于一個(gè) Spring Boot 項(xiàng)目而言,服務(wù)器就是 Spring Boot,客戶端就是用戶本地的瀏覽器,但是會(huì)遇到SpringBoot HTTP請(qǐng)求不通的問題,本文介紹了一些常見問題及解決方法,需要的朋友可以參考下
    2025-02-02
  • SpringCloud-Spring?Boot?Starter使用測(cè)試及問題小結(jié)

    SpringCloud-Spring?Boot?Starter使用測(cè)試及問題小結(jié)

    Spring?Boot?Starter?是在?SpringBoot?組件中被提出來的一種概念、簡(jiǎn)化了很多煩瑣的配置、通過引入各種?Spring?Boot?Starter?包可以快速搭建出一個(gè)項(xiàng)目的腳手架,這篇文章主要介紹了SpringCloud-Spring?Boot?Starter使用測(cè)試,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

成安县| 麟游县| 从江县| 贵溪市| 瑞昌市| 罗甸县| 财经| 永年县| 静乐县| 香河县| 土默特左旗| 万宁市| 蒙阴县| 监利县| 揭阳市| 汉中市| 九龙城区| 五寨县| 西和县| 舟曲县| 凤庆县| SHOW| 五家渠市| 二手房| 中江县| 福州市| 江陵县| 西城区| 得荣县| 高州市| 长岛县| 杨浦区| 修文县| 樟树市| 伊金霍洛旗| 台江县| 太和县| 大荔县| 穆棱市| 昭苏县| 宜昌市|