admin 管理员组

文章数量: 1086019


2024年3月21日发(作者:异步fifo验证报告)

synchronized关键字的用法以及原理

synchronized关键字用于控制多个线程对共享资源的访问。它

可以修饰方法、代码块和静态方法,实现线程之间的同步。

使用synchronized关键字可以实现两种类型的锁:对象锁和类

锁。

1. 对象锁(方法锁、代码块锁):

- 修饰非静态方法:当一个线程访问该对象的同步方法时,

其他线程无法同时访问该对象的其他同步方法,但可以同时访

问非同步的方法。

- 修饰代码块:当一个线程访问该对象的同步代码块时,其

他线程无法同时访问该对象的其他同步代码块,但可以同时访

问非同步的代码块。

2. 类锁(静态方法锁):

- 修饰静态方法:当一个线程访问该类的同步静态方法时,

其他线程无法同时访问该类的其他同步静态方法,但可以同时

访问非同步的静态方法。

原理:

- 对象锁通过实例对象的监视器锁(monitor)来实现。每个对

象实例都会关联一个监视器,同一时刻只能有一个线程获得该

监视器的锁,其他线程需要等待。

- 类锁通过类的Class对象的监视器锁来实现。同一时刻只能

有一个线程获得该监视器的锁,其他线程需要等待。

当一个线程获取了对象锁或类锁之后,可以执行被修饰的代码。

其他线程如果在获取锁时发现已被占用,就会进入等待状态,

直到获取到锁才能执行同步代码。

synchronized关键字的原理是基于Java对象头的Mark Word标

记和monitor对象监视器实现的。当一个线程获取对象锁或类

锁时,会将锁的状态记录在对象头的Mark Word中,其他线

程通过读取Mark Word来判断锁的状态。如果锁是被占用状

态,等待线程会进入到monitor对象的等待队列中,等待被唤

醒。当持有锁的线程释放锁时,会唤醒等待队列中的一个线程,

使其获取锁并执行同步代码。


本文标签: 对象 线程 等待 代码 访问