- 线程通信
多线程并发执行时, 在默认状况下CPU是随机切换线程, 若是但愿线程执行的顺序按咱们的规律执行, 就须要线程之间协调通信java
线程通信方式多线程
- 休眠唤醒方式
- -- Object: wait、notify、notifyAll(以上必须配合synchronized块使用)
- -- Condition(Lock.newCondition()): await、signal、signalAll
- CountDownLatch: 用于某个线程等待其余线程执行完后再执行
CountDownLatch底层原理是经过一个计数器来实现的, 计数器的初始值为(等待)线程的数量, 执行减一操做, 到0后意味着某个线程就能够执行了并发
好比A线程等待前面有3个线程执行完成后再执行, 计数器标记count=3, 第一步执行await()方法等待检查当前的count是不是0, 不是0 ,则A线程阻塞, 在其余3个线程执行时各自分别调用countDown()方法, 对count-1操做, 直到count=0, 就去唤醒(resume())A线程工做学习
- CyclicBarrier: 一组线程等待至某个状态以后再所有同时执行
CyclicBarrier 底层基于 ReentrantLock 和 Condition 实现spa
- Semaphore: 用于控制对某组资源的访问权限 (适合资源少,线程多的场景)
wait 和 sleep 区别线程
wait | sleep | |
同步 | 只能在synchronized同步块中使用 | 不须要依赖synchronized |
做用对象 | wait方法定义在Object类中,做用于对象自己 | sleep方法定义在java.lang.Thread中,做用当前线程 |
释放锁资源 | 会 | 不会 |
唤醒条件 | 其余线程调用对象的notify或notifyAll | 超时或调用interrupt() |
方法属性 | 实例方法(Object.wait()) | 静态方法 |
Go. 学习线程 还须要了解Java内存模型 也是核心基础对象