admin 管理员组文章数量: 1086019
2024年3月21日发(作者:异步fifo验证报告)
synchronized关键字的用法以及原理
synchronized关键字用于控制多个线程对共享资源的访问。它
可以修饰方法、代码块和静态方法,实现线程之间的同步。
使用synchronized关键字可以实现两种类型的锁:对象锁和类
锁。
1. 对象锁(方法锁、代码块锁):
- 修饰非静态方法:当一个线程访问该对象的同步方法时,
其他线程无法同时访问该对象的其他同步方法,但可以同时访
问非同步的方法。
- 修饰代码块:当一个线程访问该对象的同步代码块时,其
他线程无法同时访问该对象的其他同步代码块,但可以同时访
问非同步的代码块。
2. 类锁(静态方法锁):
- 修饰静态方法:当一个线程访问该类的同步静态方法时,
其他线程无法同时访问该类的其他同步静态方法,但可以同时
访问非同步的静态方法。
原理:
- 对象锁通过实例对象的监视器锁(monitor)来实现。每个对
象实例都会关联一个监视器,同一时刻只能有一个线程获得该
监视器的锁,其他线程需要等待。
- 类锁通过类的Class对象的监视器锁来实现。同一时刻只能
有一个线程获得该监视器的锁,其他线程需要等待。
当一个线程获取了对象锁或类锁之后,可以执行被修饰的代码。
其他线程如果在获取锁时发现已被占用,就会进入等待状态,
直到获取到锁才能执行同步代码。
synchronized关键字的原理是基于Java对象头的Mark Word标
记和monitor对象监视器实现的。当一个线程获取对象锁或类
锁时,会将锁的状态记录在对象头的Mark Word中,其他线
程通过读取Mark Word来判断锁的状态。如果锁是被占用状
态,等待线程会进入到monitor对象的等待队列中,等待被唤
醒。当持有锁的线程释放锁时,会唤醒等待队列中的一个线程,
使其获取锁并执行同步代码。
版权声明:本文标题:synchronized关键字的用法以及原理 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1710989739a583022.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论