前言
这篇文章再来介绍一个基于CAS的新的同步机制——LockSupport。
LockSupport
可以更方便地控制进程的阻塞与唤醒。
想想之前我们是怎么控制线程的阻塞的?是通过原生Object类里的 wait() 和 notify()。
但是这两个方法的问题在于,调用的先后顺序非常重要,如果对一个线程错误地先调用notify()再调用wait(),这个线程就会无限地等待下去。并且,notify()方法不能指定唤醒某个线程,如果等待队列里的线程不止一个的话,就没法控制唤醒的具体是哪个线程。
但从其他方面来说,LockSupport与wait()/notify()的使用场景是很像的。
我们通过一道面试题来演示一下wait()/notify()以及LockSupport的用法,并且附带了一些代码分析,同时分析了一下这两种方法之间的区别。
通过面试题与wait()/notify()比较
一个线程往容器里加10个元素,另一个线程容器中监视元素的数量。
当容器中元素个数到5的时候,线程2给出提示并结束,线程1继续添加元素。
wait()/notify()解法
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Object lock = new Object();
(new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
lock.wait();
System.out.println("容器已经有五个元素了");
lock.notify