zoukankan      html  css  js  c++  java
  • 多线程循环打印 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();
        }
    }
  • 相关阅读:
    Git上手:四种常见的Git协同工作方式
    Git上手:Git扫盲区
    理解web缓存
    浅谈对技术债的理解
    保护个人隐私,从我做起
    cookie注意事项
    了解JavaScript核心精髓(二)
    简单实现nodejs爬虫工具
    浅谈我所见的CSS组织风格
    利用正则表达式清除多余的空行
  • 原文地址:https://www.cnblogs.com/duanR/p/8425626.html
Copyright © 2011-2022 走看看