synchronized关键字的底层原理
2023-12-18 17:18:43
底层原理:在Java虚拟机中,每个对象都会有一个监视器锁,也称为内部锁或对象锁。这个锁是用来实现线程同步的机制。当多个线程同时访问同一个对象的synchronized代码块或方法时,只有一个线程能够获取到这个对象的监视器锁,其他线程需要等待。
具体来说,当一个线程执行到一个synchronized代码块时,它需要先获得synchronized代码块所属对象的监视器锁。如果这个锁没有被其他线程占用,那么当前线程就可以进入synchronized代码块执行相应的操作;如果这个锁已经被其他线程占用,那么当前线程就会被阻塞,直到获得锁为止。
对于实例方法(即非静态方法)上的synchronized关键字,它锁定的是当前实例对象的监视器锁;对于静态方法上的synchronized关键字,它锁定的是当前类的Class对象的监视器锁;对于代码块上的synchronized关键字,它锁定的是指定的对象的监视器锁。
下面是一些示例代码来演示synchronized关键字的使用:
- 使用在实例方法上的synchronized关键字:
public class Example {
public synchronized void synchronizedMethod() {
// synchronized代码块
// ...
}
}
- 使用在静态方法上的synchronized关键字:
public class Example {
public static synchronized void synchronizedMethod() {
// synchronized代码块
// ...
}
}
- 使用在代码块上的synchronized关键字:
public class Example {
public void method() {
synchronized (this) {
// synchronized代码块
// ...
}
}
}
需要注意的是,synchronized关键字虽然可以确保线程同步,但它的性能可能较低,因为它会造成线程的阻塞和切换。在Java 5之后,另一种更高效的线程同步机制ReentrantLock也被引入,它提供了更灵活的锁定方式,并且可以显示地控制锁的获取和释放。在实际开发中,应根据具体的需求来选择合适的线程同步机制。
文章来源:https://blog.csdn.net/Flying_Fish_roe/article/details/135064804
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!