下面标黄字的部分就是对一下两点总结的实现:
演示代码:
/** * @author zhangzhixi * @date 2021-5-23 18:21 */ public class LockDemo { static Object object = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (object) { System.out.println(Thread.currentThread().getName() + "==>线程Come in"); try { // 使当前线程等待 object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "==>线程被唤醒"); } }, "A").start(); new Thread(() -> { synchronized (object) { System.out.println(Thread.currentThread().getName() + "==>通知线程"); // 使当前线程唤醒 object.notifyAll(); } }, "B").start(); } }
我们来看下上面代码的执行结果,看起来很和谐:
我们来将上面代码动下手脚,注释掉代码标红的内容看下wait/notify脱离了Synchronized会出现什么?
可以看到报了异常,说明wait/notify不能够脱离Synchronized代码块
我们再来看一下使线程A暂停三秒会发生什么?
线程B先执行了,没有代码将线程A的wait状态进行唤醒
代码实现:
public class LockDemo { static Object object = new Object(); // 创建可重入锁 static Lock lock = new ReentrantLock(); static Condition condition = lock.newCondition(); public static void main(String[] args) { new Thread(() -> { lock.lock(); try { System.out.println(Thread.currentThread().getName() + "==>线程Come in"); // 使当前线程等待 condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } System.out.println(Thread.currentThread().getName() + "==>线程被唤醒"); }, "A").start(); new Thread(() -> { lock.lock(); try { System.out.println(Thread.currentThread().getName() + "==>通知线程"); // 使当前线程唤醒 condition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "B").start(); } }
看下上面代码的执行结果:
我们来将上面代码动下手脚,注释掉代码标红的内容看下wait/notify脱离了Synchronized会出现什么?
可以看到报了异常,说明wait/notify不能够脱离Synchronized代码块
我们再来看一下使线程A暂停三秒会发生什么?
线程B先执行了,没有代码将线程A的await状态进行唤醒
原文:https://www.cnblogs.com/zhangzhixi/p/14802614.html