立即学习:https://edu.csdn.net/course/play/27126/355518?utm_source=blogtoedu
通过wait、notify管理并发
- 这两个方法需要放在synchronized的作用域里
- 一旦执行wait方法,会释放synchronized所关联的锁,进入阻塞状态,无法再次主动地到可执行状态
- 一旦执行notify方法,会通知因调用wait方法而等待锁的线程,如有多个线程等待,则会任意挑选一个线程来唤醒
- notifyAll会唤醒因wait而进入到阻塞状态的线程,但他们没得到锁,因此会竞争锁,得到锁的继续执行,在它释放锁后,其他线程会继续竞争,以此类推。
以生产者消费者问题观察wait和notify
- 当仓库满,wait生产者线程,notify消费者线程
- 当仓库空,notify生产者线程,wait消费者线程
- 一旦执行wait方法,会释放synchronized所关联的锁,进入阻塞状态,无法再次主动地到可执行状态
通过Condition实现线程间的通讯
- 当线程A调用Condition的await方法后,会释放相应的对象锁,并且让自己进入阻塞状态,等待被其它的线程唤醒
- 线程B得到锁资源后,开始执行业务,完成后,能调用Condition的signal方法,唤醒线程A,让线程A恢复执行
- 基于Object类的wait,notify和notifyAll方法只能建立一个阻塞队列
- 通过Condition类,可以在不同的线程里创建多个阻塞队列
通过Semaphore管理多线程的竞争
- 多个线程需要竞争数量相对少的资源,比如100个线程需要连接到同一个数据库上,但任何时刻,数据库最多只能提供10个连接
- semaphore类是个计数信号量
- 构造函数,public Semaphore (int permits,boolean fair) permits 参数表示初始化可用的资源数目,而fair表示是否公平锁,
- 用acquire方法申请资源,用release方法释放资源。