Fork me on GitHub

Java中的锁优化

  • 自旋锁: 让请求锁的线程执行一个忙循环(自旋),不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁

    自选等待时间必须要有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,就应当使用传统方式挂起线程

  • 自旋适应锁: 自旋的时间不在固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。

    如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且尺有所 的线程正在运行中,那么自旋等待时间将会持续相对更长;如果对于某个锁,自旋很少成功获得过,拿在以后要获取这个锁时将可能省略掉自旋过程

  • 锁消除: 虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不存在共享数据竞争的锁进行消除

  • 锁粗化: 虚拟机探测到有一串零碎的操作对同一对象加锁,将会把加锁同步的范围扩展(粗化)到整个操作序列的外部,例如:

    1
    2
    3
    4
    5
    6
    7
    public String concatString(String s1, String s2, String s3) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    sb.append(s3);
    return sb.tostring();
    }

这里原先每次append操作都需要加一次锁,而虚拟机会扩展到第一个append操作之前到最后一个append操作之后,就只需要加一次锁

  • 轻量级锁: 轻量级是相对于使用操作系统互斥量来实现的传统锁而言的,传统的锁机制称为“重量级”锁

    轻量级锁在没有多线程竞争的前提下,减少传统的重量级锁产生的性能消耗。

  • 偏向锁: 消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能,即在无精准的情况下把整个同步都消除掉

-------------本文结束感谢您的阅读-------------