线程安全与同步 & 锁优化

线程安全与同步

  1. 无同步:A. 可重入代码;B. ThreadLocal

  2. 互斥同步(阻塞同步):synchronized/Lock
    Lock的优势:可中断;可有多个newCondition;自定义是否公平锁

  3. 非阻塞同步:
    CAS – 机器指令实现 – Unsafe

    	Loop:
    		...
    		CAS
    		...
    

    CAS问题:

    A. ABA问题 – 解决:加锁
    B. 循环等待问题 – 解决:机器指令pause
    C. 一个变量原子性,多个变量需要 – 解决:锁 or 拼接多个变量

锁优化

  1. 自旋锁/自适应自旋
    A. 等待10次
    B. 根据上次获取锁时间自适应等待:自旋 or 切换线程状态从用户态到和心态

  2. 锁消除:消除多余的加锁操作

  3. 锁粗化:将多个频繁的可合并锁粗化为一个

  4. 轻量级锁、偏向锁
    主要是针对锁竞争不激烈的情景,提高锁利用率
    借助对象head部分的信息(MarkWord)
    |- 01 - 偏向锁
    |- 00 - 轻量级锁
    |- 10 - 重量级锁
    |- 11 - GC

    出现竞争时状态转换:偏向锁(记录threadID)---->轻量级锁(CAS)---->重量级锁

你可能感兴趣的:(Java)