1.本周思维导图
2.个人总结
Java虚拟机是一个进程,当中默认包含主线程(Main),可通过代码创建多个独立线程,与Main并发执行
线程的状态:
基本状态
等待状态
阻塞状态
注:JDK5之后就绪、运行统称为Runnable
同步规则:
注:只有在调用包含同步代码块的方法,或者同步方法时,才需要对象的锁标记
如调用不包含同步代码块的方法,或普通方法时,则不需要锁标记,可直接调用
已知JDK中线程安全的类:
StringBuffer
Vertor
Hashtable
Callable接口:
publi interface Callable<V>{
public V call() throws Exception;
}
- JDK5加入,与Runnable接口类似,实现之后代表一个线程任务
- Callable具有泛型返回值、可以声明异常
重入锁:
ReentrantLock:
- Lock接口的实现类,与synchronized一样具有互斥锁功能
读写锁:
ReentrantReadWriteLock:
- 一种支持一写多读的同步锁,读写分离,可分别分配读锁、写锁
- 支持多次分配读锁,使多个读操作可以并发执行
在读操作远远高于写操作的环境中,可在保障线程安全的情况下,提高运行效率
CopyOnWriteArrayList
- 线程安全的ArrayList,加强版读写分离
- 使用方法与ArrayList无异
CopyOnWriteArraySet
- 线程安全的Set底层使用CopyOnWriteArrayList实现
- 使用addIfAbsent()添加元素,会遍历数组,如存在则不添加
ConcurrentHashMap
- 使用方式与HashMap无异
- 不对整个Map加锁,而是为每个Segment加锁
- 当多个对象存入同一个Segment时,才需要互斥
ConcurrentLinkedQueue
- 线程安全、可高效读写的队列,高并发下性能最好的队列
- 无锁、CAS比较交换算法
ArrayBlockingQueue
- 数组结构实现,有界队列(可固定上限)