Java中的多个对象锁?

2024-03-09

锁定私有字段变量(而不是使用锁定对象)是否安全/可接受的做法?这样,我就可以为不同的目的使用不同的锁。下面的例子:

class Test {
  private Integer x = 0;
  private Integer y = 0;

  public void incrementX() {
    synchronized(x) {
      x++;
    }
  }

  public void decrementX() {
    synchronized(x) {
      x++;
    }
  }

  public void incrementY() {
    synchronized(y) {
      y++;
    }
  }

  public void decrementY() {
    synchronized(y) {
      y++;
    }
  }

或者我应该为每个想要锁定的私有成员设置一个锁定对象?例子:

class Test {
  private final Object xLock = new Object();
  private final Object yLock = new Object();
  private Integer x = 0;
  private Integer y = 0;

...

}

或者我应该只拥有一个通用锁并将其用于所有需要锁定的私有变量?例子:

class Test {
  private final Object objLock = new Object();
  private Integer x = 0;
  private Integer y = 0;

...

}

当心始终使用最终成员变量为了锁!如果您使用Integer,例如,如果您打算更改它,那么这将是非常糟糕的做法,因为每次调用都会看到一个不同的对象并导致数据争用。

使用一个锁还是多个锁取决于您想要实现的协调方案,因此它完全是特定于域的。您必须仔细考虑哪些操作是互斥的,哪些操作不是互斥的,并适当地为它们分配锁。这里没有单一的最佳实践。

如果您的对象上有两个正交操作可能同时发生而不会导致任何数据争用,那么这就是两个锁的情况。在您的示例中,有两个整数,每个整数都独立变化。我认为这是两把锁的情况。如果您有更复杂的代码,其中至少在一个操作中需要访问两个整数,那么这会将它们绑定在一起,然后您将需要一个锁。

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

Java中的多个对象锁? 的相关文章

  • 我需要在 Java 9 中使用哪个模块才能使用 JPA?

    我正在使用一个需要 JPA 的项目测试 Java 9 javax persistence 类 当我添加module info java并声明我的模块 下的所有类javax persistece包变得不可用 我搜索了很多 但找不到在 Java
  • Spring MVC - 自动查找验证器

    假设我有一个像这样的示例实体类 public class Address 和相应的验证器 Component public AddressValidator implements Validator Override public bool
  • 从 Eclipse 导出后,WAR 文件中缺少一些必要的库 - 为什么?

    我接手了一个大学的项目 其中包含一些 Web 服务 通过将项目导出为 WAR 文件 一些库包含在文件中 例如 Axis2 而另一些则不包含 hibernate JDBC 驱动程序 另外 添加到类路径中的 jar 尚未导出 所有库都位于硬盘驱
  • selenium 2.0 中的 isElementPresent

    大家好 我正在使用 webdriver 所以如果我想使用 selenium s rc 函数 isElementPresent 我必须模拟 selenium rc 所以我会执行以下操作 import org openqa selenium B
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • Java:等于和==

    让我们看看我们有 2 个对用户定义类实例的引用 即 Java 中的 a 和 b 会不会有一种情况 a b 但 a equals b 返回 false 当然 实施 equals 完全取决于班级 所以我可以写 class Foo public
  • python 中的子进程调用以使用 JAVA_OPTS 调用 java jar 文件

    示例代码 import subprocess subprocess call java jar temp jar 如何在上面的命令中指定JAVA OPTS 当我使用上述命令时 我收到 java lang OutOfMemoryError 无
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 对象映射器 - YAMLFactory - 由于缺少 _createContentReference 方法而出现异常

    我正在使用最新的 2 13 0 版本的 jackson 当我尝试解析 YAML 文件时 出现此异常 java lang NoSuchMethodError com fasterxml jackson core io ContentRefer
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • 如果 @transactional 在类级别应用,如何拦截 @transactional 参数

    我想捕获 transactional 的参数 如果它应用于类级别 例如如果 transactional应用在方法级别 例如 class A transactional readOnly true public void someMethod
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • Swing GUI 出现 IntelliJ 错误“contentPane 无法设置为 null。”从终端编译时

    当我从 IntelliJ 编译我的项目时 没有任何问题 我的程序运行顺利 但是当我尝试使用 javac 从终端编译它时 警告 注意 Victor presentation TableControllerMenu java 使用未经检查或不安
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐

  • 公司坚持对我们的所有文档使用二进制格式[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在一家公司工作 出于某种原因 该公司坚持所有开发文档都应采用 MS Word 格式 作为二进制格式
  • .NET 中 32 位进程如何与 64 位进程通信?

    Windows 不允许 32 位进程加载 64 位 dll 因此我尝试使用远程处理来允许 32 位进程与 64 位进程交互 问题是 虽然两个应用程序位于同一台计算机上 但一个是 32 位 另一个是 64 位 而且它们必须是这样的 同时使用
  • 从 Sql Server 2000 上的存储过程插入临时表

    我正在尝试完成这里描述的事情 http sqldev wordpress com 2008 05 06 insert into temporary table from stored procedure http sqldev wordpr
  • 使用 char * 访问 int 是否可能具有未定义的行为?

    下面用于测试字节顺序的代码预计具有实现定义的行为 int is little endian void int x 1 char p char x return p 1 但它是否有可能在特意设计的架构上具有未定义的行为 例如 表示的第一个字节
  • Javascript找不到这些变量,为什么?

    我正在使用 Phonegap 创建 Android 应用程序 录音机 但我的代码中有以下 2 个错误 ReferenceError Can t find variable Media TypeError Result of expressi
  • 针对 3.5 框架的 VS2010 上的 RESX 文件存在问题

    这是我最近遇到的一个故事和一个可能的答案 我只是想分享这个信息 因为我在 stackoverflow 上还找不到这个信息 我将我的解决方案从 VS2008 WinXP 32 位升级到 VS2010 Win7 64 位 当我对生成新 RESX
  • 将 HTML 文件转换为 PDF [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 Pandas 绘制成子图

    da 是我的数据框 我想把这个图变成我将拥有的 2 个子图中的一个 当我为这个图添加 plt subplots 2 1 2 时 它最终会将该图分成一个单独的图 并且子图是一个空图 我怎样才能把这段代码变成一个子图 Thank you in
  • 它在 php/html 中的输出详细信息不正确

    我想当用户选择时显示下拉菜单中的所有问题All从问题下拉菜单中并将其输出在下面 问题是它没有这样做 更糟糕的是 它给了我未定义的偏移错误 指出 Notice Undefined offset in on line 605 605行是 ech
  • 使用 UWP 通过拖放重新排序可绑定列表视图

    我正在尝试重新排序ListView通过拖放 它在使用静态项目时与我一起工作 但是当我使用绑定数据时物品来源拖动工作正常 但我无法删除该项目 这是我的代码 C lstSrvMenu ItemsSource Menue MainItems Wh
  • 如何使用 JS 删除或重置 CSS 样式?

    我想使用 JS 删除或重置应用于特定 DOM 节点的样式 node style webkitTransitionDuration 5000ms node style webkitTransformOrigin 200px 200px nod
  • 在 Windows 10 (1803) 上,如果 WPF 透明窗口覆盖在所有应用程序上,所有应用程序都会失去触摸或手写笔功能

    如果我使用简单的空窗口 如下面所示的代码 创建一个新的 WPF 应用程序 我发现 WPF 应用程序覆盖的所有应用程序都失去了触摸或手写笔反应 仅当 Windows 10 升级到 1803 10 0 17134 0 时才能重现此情况
  • 使用 Bootstrap 4 的剩余垂直空间

    我想让 id 网格使用完整的可用垂直空间 div class container fluid div class row mb 2 div class col h2 i class fas fa map marker alt i Test
  • Vaadin 的 vaadinBootstrap.js

    我遇到了令人困惑的问题 我正在使用 Vaadin 7 框架来创建一些 安静简单的 应用程序 当我在 Eclipse 中测试它时 一切正常 但是当我将项目部署到 Tomcat 中时 一些谜团开始出现 当我从管理器应用程序 运行 应用程序时 只
  • 查看特定的 Git 提交 [重复]

    这个问题在这里已经有答案了 可能的重复 获取有关 SHA 1 提交对象的信息 https stackoverflow com questions 7610073 get information about a sha 1 commit ob
  • 如何使用 node.js 构建消息以通过 TCP 发送?

    我需要从 Node js TCP 服务器向多个 TCP 客户端发送 JSON 字符串 为了从客户端的套接字 流读取消息 我需要进行某种消息框架 实现此目的的一种方法是将消息长度作为数组作为消息前缀 然后将其转换为客户端消息的缓冲区大小 我如
  • app.use(验证器()); ^ TypeError:验证器不是函数

    我正在开展一个夏季培训项目 我被要求使用以下命令创建一个登录页面Node js但是 安装后express validator并输入我想在的代码app js文件每次运行时都会打印出一个错误app js or the www在 bin 文件中告
  • 在 /youtube/v3/channels 的结果中没有看到 snippet.customUrl

    根据 YouTube 数据 API V3 网址为https developers google com youtube v3 docs channels snippet customUrl https developers google c
  • ember-data 观察记录数组 isLoading/isUpdating/hasUpdated?

    我正在尝试按周显示日历事件列表 更重要的是我正在尝试重用 DS Store 中已有的数据 这是执行此操作的代码 并且在大多数情况下它都有效 问题是我的eventsChanged观察者运行的次数太多了 当路由器从服务器获取事件时eventsC
  • Java中的多个对象锁?

    锁定私有字段变量 而不是使用锁定对象 是否安全 可接受的做法 这样 我就可以为不同的目的使用不同的锁 下面的例子 class Test private Integer x 0 private Integer y 0 public void