在 Java 临界区中,我应该同步什么?

2023-11-25

在 Java 中,在代码中声明临界区的惯用方法如下:

private void doSomething() {
  // thread-safe code
  synchronized(this) {
    // thread-unsafe code
  }
  // thread-safe code
}

几乎所有块都同步this,但这有什么特殊原因吗?还有其他的可能性吗?关于同步哪些对象有任何最佳实践吗? (例如私有实例Object?)


正如前面的回答者所指出的,最佳实践是在有限范围的对象上进行同步(换句话说,选择您可以摆脱的最严格的范围,然后使用它。)特别是,同步this这是一个坏主意,除非您打算允许您的班级的用户获得锁定。

但是,如果您选择在java.lang.String。字符串可以(并且在实践中几乎总是)被保留。这意味着每个字符串的内容相同 - 在整个 JVM- 事实证明幕后是同一个字符串。这意味着,如果您在任何字符串上进行同步,另一个(完全不同的)代码段也锁定具有相同内容的字符串,实际上也会锁定您的代码。

我曾经对生产系统中的死锁进行故障排除,并且(非常痛苦地)将死锁跟踪到两个完全不同的开源包,每个包在一个 String 实例上同步,其内容都是"LOCK".

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

在 Java 临界区中,我应该同步什么? 的相关文章

随机推荐

  • 以编程方式关闭Android应用程序[重复]

    这个问题在这里已经有答案了 如何以编程方式关闭我的应用程序 I used finish Or android os Process killProcess android os Process myPid Or System exit 0
  • 是否可以在命令提示符中创建具有多个选项卡的 CSV 文件? [关闭]

    Closed 这个问题是无关 目前不接受答案 我正在创建一个可以在显示 2 个选项卡的 Excel 中打开的 csv 文件 然而 问题是我编写的脚本必须位于批处理文件 命令提示符 中 我在网上看到了一些方法 但它们都是JAVA程序 我不确定
  • 如何在 Selenium 中自动接受 Chrome 的“始终在关联应用程序中打开这些类型的链接”对话框

    我正在使用 Selenium 和 C 进行自动化测试 并且需要从浏览器打开一个外部应用程序 问题是 我总是收到此通知 它会阻止测试执行 有谁知道如何处理这个问题 Chrome 将接受协议处理程序的设置存储在用户配置文件中 从 Seleniu
  • 使用 Cython 包装 C++ 类时处理指针

    我在使用 cython 处理指针时遇到问题 该类的 cython 实现持有一个指向该类的 C 实例的指针Person 这是我的 pyx file 人 pyx cdef class PyPerson cdef Person pointer d
  • PLSQL 中的反思?

    我正在编写一个过程来处理存储在 ANYDATA 中的用户定义对象 对象类型和属性名称只能在运行时知道 因此我无法在声明部分为其定义变量 在Java中 我可以使用反射来处理它 我可以知道类名和字段名 然后我可以通过反射访问这些字段 有没有办法
  • 保留 SVG 文本的纵横比

    这是经过编辑的副本https stackoverflow com questions 29105120 preserve aspect ratio for svg text and react to javascript touch eve
  • 在 Java 中的 Mac Os X 上获取网络摄像头流 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想获取我的 Macbook 集成 iSight 网络摄像头 的网络摄像头流 我使用 Java 并且对 Objective C 一无所知 所以我正在寻找一个 完整的 java 解
  • FragmentPagerAdapter getItem 位置错误

    我的 FramentPageAdapter 有一个奇怪的问题 MainActivity java SuppressLint ValidFragment public class MainActivity
  • Swift:以 NSException 类型的未捕获异常终止

    我正在开发一个简单的应用程序 当我单击注册用户时 该应用程序将被终止 请帮我解决这个问题 它说 由于未捕获的异常 NSUnknownKeyException 而终止应用程序 原因 setValue forUndefinedKey 这个类不是
  • 在 C# 和 Mysql 中使用预准备语句

    我在程序中尝试了准备好的语句 但不起作用 注释的部分是Prepared Statement 部分 当我把它改成正常的语句时 一切都正确了 有人能告诉我我错过了什么吗 非常感谢 private void btnLogin Click obje
  • 模拟服务器请求 Android Espresso UI 测试

    我正在使用 Espresso 为我的 Android 应用程序编写 UI 测试 并且想使用 MockWebServer 模拟 http 请求 我需要在运行测试之前模拟身份验证响应并登录用户 有没有办法让应用程序使用mockwebserver
  • C# 中的代理/邮箱处理器使用新的 async/await

    这个问题结合了两个我不完全理解的主题 阅读通过paper关于 F 中的异步 我遇到了 Agents MailboxProcessors 主题 它可用于实现反应式状态机 C 5 中新的 async await 功能是否可以用于在 C 中实现类
  • 如何从控制器方法重定向到路由

    我在控制器中定义了一个方法 首先检索输入 如果我的数据库中存在电子邮件字段 我想返回一个视图 但是 如果电子邮件字段不存在 我想重定向到另一条路线 我也想将输入传递给该路线 为了更好地理解我的意思 我的控制器代码如下 public func
  • 更改 matplotlib imshow() 图表轴上的值

    假设我有一些输入数据 data np random normal loc 100 scale 10 size 500 1 32 hist np ones 32 20 initialise hist for z in range 32 his
  • gnuplot:标签部分中的斜体

    对于这个 可能 基本问题感到抱歉 但我刚刚开始使用 gnuplot 我想要创建一个轴标签 其中一部分以斜体显示 就像是 xlabel 不是斜体 斜体 我知道设置标签显示斜体很容易 设置xlabel字体 Times Italic 20 但是是
  • Vista 上的 BDE 初始化失败(错误 $2501)

    我有一个用 Delphi 2007 编写的小型 datasnap 服务器 用于访问 BDE 它在 Windows 2000 和 XP 上运行良好 但在 Vista 上时不时 实际上经常 我收到错误消息 尝试初始化 Borland 数据库引擎
  • Android 中无法播放视频

    视频在下面提到的代码中无法正常工作 这可能是什么问题 MediaController mediaController new MediaController getBaseContext mediaController setAnchorV
  • 如何检测 UIImageView 的触摸事件?

    我在导航栏上放置了一个图像 UIImageView 现在我想检测触摸事件并想要处理该事件 我怎样才能做到这一点 实际上 不要这样做 而是在 UIImageView 上添加一个具有自定义样式的按钮 除非指定图像 否则没有按钮图形 然后附加您想
  • Python中字典的深度合并字典

    我需要合并多个词典 例如 这是我所拥有的 dict1 1 a A 2 b B dict2 2 c C 3 d D With A B C and D是树的叶子 就像 info1 value info2 value2 字典的级别 深度 未知 可
  • 在 Java 临界区中,我应该同步什么?

    在 Java 中 在代码中声明临界区的惯用方法如下 private void doSomething thread safe code synchronized this thread unsafe code thread safe cod