目的是为了在线程之间更高效的共享数据,以及解决竞争问题,挺高程序的执行效率。JDK中做了如下优化:
自旋锁:
因为在互斥同步的时候,挂起线程和恢复线程的操作都需要转入内核态中执行,很大的影响性能。有时候对共享数据的锁定只会持续很短的时间,在这段时间内去挂起和恢复线程很浪费资源。所以在一个线程占用共享变量时,其他线程此时不值得挂起,可以让其他线程处于忙循环(自旋)状态,等上一个线程释放锁后,其他线程再去竞争锁。JDK1.6中默认开启。
锁消除:
是指虚拟机在即时编译器在运行时,有些代码做了同步操作,但是检测到根本不可能会出现共享数据竞争的情况,所以会对加上的锁进行消除。
锁粗化:
一般情况下,我们尽量把同步块作用范围限制的尽可能小。若在一段代码中频繁的加锁解锁,其性能会大大降低,这样我们可以扩大锁的作用域,这样只需要加一次锁就可以了。
轻量级锁:
传统的锁机制称为“重量级”锁。轻量级锁是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗,但无法替代重量级锁。
偏向锁:
目的是消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能。