java锁机制

锁的作用:
在Java中synchronized关键字被常用于维护数据一致性。

synchronized机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的。

Java开发人员都认识synchronized,使用它来实现多线程的同步操作是非常简单的,只要在需要同步的对方的方法、类或代码块中加入该关键字,它能够保证在同一个时刻最多只有一个线程执行同一个对象的同步代码,可保证修饰的代码在执行过程中不会被其他线程干扰。使用synchronized修饰的代码具有原子性和可见性,在需要进程同步的程序中使用的频率非常高,可以满足一般的进程同步要求。

锁的状态:

  • 无锁状态
    无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。
  • 偏向锁
    偏是偏心、偏向的意思。当没有线程竞争的时候,偏向于第一个获得这个资源的线程。
    无竞争的情况下把整个同步都消除掉。
  • 轻量级锁
    无竞争的情况下使用CAS消除同步使用的互斥量。
    在代码即将进入同步块的时候,JVM 会在栈空间中开辟一块空间(Lock Record),然后将对象头的Mark Word复制到Lock Record 中。JVM会使用CAS操作尝试将对象的MarkWord更新为指向Lock Record,并且将对象的Mark Word 的锁标志位转变为00,表示当前对象处于轻量级锁定状态。如果这个操作失败了,说明有其他线程于当前线程竞争,虚拟机会首先检测对象的Mark Word是否只想当前线程的栈帧,如果是当前线程已经拥有了这个对象的锁,那么直接进入同步块继续执行,否则说明这个锁已经被其他线程占用了,那么会膨胀为重量级锁,锁标志位变为10,后面等待锁的线程也必须进入阻塞状态。
  • 重量级锁
    用户态转化为内核态,进入阻塞状态。

锁的优化:
自旋
锁消除
锁粗化

锁的升级过程:
锁的对象:

你可能感兴趣的