一.自旋锁:
在JDK1.6之前,在多处理器上,两个线程并行执行访问同一个对象锁时,其中一个线程持有了对象锁之后,另一个线程不会被挂起,而是继续占用CPU资源进行一定次数的轮询等待获取锁,超过次数则被挂起,默认是10次,可以通过参数-XX PreBlockSpin更改.
在JDK1.6之后,自旋的时间不在固定,而是由前一次在同一个锁上的自旋时间以及锁的拥有者的状态来决定,也就是在同一个锁对象上,自旋等待刚刚成功了并且锁的拥有者的线程正在运行,那么虚拟机就会认为此次自旋也很有可能成功,换句话说,如果前面锁对象的拥有者自旋都没有成功,那么现在也不会去进行自旋等待获取锁了.这是一种自适应自旋锁.
目的:减少挂起线程和恢复线程之间的用户态到内核态之间的转换所带来的性能影响.
操作参数:-XX:+UseSpinning,JDK1.6之后是默认开启
二.锁消