15-线程等待通知机制总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84620772
  1. 线程等待通知机制总结
    1. 概述

一个线程的等待阻塞状态,受另外一个线程控制。

 

Object.wait()

Object.notify()

特点

必须基于特定的对象锁synchronized

Notify只会对已经处于wait状态的线程生效。

使用

必须在synchronized(obj)代码内部使用,否则会抛出异常

原理

线程等待/唤醒在特定的对象锁obj上

线程中断

Wait()中的线程,被其他线程t.interrupt()后,可中断阻塞状态,继续执行代码,并抛出interruptedException异常。

LockSupport.park()

LockSupport.unpark(t)

特点

不需要维护同一对象,可实现模块之间的解耦

Unpark可对已经处于park(),或者下次处于park()状态的线程生效

原理

内部调用的是unsafe.park/unpark()方法实现的

线程中断

Park()中的线程,被其他线程t.interrupt()后,可中断阻塞状态,继续执行代码,不抛出interruptedException异常。

 

 

 

    1. Object.wait()/notify()
      1. 使用案例

      1. 运行结果

      1. 特点

多个线程用于维护同一个对象锁。

Wait notify等需要在synchronized对象锁内部调用,否则会抛出IllegalMonitorStateException。

      1. 使用场景

生产消费者模型

 

    1. LockSupport.park()/unpark()
      1. 使用案例

      1. 运行结果

      1. 特点

两个线程之间不需要维护同一个对象,可以实现模块之间的解耦。

Unpark可以在park之前调用,可以对之后的线程t的一次park进行唤醒。

      1. 使用场景

基于CAS原理,用于实现锁的内部机制。

 

    1. lock.lock()/unlock()  condition.await()/asignal()
      1. 使用案例

      1. 运行结果

1 2 A 3 4 B 5 6 C

      1. 特点

多个线程之间需要维护同一个可重入的互斥锁ReentrantLock,同时基于该锁建立多个条件队列(和线程种类数相同),在线程A执行到特定条件下阻塞await()当前线程的条件队列并唤醒asignal()特定线程的条件队列。

      1. 使用场景

允许线程在一定时间内获取锁,获取失败则返回(而非陷入休眠);

允许读写锁分离的场景;

允许以任何顺序获取和释放多个锁。

多线程学习大纲:https://mp.csdn.net/postedit/84768644

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84620772