• 【面试:并发篇27:多线程:犹豫模式】


    【面试:并发篇27:多线程:犹豫模式】

    00.前言

    如果有任何问题请指出,感谢。

    01.介绍

    什么是犹豫模式,指的是一个线程发现另一个线程或者线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。
    通俗来说就是 一个对象只能有效调用一次方法,之后再调用直接返回结束。

    02.两阶段终止模式-犹豫模式优化

    @Slf4j(topic = "c.TwoPhaseTermination")
    public class Test13 {
        public static void main(String[] args) throws InterruptedException {
            TwoPhaseTermination tpt = new TwoPhaseTermination();
            tpt.start();
            tpt.start();
            tpt.start();
    
            Thread.sleep(3500);
            log.debug("停止监控");
            tpt.stop();
        }
    }
    
    @Slf4j(topic = "c.TwoPhaseTermination")
    class TwoPhaseTermination {
        // 监控线程
        private Thread monitorThread;
        // 停止标记
        private volatile boolean stop = false;
        // 判断是否执行过 start 方法
        private boolean starting = false;
    
        // 启动监控线程
        public void start() {
            synchronized (this) { //犹豫模式主要部分代码
                if (starting) { // false
                    return;
                }
                starting = true;
            }
            monitorThread = new Thread(() -> {
                while (true) {
                    if (stop) {
                        log.debug("料理后事");
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                        log.debug("执行监控记录");
                    } catch (Exception e) {
                    }
                }
            }, "monitor");
            monitorThread.start();
        }
    
        // 停止监控线程
        public void stop() {
            stop = true;
            monitorThread.interrupt();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    结果

    19:53:25.992 c.TwoPhaseTermination [monitor] - 执行监控记录
    19:53:27.004 c.TwoPhaseTermination [monitor] - 执行监控记录
    19:53:28.009 c.TwoPhaseTermination [monitor] - 执行监控记录
    19:53:28.487 c.TwoPhaseTermination [main] - 停止监控
    19:53:28.487 c.TwoPhaseTermination [monitor] - 料理后事

    解释
    我们创建了一个starting变量 作用是判断这个方法是否已经被调用过 如果没有则执行之后的代码 如果有则直接返回,这里我们执行了三次start方法 但结果只运行了一次。
    不过还要注意一点 判断是否执行的if语句需要加锁,目的是为了防止 多线程情况下 对同一个方法反复执行

  • 相关阅读:
    插上u盘显示格式化怎么办?U盘数据恢复可以这样做
    ROW_NUMBER 开窗函数优化方案(Oracle && KingBase 性能比对)
    Java JDK下载与安装教程
    HTML:课堂练习5-3唐代诗歌目录页面设计
    Python基础知识从hello world 开始(第二天)
    PACS外围硬件--九五小庞
    Flask+LayUI开发手记(一):LayUI表格的前端数据分页展现
    SpringMVC---SSM整合&&异常处理&&拦截器
    【细读经典】springBoot源码(一)创建SpringApplication
    leetcode_2300 咒语和药水的成功对数
  • 原文地址:https://blog.csdn.net/m0_71229547/article/details/125994587