- 偏向锁
适合在只有一个线程执行同步代码时,提升性能
线程进入同步代码块是,会通过CAS(compare and swap)操作,设置对象头的锁标志位,如果标志位的线程id为空,则设置为当前线程id,成功获得锁;如果不为空,判断是否是当前线程,如果是,成功获得锁,如果不是,说明有其它线程访问过,则升级为轻量级锁。 - 轻量级锁
适合在两个线程交替执行的时候,并发程度小,提升性能
jvm在当前线程栈帧中设置锁记录,然后通过CAS操作把对象头的轻量级锁的指针指向锁记录,如果失败,先检查是否已获得锁,未获得,则会自旋,自旋多次后仍然失败,升级为重量级锁 - 重量级锁
适合高并发的场景
通过CAS操作将monitor的owner设置为当前线程,如果成功,获得锁,或者重入加1,否则未获得锁,线程会被挂起,在等待队列里等待被系统唤醒
网友评论