专门做顶账房的网站,有关做生态环境的官方网站,网站建设制作pdf,企业所得税优惠政策2022年最新在Java中#xff0c;synchronized 关键字是实现线程同步的一种方式#xff0c;它涉及到锁的升级和释放的过程。理解synchronized 锁的升级可以分为三个阶段#xff1a;无锁状态、偏向锁状态和轻量级锁状态。 无锁状态#xff1a; 当对象被创建时#xff0c;默认处于无锁状…在Java中synchronized 关键字是实现线程同步的一种方式它涉及到锁的升级和释放的过程。理解synchronized 锁的升级可以分为三个阶段无锁状态、偏向锁状态和轻量级锁状态。 无锁状态 当对象被创建时默认处于无锁状态。多个线程可以同时访问对象的方法不会进行同步操作因此不存在锁竞争。 偏向锁状态 当某个线程第一次访问一个synchronized 方法或代码块时Java 虚拟机会在对象头中的标记字段中记录当前线程的标识符。如果以后没有其他线程来竞争锁则该线程可以在进入和退出同步块时不需要进行CAS操作来加锁和解锁从而节省了操作时间。 轻量级锁状态 当存在多个线程访问同步块时偏向锁会升级为轻量级锁。Java 虚拟机通过CAS操作尝试获取锁如果成功则将对象头中的标记字段改为指向锁记录的指针此时其他线程访问同步块时会进行自旋等待。如果自旋等待成功线程就可以进入同步块如果自旋等待失败表示存在竞争轻量级锁会膨胀为重量级锁。 重量级锁状态 如果自旋等待不成功轻量级锁就会膨胀为重量级锁。这时候锁的状态会被升级为重量级锁重量级锁是通过操作系统的互斥量实现的会导致线程进入阻塞状态性能较差。
synchronized 锁在运行时会根据竞争的情况逐步升级锁的状态从无锁到偏向锁再到轻量级锁最后才是重量级锁。这种锁升级的过程是为了在保证数据安全的前提下尽量减少锁带来的性能开销。