Synchronized修饰同步非静态方法、同步静态方法、同步代码块的区别

news/2024/5/17 17:47:17 标签: 并发编程, Synchronized

Synchronized修饰同步非静态方法、同步静态方法、同步代码块的区别

首先需要知道,每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步(获取哪个对象的锁)?

同步方法:
1):同步静态方法:某个类Object中的某个静态方法staticMethod加上同步锁之后,当某个线程 Thread 调用staticMethod时该线程会获取Object类的锁(当前Object的锁没被其它线程获取时,若当前Object锁被其它锁获取则会进行等待。),此时其他任何线程在Thread释放锁前都无法调用Object类中任何的同步静态方法。

2):同步非静态方法:某个类Object中的某个非静态方法Method加上同步锁之后,当某个线程Thread调用Method时会获取所对应的Object对象的锁,此时其他线程在Thread释放锁前都无法调用该对象中的任何同步非静态方法(所有非静态同步方法都共用其所属的对象的锁)

3):两者区别
前提:Object 中包含静态同步方法staticMethod01,staticMethod02,非静态同步方法Method01,Method02,线程Thread1和Thread2:
Object obj1 = new Object();
Object obj2 = new Object();

(该对象的非静态方法都锁了)
a.当Thread1调用obj1.Method01()时,若Thread2想调用obj1.Method01()或者obj1.Method02()都需要先等待obj1.Method01()执行完释放锁才能进行调用。
(不同对象的随便调用)
b.当Thread1调用obj1.Method01()时, Thread2可以不用等待Thread01释放锁即可调用obj2.Method01()或者 obj2.Method02();因为非静态同步方法的锁是相对于对象(new 出来的实例)而言。

(通杀,所有的对象的静态方法都上锁了)
c.当Thread1 调用obj1.staticMethod01()时,Thread2不管是调用obj1.staticMe01()还是obj2.staticMethod01()都需要等待Thread1释放锁后才能进行调用。因为静态同步方法的锁是相对于类而言

同步代码块跟同步方法的异同:

  1. 同步方法是指对整个方法进行加锁同步,而同步块是指对方法内的某个代码块进行加锁同步。
  2. 同步方法的锁用的是其实例对象本身,而同步代码块的锁可以自己指定。
  3. 同步代码块如果括号里是this(实例),则与同步非静态方法效果一致;如果括号里是*.Class,则与同步静态方法效果一致。
    同步代码块,同步方法,同步静态方法,同步非静态方法的区别

http://www.niftyadmin.cn/n/235834.html

相关文章

剖析多利熊业务如何基于分布式架构实践稳定性建设

作者 | 百度小程序团队 导读 多利熊稳定性建设,是指为了确保系统或服务,在生产环境中的稳定性而采取的一系列措施和优化。这包括但不限于监控、预警、容错、自动化、规范、质量等方面的优化。通过稳定性建设,可以提高系统的可靠性和可用性&am…

Froala V4.0.18 Crack Froala 编辑器

Froala V4.0.18:复制和粘贴图像变得更好,还有更多! 2023 年 3 月 25 日最忠实用户编辑器,新版本发表评论Froala Editor团队很高兴地宣布发布Froala Editor 4.0.18。这个新版本在质量和稳定性方面有很多改进,并修复了客…

C# winform程序进程之间互相通信

在C# WinForm程序中,可以使用多种方式实现程序之间的通信。以下列举了几种常见的方式: 网络通信 使用网络通信方式,将需要传递的数据打包成网络包,在不同的程序之间传输数据。在C#中,可以使用Socket、HttpWebRequest、…

2023年4月北京/西安/郑州/深圳CDGA/CDGP数据治理认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

【每日一题Day178】LC1042不邻接植花 | 位运算 + 枚举

不邻接植花【LC1042】 有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有 3 条路径可以进入或离开. 你需…

NBT - 生成式蛋白设计,AI带来的蛋白质工程飞跃

科学家们创建了一个能够从头合成人工酶的人工智能系统。实验测试发现,一些酶与自然界中发现的酶具有相同的功效,即使人工生成的氨基酸序列与任何已知的天然蛋白质明显不同。实验表明,尽管自然语言处理是为了阅读和编写语言文本而开发的&#…

学习笔记 —— C++并行库OpenMP

ContentsInstallationImplement1、一个最简单的OpenMP代码:2、如何规定线程数2、如何设置OpenMP分配线程的schedule3、 冲突避免机制 --Reduction(规约)Discovery写在最前面: 并行化虽好,但并不是所有任务在并行化后都…

数据爬虫爬数据时常遇到的问题

第一,可能不能直接通过pyppeteer简单的直接page.querySelectorAll()获取所有元素然后直接 str(await (await element_songer_name.getProperty("title")).jsonValue()) 得到数据值,主要原因可能是#document问题, 所以遇到这个问题…