Java中synchronized关键字的使用和原理详解
更新时间:2023年09月19日 10:55:05 作者:风过无痕2018
这篇文章主要介绍了Java中synchronized关键字的使用和原理详解,JVM 是通过进入、退出 对象监视器(Monitor)来实现对方法、同步块的同步的,而对象监视器的本质依赖于底层操作系统的互斥锁实现,需要的朋友可以参考下
实现原理
- JVM 是通过进入、退出 对象监视器(Monitor) 来实现对方法、同步块的同步的,而对象监视器的本质依赖于底层操作系统的 互斥锁(Mutex Lock) 实现。
- 具体实现是在编译之后在同步方法调用前加入一个monitor.enter指令,在退出方法和异常处插入monitor.exit的指令。
- 对于没有获取到锁的线程将会阻塞到方法入口处,直到获取锁的线程monitor.exit之后才能尝试继续获取锁。
有三种使用方式:
- 修饰同步代码块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象。
- 修饰普通方法,即同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象。
- 修饰静态方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象。
synchronized修饰同步代码块


在同步代码块的入口和出口分别有monitorenter和monitorexit指令。当执行monitorenter指令时,线程试图获取锁也就是获取monitor(monitor对象存在于每个Java对象的对象头中,synchronized锁便是通过这种方式获取锁的) 两个monitorexit确保发生异常时也能释放锁
synchronized修饰普通方法
在synchronized修饰普通方法时是添加ACC_SYNCHRONIZED标识,该标识指明了该方法是一个同步方法,JVM通过该ACC_SYNCHRONIZED访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。

synchronized修饰静态方法
访问标识为ACC_STATIC , ACC_SYNCHRONIZED

到此这篇关于Java中synchronized关键字的使用和原理详解的文章就介绍到这了,更多相关synchronized的使用和原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
RabbitMQ 避免消息重复消费的方法
消费者端实现幂等性,意味着消息永远不会消费多次,即使收到了多条一样的消息,这篇文章给大家分享RabbitMQ 避免消息重复消费的方法,感兴趣的朋友一起看看吧
2024-03-03
ArrayList底层操作机制源码解析
这篇文章主要介绍了ArrayList底层操作机制源码解析,当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍,需要的朋友可以参考下
2023-09-09
java8 如何实现分组计算数量和计算总数
这篇文章主要介绍了java8 如何实现分组计算数量和计算总数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2021-07-07
Java实现萝卜勇者游戏的示例代码
《萝卜勇者》是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利。本文将利用Java实现这一游戏,感兴趣的可以了解一下
2022-02-02
java web实现自动登录
这篇文章主要为大家详细介绍了java web实现自动登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2021-08-08
Springboot整合WebSocket实战教程
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据,这篇文章主要介绍了Springboot整合WebSocket实战教程,需要的朋友可以参考下
2023-05-05
java8异步调用如何使用才是最好的方式
异步调用主要用于当前程序的执行不用等待调用方法执行结束就可以继续执行,下面这篇文章主要给大家介绍了关于java8异步调用如何使用才是最好的方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-01-01
最新评论