Java中的同步方法和同步块有什么区别? [复制]

2023-12-09

Java 中的同步方法和同步块有什么区别?

我一直在网上寻找答案,人们似乎对此很不确定:-(

我的看法是,两者之间没有区别,除了同步块的范围可能更本地化,因此锁定的时间会更短?

如果对静态方法加锁,那么加锁的对象是什么?类锁定是什么意思?


同步方法使用方法接收者作为锁(即this对于非静态方法,以及静态方法的封闭类)。Synchronized块使用表达式作为锁。

所以从锁定的角度来看,以下两种方法是等效的:

synchronized void mymethod() { ... }

void mymethod() {
  synchronized (this) { ... }
}

对于静态方法,类将被锁定:

class MyClass {
  synchronized static mystatic() { ... }

  static mystaticeq() {
    syncrhonized (MyClass.class) { ... }
  }
}

对于同步块,您可以使用任何非null对象作为锁:

synchronized (mymap) {
  mymap.put(..., ...);
}

锁定范围

对于同步方法,锁将在整个方法范围内保持,而在synchronized块,仅在该块范围(也称为临界区)期间持有锁。在实践中,JVM 可以通过从 JVM 中删除一些操作来进行优化。synchronized如果能够证明可以安全地完成,则阻止执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的同步方法和同步块有什么区别? [复制] 的相关文章

随机推荐

  • 如何过滤 Quickblox 用户?

    我想根据应用程序用户的电话号码或电子邮件过滤他们 但我不希望完全匹配 而是用户应返回的部分电子邮件或部分号码作为响应 Quickblox iOS SDK 有办法吗 假设我有一些 Quickblox 用户 如下所示 ID NAME Email
  • Swift 类中的静态与类函数/变量?

    以下代码在 Swift 1 2 中编译 class myClass static func myMethod1 class func myMethod2 static var myVar1 func doSomething myClass
  • 素数生成器逻辑

    我应该去上课PrimeNumberGenerator其中有一个方法nextPrime这将打印出用户输入的数字之前的所有质数 Ex Enter a Number 20 2 3 5 7 11 13 17 19 我们的老师告诉我们应该使用嵌套fo
  • VBScript“类型不匹配”问题与“[in, out] BSTR *”参数

    我正在使用第三方 COM 对象 该对象的一些方法将值作为 BSTR 指针传回 由于 VBscript 仅支持 Variant 类型 尝试以类似 Object Method sMyString 的方式使用会合理地以 类型不匹配 错误结束 我怀
  • 如何使用切换添加和删除必需的属性

    我的用户可以访问表单 为了简化任务 我放置了一个可选择的列表 但如果答案不在列表中 他们可以手动添加原因 默认情况下需要选择列表 但如果用户访问文本字段 则该文本字段将成为必需的 并且不再需要该列表 反之亦然 HTML div class
  • Spark / Scala:使用最后一次观察进行前向填充

    使用 Spark 1 4 0 Scala 2 10 我一直在试图找出一种方法来用最后一个已知的观察结果转发填充空值 但我没有看到一个简单的方法 我认为这是一件很常见的事情 但找不到显示如何执行此操作的示例 我看到用值向前填充 NaN 的函数
  • 上一个片段在新片段下方可见

    我有一个带有 ViewPager 的 TabLayout ViewPager 有四个片段 F1 F2 F3 和 F4 F1 包含一个 FrameLayout 它可以有 2 个片段 F11 和 F12 最初 我使用以下代码在 FrameLay
  • ANTLR解析MismatchedTokenException

    我正在尝试为我正在编写的更简单的语言编写一个简单的解析器 它由后缀表达式组成 到目前为止 我的解析器遇到了问题 当我在输入上运行它时2 2 test gt gt 我收到 MismatchedTokenException 另外 我将如何实现递
  • foreach 不适用于 getElementsByTagName 创建的数组

    当我通过使用 document getElementsByTagName 收集网页中的按钮来创建数组时 我无法使用 forEach 对于前 var deleteButtons document getElementsByTagName bu
  • payU 支付网关 Android 集成中缺少哈希参数

    我需要在我的 Android 应用程序中集成 payU 支付网关 但是当应用程序尝试获取哈希密钥时 它给我错误消息 哈希参数丢失 在演示应用程序中 有两个选项可以生成哈希值 if null salt generateHashFromServ
  • 在 for 循环中使用 ggarrange 排列多个绘图

    我想使用以下代码在一张图像中排列多个绘图 mydataframe lt data frame number1 sample 1 140 size 200 replace TRUE number2 sample 1 4000 size 200
  • 将输入流转换为对象列表

    我必须制作一个 jar 来访问 API 来获取人员详细信息列表 该列表基本上有四个字段 id 姓名 薪水 部门 我正在使用 apache httpclient 执行 get 请求 该请求在点击 API 时为我提供了一个 httpentity
  • 对组合框中的项目进行分组

    我有一个 ListView 其中包含两种类型的对象 单个对象和多个对象 单个是普通的 TextBlock 而多个是包含项目的 ComboBox 我试图对组合框中的项目进行分组 但没有成功 是否可以 或者我应该采取不同的方法 我想要实现的目标
  • Python 3.5 + PyQt5 到独立 exe

    我是编码新手 我需要将 py 文件转换为 exe 我尝试了 py2exe 但它不适用于 python 3 5 然后我尝试了pyinstaller 它起作用了 但是当我将PyQt5添加到程序中时 pyinstaller也失败了 我尝试了 nu
  • Ipython Notebook 和 Matplotlib:如何在 html div 中包装绘图?

    我想添加一些css到我的情节的一部分 具体来说 我想设置float left 我怎样才能在div中生成绘图 这样我就可以使用css控制它的布局 例如 对于代码 def simple plot ax None if ax is None fi
  • 用于多行标题的 JTable 标题文本换行(自定义 TableCellRenderer)

    如何获取多行 JTable 标题 其中标题列正确放大以适合某些文本 然后换行到新行 如下所示 目前搜索上述需求返回了很多解决方案 但没有一个真正解决问题 http www javarichclient com multiline colum
  • 为什么我要在 C 中按值传递函数参数?

    我正在通过我的一些 C 库来磨练我的 C 技能 在完成第一个工作实现之后 我现在正在检查代码以使其更加高效 目前我正在讨论通过引用或值传递函数参数的主题 我的问题是 为什么我要在 C 中按值传递任何函数参数 代码可能看起来更干净 但它不是总
  • Visual Studio 的 Eclipse 按键绑定

    有人有类似 VS 2005 的可用于 Eclipse 的键绑定方案吗 如何将其导入 Eclipse 的首选项 我只看到导出按钮 如何在 Eclipse 中安装 Visual Studio 键绑定 Helios 及以上版本 对于找到这篇文章的
  • 由于 ExtensionlessUrlHandler,WebAPI 重写规则失败

    我正在尝试使用 IIS 将请求从 ASP net MVC 4 应用程序重写到 ASP net MVC 4 WebApi 从客户端 我使用 ajax 回调服务器 然后我希望服务器重写请求以指向 webapi 站点 如果我能让它工作 这应该可以
  • Java中的同步方法和同步块有什么区别? [复制]

    这个问题在这里已经有答案了 Java 中的同步方法和同步块有什么区别 我一直在网上寻找答案 人们似乎对此很不确定 我的看法是 两者之间没有区别 除了同步块的范围可能更本地化 因此锁定的时间会更短 如果对静态方法加锁 那么加锁的对象是什么 类