Java中的内置锁synchronized关键字和wait()、notifyAll()方法

简介: 【6月更文挑战第17天】Java的synchronized和wait/notify实现顺序打印ALI:共享volatile变量`count`,三个线程分别检查`count`值,匹配时打印并减1,未匹配时等待。每个`print`方法加锁,确保互斥访问。代码示例展示了线程同步机制。考虑异常处理及实际场景的扩展需求。

这个问题可以通过Java中的内置锁synchronized关键字和wait()、notifyAll()方法来解决。具体的做法是这样的:

  1. 创建一个共享的volatile变量count,初始值为0。
  2. 在第一个线程中,循环判断count是否为0,如果是则输出A并加锁,如果不是则等待。然后输出A并将count减1,唤醒所有等待的线程。
  3. 在第二个线程中,循环判断count是否为1,如果是则输出L并加锁,如果不是则等待。然后输出L并将count减1,唤醒所有等待的线程。
  4. 在第三个线程中,循环判断count是否为2,如果是则输出I并加锁,如果不是则等待。然后输出I并将count减1,唤醒所有等待的线程。

这样就可以保证三个线程按顺序打印ALIALI。
以下是相关的Java代码示例:

public class PrintThread {
   
    private volatile int count = 0;

    public static void main(String[] args) {
   
        PrintThread printThread = new PrintThread();
        Thread threadA = new Thread(printThread::printA);
        Thread threadL = new Thread(printThread::printL);
        Thread threadI = new Thread(printThread::printI);

        threadA.start();
        threadL.start();
        threadI.start();

        try {
   
            threadA.join();
            threadL.join();
            threadI.join();
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
    }

    private synchronized void printA() {
   
        while (count != 0) {
   
            try {
   
                wait();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }

        System.out.print("A");
        count--;
        notifyAll();
    }

    private synchronized void printL() {
   
        while (count != 1) {
   
            try {
   
                wait();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }

        System.out.print("L");
        count--;
        notifyAll();
    }

    private synchronized void printI() {
   
        while (count != 2) {
   
            try {
   
                wait();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }

        System.out.print("I");
        count--;
        notifyAll();
    }
}

注意,这段代码只是一个简单的示例,实际使用时需要考虑更多的细节,比如异常处理、超时控制等。

相关文章
|
1月前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
178 46
|
2月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
103 1
|
2月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
178 0
|
2月前
|
算法 搜索推荐 Java
Java中的Collections.shuffle()方法及示例
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。
79 0
|
2月前
|
安全 Java
JAVA:Collections类的shuffle()方法
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的工具方法,适用于洗牌、抽奖等场景。该方法直接修改原列表,支持自定义随机数生成器以实现可重现的打乱顺序。使用时需注意其原地修改特性及非线程安全性。
85 0
|
2月前
|
算法 安全 Java
java中Collections.shuffle方法的功能说明
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,常用于洗牌、抽奖等场景。可选 `Random` 参数支持固定种子以实现可重复的随机顺序。方法直接修改原列表,无返回值。
84 0
|
2月前
|
Java 程序员 项目管理
Java 程序员不容错过的 Git Flow 全套学习资料及应用方法详解 Git Flow
本文详细介绍了Git Flow技术方案及其在Java项目中的应用实例,涵盖分支管理、版本发布与紧急修复流程,帮助开发者掌握高效的代码管理方法,提升团队协作效率。附示例操作及代码下载链接。
64 0
|
10月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
111 4
|
存储 安全 Java
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
121 0
|
安全 Java 开发者
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
188 0

热门文章

最新文章