首页  

基于 wait 和 notifyAll 实现简单的阻塞队列     所属分类 java 浏览量 70
Object.wait()        释放锁,并进入等待队列
Object.notify()      唤醒等待队列里的任一线程(唤醒哪一个不确定)
Object.notifyAll()   唤醒等待队列里的所有线程

wait notify notifyAll 配合 synchronized 使用

否则抛异常 java.lang.IllegalMonitorStateException


对象 监视器
锁 等待队列 WaitSet  同步队列 EntrySet
notify()/notifyAll()  把等待队列中的线程放到同步队列

synchronized 非公平的锁,竞争激烈的话,某些线程可能一直不会执行



public class SimpleBlockQueue {

	private final int maxSize;
	private final LinkedList<Object> list = new LinkedList<>();

	public SimpleBlockQueue(int maxSize) {
		if (maxSize <= 0 || maxSize >= 100) {
			throw new RuntimeException("maxSize error");
		}
		this.maxSize = maxSize;
	}

	public synchronized void offer(Object e) throws InterruptedException {
		while (list.size() >= maxSize) {
			wait();
		}
		list.add(e);
		notifyAll();
	}

	public synchronized Object poll() throws InterruptedException {
		while (list.isEmpty()) {
			wait();
		}
		Object e = list.poll();
		notifyAll();
		return e;
	}
	



该例子里 使用 notify 可能死锁
线程状态切换   BLOCKED WAITING  RUNNABLE

完整代码
https://gitee.com/dyyx/hellocode/blob/master/src/SimpleBlockQueue.java


ReentrantLock原理 基于 ReentrantLock Condition await signalAll 实现简单的阻塞队列 Lock和synchronized的区别 synchronized知识点 java线程状态及转换

上一篇     下一篇
java线程状态及转换

LockSupport简介

ReentrantLock原理

基于 ReentrantLock Condition await signalAll 实现简单的阻塞队列

Synchronized 和 AQS 实现要点

java死锁实例