wait、notify和countDownLatch进行线程间交互

1.wait和notify

wait会释放锁,notify不会释放锁。wait和notify只能在加锁的情况下使用。
wait底层是引用的native方法,wait一定的时间。
notify唤醒一个对象,底层是一个native方法,只能被该对象的monitor调用。
某个线程调用对象的wait方法,该线程进入等待模式且释放锁。其他线程可以访问。wait可以取消while循环的等待模式,减少CPU的消耗。
其他线程当调用对象的notify方法时,notify会启动正在等待该对象的一个线程,但是由于notify不会释放锁,所以被唤醒的线程也只能在本线程结束后才能执行。
而且,notify唤醒的线程是由CPU线程调度器自动分配的。
所以如果想让notify唤醒的锁不用等待本线程的结束,需要本线程调用wait自动释放锁,然后notify唤醒的线程执行结束之前,需要唤醒刚才wait的线程。

能使用countdownlatch就不要用wait,notify

比wait和notify更好的方式,是用CountDownLatch(门闩)
举个例子

//对于一个简单的不涉及同步的进程,能用CountDownLatch就不要用sybchronized+wait+notify的方法。
volatile List list=new ArrayList();
CountDownLatch latch=new CountDownLatch(1);//初始值,减到0之后,门闩打开,线程得以运行
new Thread(()->{
    if(list.size()!=5){
        try{
            latch.await();
        //用门闩等待的时候不需要锁定任何对象,await之后,线程在此停住。
        }catch(InterruptedException e){
            e.printStackTrace;
        } 
    }
}).start();

new Thread(()->{
    for(int i=0;i<10;i++){
        list.add(new Object());
        System.out.println("add"+i);
        if(list.size()==5){
            try{
                latch.countDown();//每一次countDown(),初始值-1
                //打开门闩,刚才的线程得以继续运行
            }catch(InterruptedException e){
                e.printStackTrace;
            }
        }
    }
}).start();
原创文章 64 获赞 27 访问量 9423

猜你喜欢

转载自blog.csdn.net/weixin_44893585/article/details/104581234