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();
    }
}

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

相关文章
|
3天前
|
缓存 Java
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
|
3天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
28 4
|
14天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
35 17
|
6天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
31 4
|
8天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
13 2
|
9天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
Java
JAVA方法的定义
JAVA方法的定义
80 0
|
5月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
40 1
|
6月前
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
68 1
|
6月前
|
存储 Java
Java中带返回值方法的定义与调用技术
Java中带返回值方法的定义与调用技术
88 1
下一篇
无影云桌面