版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43874301/article/details/102459667

高并发编程系列(三)

High concurrency programming series

notify之后,t1必须释放锁,t2退出后,也必须notify,通知t1继续执行.
整个通信比较繁琐
使用latch(门闩)代替wait notify来进行通知
好处是处理通信方式简单,同时也可以指定等待时间
使用await 和countdown 方法代替wait 和notify
CountDownLatch不涉及锁定,当count的值为零时前线程继续运行.
当不涉及同步,只是涉及线程通信的时候,用synchronized + wait/notify 就显得太重要了.
这是应该考虑countDownlatch/cyclibarrier/semaphore.

public class Tu {

    volatile List lists = new ArrayList();

    public void add(Object o) {
        lists.add(o);
    }

    public int size() {
        return lists.size();
    }

    public static void main(String[] args) {
        Ts t = new Ts();

        //一个门闩   为零时门就开了
        CountDownLatch latch = new CountDownLatch(1);

        new Thread(() -> {
                System.out.println("t2启动");
                if (t.size() != 5) {
                    try {
                        latch.await();
                        //也可以指定时间
                      //latch.await(5000,TimeUnit.MILLISECONDS);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("t2结束");
        },"t2").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            System.out.println("t1启动");
                for (int i=0; i<10; i++) {
                    t.add(new Object());
                    System.out.println("欢迎关注掌上编程公众号" + i);

                    if (t.size() == 5) {
                        //打开门闩 让t2得以进行
                        latch.countDown();
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
        },"t1").start();

    }

}
01-14 09:21