锁的作用:
在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,前面期待锁的线程也必须进入阻塞状态。
  • 重量级锁
    用户态转化为内核态,进入阻塞状态。

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

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