多线程访问同步方法的7种情况(面试常考)
1.
2.
3
4.同时访问同步方法和非同步方法
synchronized只作用于用它修饰的方法,没有加synchronized 的方法不会受到影响,
如图可以看出加了synchronized修饰符的方法和没有加的方法是同步执行的,也就是说互不影响
5.同时访问一个类的普通同步方法
对于同一个实例来说,他们拿到了同一把锁,没办法同时运行,而是串行
*虽然synchronized没有指明用那一把锁,但是其背后原理已经指明他们用了同一把锁,因为他们用了同一把锁*
同一个实例
如果不是同一个实例,则普通同步方法各自会获得一把锁,能够并发执行
6.同时访问静态synchronize方法和非静态synchronized方法
因为它们两个拿到了不同的锁,所以是并行执行的,
7.方法抛出异常后,会释放锁
方法抛出异常后,会释放锁,一旦抛出异常后,第二个线程会立刻进入同步方法,意味着锁已经释放
个人认为还有一种:同时访问多个静态synchronize方法
这种形式他们拿到的只是同一把锁,所以不能并行执行,所以要按照顺序一个线程执行完再到另外一个线程
总结
1.一把锁只能同时被一个线程获取,没有拿到锁的必须等待
2,每个实例都有自己对应的一把锁,不同实例之间互不影响,例外:(锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象共同拥有一把锁)
3.无论是方法正常执行完毕或者是方法抛出异常,都会释放锁,
4,在一个被synchronized修饰的方法里面调用了一个没有被synchronized修饰的方法线程安全吗?
答案是不安全,因为synchronized只对修饰本生的方法起作用,对其他方法不起作用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端