ReentrantLock测试

 

博客:https://www.jianshu.com/p/7058c21e615e

复制代码
    public static void main(String[] args) {
       test3();
    }


    public static void test1() {
        Runnable runnable = () -> {
            for (int i = 0; i < 3; i++) {
                System.out.println(Thread.currentThread().getName() + "输出了 " );
            }
        };
        new Thread(runnable, "a").start();
        new Thread(runnable, "b").start();
    }

    public static void test2() {
        ReentrantLock lock = new ReentrantLock();

        Runnable runnable = () -> {
            try {
                lock.lock();
                for (int i = 0; i < 3; i++) {
                    System.out.println(Thread.currentThread().getName() + "输出了:  " + i);
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
        };
        new Thread(runnable, "a").start();
        new Thread(runnable, "b").start();
    }

    public static void test3() {
        AtomicInteger nextThread = new AtomicInteger(1);

        ReentrantLock lock = new ReentrantLock();
        Condition conditionA = lock.newCondition();
        Condition conditionB = lock.newCondition();

        Runnable runnableA = () -> {
            for(; ; ) {
                try {
                    lock.lock();
                    while (nextThread.get() != 1) {
                        conditionA.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " 输出了A  ");
                    nextThread.set(2);
                    conditionB.signalAll();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    lock.unlock();
                }
            }
        };

        Runnable runnableB = () -> {
            for(; ; ){
                try {
                    lock.lock();
                    while (nextThread.get() != 2) {
                        conditionB.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " 输出了B  ");
                    nextThread.set(1);
                    conditionA.signalAll();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    lock.unlock();
                }
            }
        };

        new Thread(runnableA, "a").start();
        new Thread(runnableB, "b").start();
    }
复制代码

 

 
posted @   Peter.Jones  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
历史上的今天:
2019-11-21 代码提交到阿里云git Dockerfile文件: 推送代码
2019-11-21 代码提交到阿里云git Dockerfile文件: 推送j代码和ar包方式
点击右上角即可分享
微信分享提示