SynchronousQueue
叫同步队列,它与其他队列的不同之处是生产put
与消费take
都是阻塞操作,当生产的元素没有被消费时进行阻塞,当队列中没有可消费的元素时阻塞,这种同步队列的机制也叫作配对通信机制。
它与其他队列的不同之处还在于没有使用AQS维护内部容器,全部使用CAS进行处理。
1. 使用
代码语言:javascript复制public class SynchronousQueueTest {
static SynchronousQueue<Object> queue = new SynchronousQueue<>();
public static void main(String[] args) throws InterruptedException {
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
Thread.sleep(2000);
queue.take();
System.out.println("take1");
queue.take();
System.out.println("take2");
}
public static class MyThread implements Runnable{
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() " - 阻塞...");
queue.put("a");
System.out.println(Thread.currentThread().getName() " - 阻塞结束...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 输出
out =>
Thread-0 - 阻塞...
Thread-1 - 阻塞...
take1
Thread-1 - 阻塞结束...
Thread-0 - 阻塞结束...
take2