为什么会有这四种锁机制,因为在多线程并发的过程中,如果一个线程持有锁且很快就要执行完成,另一个线程来临,如果让第二个线程阻塞的话,代价有点大,要重新走到就绪–>运行状态中去。所以,出现了这四种锁机制。
偏向锁:当一个线程访问对象时,它会偏向这个线程,此时对象持有偏向锁。偏向此时访问它的第一个线程,这个线程将对象头中的ThreadID改为自己的ID,之后再次访问这个对象的时候,只需要对比ID,不需要再使用CAS再进行操作。
轻量锁:当一个对象此时为偏向锁的时候,另一个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象此时的偏向锁状态。这时对象已经存在竞争了,此时检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,而且还要继续持有偏向锁,则偏向锁升级为轻量级锁。
自旋锁:当一个对象此时是轻量级锁时,当前线程持有锁并且正在使用对象,而可能很快就会执完成。所以此后另一个线程可以先等待一下(自旋),并不进入阻塞状态。
重量锁:一个自旋超过一定次数,自旋锁会升级为重量锁。或者,此时一个线程持有锁,另一个线程在自旋,第三个线程来访,此时自旋锁也会升级为重量锁。