• 多线程循环打印 abc


    public class ABC_Lock {
        private static Lock lock = new ReentrantLock();// 通过JDK5中的Lock锁来保证线程的访问的互斥
        private static int state = 0;//通过state的值来确定是否打印
    
        static class ThreadA extends Thread {
            @Override
            public void run() {
                for (int i = 0; i < 10;) {
                    try {
                        lock.lock();
                        while (state % 3 == 0) {// 多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒
                            System.out.print("A");
                            state++;
                            i++;
                        }
                    } finally {
                        lock.unlock();// unlock()操作必须放在finally块中
                    }
                }
            }
        }
    
        static class ThreadB extends Thread {
            @Override
            public void run() {
                for (int i = 0; i < 10;) {
                    try {
                        lock.lock();
                        while (state % 3 == 1) {// 多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒
                            System.out.print("B");
                            state++;
                            i++;
                        }
                    } finally {
                        lock.unlock();// unlock()操作必须放在finally块中
                    }
                }
            }
        }
    
        static class ThreadC extends Thread {
            @Override
            public void run() {
                for (int i = 0; i < 10;) {
                    try {
                        lock.lock();
                        while (state % 3 == 2) {// 多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒
                            System.out.print("C");
                            state++;
                            i++;
                        }
                    } finally {
                        lock.unlock();// unlock()操作必须放在finally块中
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            new ThreadA().start();
            new ThreadB().start();
            new ThreadC().start();
        }
    }
  • 相关阅读:
    9、 docker容器数据卷
    第十八章 MySQL数据库优化
    第十七章 MySQL的VIP漂移和Atlas
    第十六章 MHA高可用(续)
    第一章 shell基础
    第十五章 MHA高可用
    第十四章 MySQL的各种主从
    第十三章 MySQL的主从复制
    第十二章 MySQL的恢复与备份
    第十一章 MySQL日志详解
  • 原文地址:https://www.cnblogs.com/duanR/p/8425626.html
Copyright © 2020-2023  润新知