一 自旋锁
如果物理机器有一个以上的处理器,能让两个或两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程稍微等一下,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需让线程执行一个忙循环(自旋),这项技术就是自旋锁。
自旋等待本身虽然避免了线程切换的开销,但它是要占用处理器时间的,因此如果锁被占用的时间很短,自旋等待效果就会很好,但是如果锁占用处理器时间很长,那么自旋的线程只会白白地消耗处理器的资源,因此自旋等待的时间必须要有一定的限度。
二锁粗化
如果虚拟机探测到有这样一串零碎的操作都对同一个对象加锁,则会把加锁同步的范围扩展(粗化)到整个操作序列的外部。
三轻量级锁
轻量级锁并不是用来代替重量级锁的,是在没有多线程竞争的前提下,减少传统重量级锁使用操作系统互斥量产生的性能消耗。。
对象头分为两部分:一部分用于存储对象自身的运行时数据(MarkWord),另一部分用于存储指向方法区对象类型的数据之神
四偏向锁
如果说轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量,那么偏向锁就是在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了。
偏向锁可以提高带有同步但无竞争的程序性能。