synchronized关键字的用法以及原理

synchronized关键字的用法以及原理


2024年1月24日发(作者:)

synchronized关键字的用法以及原理

synchronized关键字用于控制多个线程对共享资源的访问。它可以修饰方法、代码块和静态方法,实现线程之间的同步。

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

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

- 修饰非静态方法:当一个线程访问该对象的同步方法时,其他线程无法同时访问该对象的其他同步方法,但可以同时访问非同步的方法。

- 修饰代码块:当一个线程访问该对象的同步代码块时,其他线程无法同时访问该对象的其他同步代码块,但可以同时访问非同步的代码块。

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

- 修饰静态方法:当一个线程访问该类的同步静态方法时,其他线程无法同时访问该类的其他同步静态方法,但可以同时访问非同步的静态方法。

原理:

- 对象锁通过实例对象的监视器锁(monitor)来实现。每个对象实例都会关联一个监视器,同一时刻只能有一个线程获得该监视器的锁,其他线程需要等待。

- 类锁通过类的Class对象的监视器锁来实现。同一时刻只能有一个线程获得该监视器的锁,其他线程需要等待。

当一个线程获取了对象锁或类锁之后,可以执行被修饰的代码。其他线程如果在获取锁时发现已被占用,就会进入等待状态,直到获取到锁才能执行同步代码。

synchronized关键字的原理是基于Java对象头的Mark Word标记和monitor对象监视器实现的。当一个线程获取对象锁或类锁时,会将锁的状态记录在对象头的Mark Word中,其他线程通过读取Mark Word来判断锁的状态。如果锁是被占用状态,等待线程会进入到monitor对象的等待队列中,等待被唤醒。当持有锁的线程释放锁时,会唤醒等待队列中的一个线程,使其获取锁并执行同步代码。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1706089801a1439925.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信