Java Object wait 和 notify

Wait 和 Notify

* wait 和 notify 或 notifyAll 的行为和阻塞队列十分相似即生产者向队列存放数据,多个消费者从队列中“争抢”数据
  没有抢到数据的消费者被阻塞
class BlockingQueue<T> {
    private final Queue<T> queue = new LinkedList<>();
    private final int capacity;
    
    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    public synchronized void put(T item) throws InterruptedException {
        while (queue.szie() == capacity) {
            wait();
        }
        queue.add(item);
        notifyAll();
    }

    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }
        T item = queue.poll();
        notifyAll();
        return item;
    }

    public synchronized int size() {
        return queue.size();
    } 
   
}
* wait 是干嘛的?
    当某些条件不满足时让线程进入“休眠”状态

* notify 和 notifyAll 都是用来唤醒处在“休眠”状态的进程,二者有什么区别呢?
    - notify 会从被阻塞的进程中随机挑选一个
    - notifyAll 会从被阻塞的进程中唤醒所有

* 为什么 wait 和 notify 或 notifyAll 要和 synchronized 搭配使用?
    以上述阻塞队列为例,若多个生产者同时向队列写入数据,可能会消费者看到的队列大小不相同,
    从而导致同步问题

* 为什么在调用 wait 方法时 JVM 会自动释放锁?
    若不释放锁将永远无法调用下发的 notify 或 notifyAll 方法,从而造成死锁

* 为什么 wait 和 notify 或 notifyAll 需要成对出现?
    不唤醒线程将无法消费,也会造成死锁

* wait 和 notify 或 notifyAll 的问题是什么?
    notify 或 notifyAll 后会将生产者一并唤醒,从而导致与预期不符,可使用 JUC Condition 解决
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值