行业资讯 2025年08月6日
0 收藏 0 点赞 512 浏览 1308 个字
摘要 :

文章目录 设计模式 终止模式 Balking 设计模式 终止模式 终止模式之两阶段终止模式:停止标记用 volatile 是为了保证该变量在多个线程之间的可见性 class TwoPhaseTer……




  • 设计模式
  • 设计模式

    终止模式

    终止模式之两阶段终止模式:停止标记用 volatile 是为了保证该变量在多个线程之间的可见性

    class TwoPhaseTermination {
        // 监控线程
        private Thread monitor;
        // 停止标记
        private volatile boolean stop = false;;
    
        // 启动监控线程
        public void start() {
            monitor = new Thread(() -> {
                while (true) {
                    Thread thread = Thread.currentThread();
                    if (stop) {
                        System.out.println("后置处理");
                        break;
                    }
                    try {
                        Thread.sleep(1000);// 睡眠
                        System.out.println(thread.getName() + "执行监控记录");
                    } catch (InterruptedException e) {
                           System.out.println("被打断,退出睡眠");
                    }
                }
            });
            monitor.start();
        }
    
        // 停止监控线程
        public void stop() {
            stop = true;
            monitor.interrupt();// 让线程尽快退出Timed Waiting
        }
    }
    // 测试
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination tpt = new TwoPhaseTermination();
        tpt.start();
        Thread.sleep(3500);
        System.out.println("停止监控");
        tpt.stop();
    }
    

    Balking

    Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回

    public class MonitorService {
        // 用来表示是否已经有线程已经在执行启动了
        private volatile boolean starting = false;
        public void start() {
            System.out.println("尝试启动监控线程...");
            synchronized (this) {
                if (starting) {
                    return;
                }
                starting = true;
            }
            // 真正启动监控线程...
        }
    }
    

    对比保护性暂停模式:保护性暂停模式用在一个线程等待另一个线程的执行结果,当条件不满足时线程等待
    例子:希望 doInit() 方法仅被调用一次,下面的实现出现的问题:

    • 当 t1 线程进入 init() 准备 doInit(),t2 线程进来,initialized 还为f alse,则 t2 就又初始化一次
    • volatile 适合一个线程写,其他线程读的情况,这个代码需要加锁
    public class TestVolatile {
        volatile boolean initialized = false;
        
        void init() {
            if (initialized) {
                return;
            }
            doInit();
            initialized = true;
        }
        private void doInit() {
        }
    }
    

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10400.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号