一. volatile
1. 定义:在java内存模型中,所有线程都能看到变量值是一致的。
2. 为什么使用:适当的环境中,可以减少线程上下文切换。
3. 原理:编译后,会据计算机硬件体系不同,生成相应的lock指令。lock指令在多核体系中会做两件事情:
a. 处理器的缓存行数据回写到系统内容
b. 回写系统内存时,处理器中缓存了给内容地址的数据将无效
4. 应用案例:LinkedTransferQueue, 填充64字节节点,使表头表尾不会在同一个缓存行,避免锁定表头时也锁定表尾。
二, 锁级别
偏量级锁--> 轻量级锁--> 重量级锁
只升级,不降级
三. 线程池
1. cpu密集型
2. io密集型
3. 混合型
四. ConcurrentHashMap
1. HashMap非线程安全
2. HashTable会同时锁住put,get方法
3. ConcurrentHashMap 分段锁,get不需加锁,volatile定义相关变量,put需加锁,添加元素时判断是否segment需扩容,size统计是先两次统计modCount,相等则不会加锁,否则会锁put,remove,clean方法
五. 原子性
硬件:
1. 确保单位(字节)操作原子性
2. 总行锁
3. 缓存行锁
软件:
1. 循环cas
2. 互斥锁