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

Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

 更新時(shí)間:2023年12月14日 08:54:34   作者:Terisadeng  
這篇文章主要介紹了Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀,ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時(shí)響應(yīng)中斷,比如一個(gè)線程t1通過lockInterruptibly()方法獲取到一個(gè)可重入鎖,并執(zhí)行一個(gè)長(zhǎng)時(shí)間的任務(wù),需要的朋友可以參考下

ReentrantLock可中斷鎖

ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時(shí)響應(yīng)中斷,比如一個(gè)線程t1通過lockInterruptibly()方法獲取到一個(gè)可重入鎖,并執(zhí)行一個(gè)長(zhǎng)時(shí)間的任務(wù),另一個(gè)線程通過interrupt()方法就可以立刻打斷t1線程的執(zhí)行,來獲取t1持有的那個(gè)可重入鎖。而通過ReentrantLock的lock()方法或者Synchronized持有鎖的線程是不會(huì)響應(yīng)其他線程的interrupt()方法的,直到該方法主動(dòng)釋放鎖之后才會(huì)響應(yīng)interrupt()方法。下面看一個(gè)示例:

package com.teriste.thread;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 測(cè)試ReentrantLock可中斷鎖的效果
 */
public class ThreadInteruptDemo {
    ReentrantLock lock1=new ReentrantLock();
    ReentrantLock lock2=new ReentrantLock();
    /**
     * ReentrantLock響應(yīng)中斷
     * @throws Exception
     */
    public void exeInterupt() throws Exception{
        Thread t1=new Thread(new DemoThread(lock1,lock2));
        Thread t2=new Thread(new DemoThread(lock2,lock1));
        t1.start();
        t2.start();
        System.out.println(t1.getName()+"中斷");
        //主線程睡眠1秒,避免線程t1直接響應(yīng)run方法中的睡眠中斷
        Thread.sleep(1000);
        t1.interrupt();
        //阻塞主線程,避免所有線程直接結(jié)束,影響死鎖效果
        Thread.sleep(10000);
    }
    Object syn1=new Object();
    Object syn2=new Object();
    /**
     * Synchronized響應(yīng)中斷
     * @throws Exception
     */
    public void exeInteruptSyn() throws Exception{
        Thread t1=new Thread(new DemoThread1(syn1,syn2));
        Thread t2=new Thread(new DemoThread1(syn2,syn1));
        t1.start();
        t2.start();
        System.out.println(t1.getName()+"中斷");
        //主線程睡眠1秒,避免線程t1直接響應(yīng)run方法中的睡眠中斷
        Thread.sleep(1000);
        t1.interrupt();
        //阻塞主線程,避免所有線程直接結(jié)束,影響死鎖效果
        Thread.sleep(100000);
    }
    /**
     * ReentrantLock實(shí)現(xiàn)死鎖
     */
    static class DemoThread implements Runnable{
        ReentrantLock lock1;
        ReentrantLock lock2;
        public DemoThread(ReentrantLock lock1,ReentrantLock lock2){
            this.lock1=lock1;
            this.lock2=lock2;
        }
        @Override
        public void run() {
            try {
                //可中斷的獲取鎖
                lock1.lockInterruptibly();
                //lock1.lock();
                //睡眠200毫秒,保證兩個(gè)線程分別已經(jīng)獲取到兩個(gè)鎖,實(shí)現(xiàn)相互的鎖等待
                TimeUnit.MILLISECONDS.sleep(200);
                //lock2.lock();
                //可中斷的獲取鎖
                lock2.lockInterruptibly();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock1.unlock();
                lock2.unlock();
                System.out.println("線程"+Thread.currentThread().getName()+"正常結(jié)束");
            }
        }
    }
    /**
     * Synchronized實(shí)現(xiàn)死鎖
     */
    static class DemoThread1 implements Runnable{
        Object lock1;
        Object lock2;
        public DemoThread1(Object lock1,Object lock2){
            this.lock1=lock1;
            this.lock2=lock2;
        }
        @Override
        public void run() {
            try {
                synchronized (lock1){
                    //睡眠200毫秒,再獲取另一個(gè)鎖,
                    //保證兩個(gè)線程分別已經(jīng)獲取到兩個(gè)鎖,實(shí)現(xiàn)相互的鎖等待
                    TimeUnit.MILLISECONDS.sleep(200);
                    synchronized (lock2){
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println("線程"+Thread.currentThread().getName()+"正常結(jié)束");
            }
        }
    }
}

測(cè)試代碼:

package com.teriste.thread;
import org.junit.Test;
public class ThreadInteruptDemoTest {
    /**
     * 測(cè)試ReentrantLock響應(yīng)中斷
     * @throws Exception
     */
    @Test
    public void exeInteruptTest() throws Exception{
        ThreadInteruptDemo demo=new ThreadInteruptDemo();
        demo.exeInterupt();
    }
    /**
     * 測(cè)試Synchronized響應(yīng)中斷
     * @throws Exception
     */
    @Test
    public void exeInteruptSynTest() throws Exception{
        ThreadInteruptDemo demo=new ThreadInteruptDemo();
        demo.exeInteruptSyn();
    }
}

當(dāng)執(zhí)行exeInteruptTest()方法時(shí),可以看到線程t1立刻響應(yīng)了主線程的interrupt()方法:

當(dāng)執(zhí)行exeInteruptSynTest()方法時(shí),可以看到t0線程并沒有響應(yīng)中斷,兩個(gè)線程仍然處于相互等待鎖釋放的狀態(tài)。

到此這篇關(guān)于Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀的文章就介紹到這了,更多相關(guān)ReentrantLock可中斷鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用Thumbnailator實(shí)現(xiàn)圖片處理功能

    Java使用Thumbnailator實(shí)現(xiàn)圖片處理功能

    Thumbnailator是一個(gè)簡(jiǎn)單且功能強(qiáng)大的Java庫,用于生成縮略圖和執(zhí)行其他圖片處理任務(wù),在這篇博客中,我們將介紹如何使用Thumbnailator進(jìn)行圖片的縮放、裁剪、旋轉(zhuǎn)等操作,需要的朋友可以參考下
    2024-07-07
  • SpringBoot自定義FailureAnalyzer詳解

    SpringBoot自定義FailureAnalyzer詳解

    這篇文章主要介紹了SpringBoot自定義FailureAnalyzer詳解,FailureAnalyzer是一種在啟動(dòng)時(shí)攔截?exception?并將其轉(zhuǎn)換為?human-readable?消息的好方法,包含在故障分析中,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)將Markdown轉(zhuǎn)換為純文本

    Java實(shí)現(xiàn)將Markdown轉(zhuǎn)換為純文本

    這篇文章主要為大家詳細(xì)介紹了兩種在 Java 中實(shí)現(xiàn) Markdown 轉(zhuǎn)純文本的主流方法,文中的示例代碼講解詳細(xì),大家可以根據(jù)需求選擇適合的方案
    2025-03-03
  • Spring Boot 3.x 開發(fā)中分布式 Session 共享的序列化問題小結(jié)

    Spring Boot 3.x 開發(fā)中分布式 Session 共享的序

    分布式 Session 共享是構(gòu)建高可用應(yīng)用的關(guān)鍵技術(shù),而序列化則是其中的核心環(huán)節(jié),本文提供的方案和示例,希望能幫助開發(fā)者在Spring Boot 3.x 中從容應(yīng)對(duì)分布式Session 序列化的挑戰(zhàn),構(gòu)建穩(wěn)健的微服務(wù)架構(gòu),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • java ConcurrentHashMap鎖分段技術(shù)及原理詳解

    java ConcurrentHashMap鎖分段技術(shù)及原理詳解

    這篇文章主要介紹了java ConcurrentHashMap鎖分段技術(shù)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Spring Boot實(shí)現(xiàn)qq郵箱驗(yàn)證碼注冊(cè)和登錄驗(yàn)證功能

    Spring Boot實(shí)現(xiàn)qq郵箱驗(yàn)證碼注冊(cè)和登錄驗(yàn)證功能

    這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)qq郵箱驗(yàn)證碼注冊(cè)和登錄驗(yàn)證功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java對(duì)接阿里通義千問的簡(jiǎn)單教程

    java對(duì)接阿里通義千問的簡(jiǎn)單教程

    有的項(xiàng)目可能需要用到直接外部調(diào)用阿里通義千問的接口,下面這篇文章主要介紹了java對(duì)接阿里通義千問的簡(jiǎn)單教程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java中BIO、NIO和AIO的區(qū)別、原理與用法

    Java中BIO、NIO和AIO的區(qū)別、原理與用法

    這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別、原理與用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 如何把spring boot項(xiàng)目部署到tomcat容器中

    如何把spring boot項(xiàng)目部署到tomcat容器中

    本文給大家分享如何把spring boot項(xiàng)目部署到tomcat容器中,本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2017-04-04
  • SpringBoot如何實(shí)現(xiàn)文件下載

    SpringBoot如何實(shí)現(xiàn)文件下載

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)文件下載問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論

若尔盖县| 蛟河市| 黄骅市| 绵竹市| 崇文区| 信宜市| 长白| 永春县| 青铜峡市| 罗定市| 广灵县| 清流县| 溆浦县| 屯昌县| 黎平县| 顺平县| 门源| 昆山市| 金堂县| 城口县| 郁南县| 平南县| 邵阳市| 儋州市| 宁远县| 应城市| 沅陵县| 仪征市| 晋州市| 改则县| 亚东县| 洛阳市| 蚌埠市| 克什克腾旗| 新泰市| 延津县| 时尚| 景宁| 叙永县| 娱乐| 平远县|