书山天道-Java 并发知识点汇总
目标: 梳理 Java 并发重点
1. 适用场景及选型
- 线程 sleep() 方法好于忙循环,不会浪费处理器周期。
- 避免死锁的最简单的方式,阻止同步方法或者同步块调用其他的同步方法和同步块。不显示。
2. 常见 Thread exception
- Thead void start(), 如果线程之前已经启动且处于运行状态,或线程已经死亡,抛出 IllegaclThreadStateException.
3. 常见注意点:
1. 竞态条件;2.数据竞争;3. 缓存变量。
使用同步,临界区的串行方式。互斥,可见性。是在主存内操作数据。
同步是通过监听器来实现的。 监听器是针对临界区构建的并发访问控制。
并发必须以不可分割的形式执行。每个Java对象都和一个监听器相关联,线程通过获取和释放监听器的锁来上锁和解锁。
4. 常见同步器
synchronized 关键字对临界进行线程程同步访问,高级同步器(控制通用同步方法的类)
倒计时门闩 ( countdown latch) :
countdown latch 可以让所有线程几乎在同一时间开始工作。并控制第三方线程在所控制的线程都结束后再进行。
同步屏障 ( cyclic barrier ) : 允许一组线程彼此互相等待,直到抵达某个公共的屏障点。该屏障在等待线程被释放之后可以重用,所以称它为可循环使用的屏障.该同步器对于数量固定且互相之间
不时等待彼此的多线程应用很有用, parties 。 barrierAction,
int getNumberWaiting() 返回当前在同步屏障上等待的线程数目。 该方法对于调试以及断言十分有用。
同步屏障在 并行分解的场合下很有用,长时间的任务被分割成多个子任务,单独的结果随后会被合并到整个任务的结果当中。
交换器 ( exchanger)
信号量 (semaphore )
竞态条件:计算的正确性取决于相对时间 或 调度器所控制的多线程交叉时发生。

counter ++ : 读取,给值加1, 写入 3个步骤。
数据竞争: 两条或两条以上的线程(在单个应用中)并发地访问同一块内存区域,至少一条是写.且这些线程没有协调对该内存的访问。访问顺序不同,结果不同。

缓存变量: JVM / OS 寄存器 / cpu 缓存 存储变量,而不是主存,线程写入变量时,是写入自己的拷贝,其他线程不太可能看到自己的变量拷贝发生更改。


要么访问同一段代码序列的两条或两条以上线程必须获取同一个锁,要么不存在同步。
进入临界区必须访问同一个对象。
活跃性问题
1.死锁:互相持有对象 互斥持有的资源
2. 活锁:持续重试一个总是失败的操作,以至于无法继续执行。
3. 饿死:线程一直被调度器延迟访问其赖以执行的资源,无限延迟。

浙公网安备 33010602011771号