• 高并发编程系列(三)


    版权声明:本文为博主原创文章,遵循 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();
    
        }
    
    }
    

    运行结果

  • 相关阅读:
    XNA之3D文字
    SQL2005调用C#编写的DLL
    C#绘图工具之Rotate
    ASP.NET中的WebService
    数据库同步之复制技术
    C#之TCP消息的发送和接受
    Tsql清空表数据的两种方式truncate and delete
    Code First Migrations数据迁移方法
    MSSQLSERVER跨服务器连接
    windows下wget命令行下载工具的使用
  • 原文地址:https://www.cnblogs.com/mzdljgz/p/11641713.html
Copyright © 2020-2023  润新知