【问题标题】:In Java, is it safe to lock and synchronize on the same object? [duplicate]在Java中,锁定和同步同一个对象是否安全? [复制]
【发布时间】:2015-12-21 06:28:20
【问题描述】:

我正在用 Java 构建一个并发应用程序。为避免将我的锁对象暴露在外部,我有一个private final 锁对象:

 private final Object Lock = new Object();

我使用锁来实现线程间的同步:

synchronized (Lock) {

    // Do stuff
}

使用锁等待条件:

while (conditionIsNotMet) {

    Lock.wait();
}

对两种并发模式使用相同的对象是否会导致任何问题?执行此操作时有什么需要注意的吗?

【问题讨论】:

  • 不确定我是否理解。您需要同时拥有这两个 wait() 才能工作。
  • 我需要synchronized 才能使用wait()
  • @sstan 谢谢(答案见stackoverflow.com/questions/2779484/…)@Powerlord 为什么我希望它是static
  • @sstan - 不同意这是重复的。为什么必须 wait() 在同步块中与将特定锁用于多个目的是不同的问题 - 在这种情况下,保护条件并同时为不同目的同步。
  • @Andy:有效点。但是,最后,OP 本人将问题作为重复项结束了。

标签: java multithreading synchronization


【解决方案1】:

将锁用于多个目的通常是一种不好的做法。通常,您应该将 Lock 与您的条件相关联,另一个用于同步对共享数据的访问。也就是说,没有什么能阻止你这样做。

更新:也就是说,您应该注意@sstan 评论 - 您确实需要在等待之前锁定锁。如果您还在与条件关联的其他地方使用了锁,那么您要求的是死锁。

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多