【问题标题】:Java synchronized blocks object vs thisJava同步块对象与此
【发布时间】:2018-06-20 14:33:38
【问题描述】:

doThis方法中两个同步块的区别:

什么时候应该使用?

public class AClass {

private final Object lock = new Object();

public void doThis(){
    synchronized(lock){
        //do stuff
    }
}

}

public class BClass {

public void doThis(){
    synchronized(this){
        //do stuff
    }
}

}

什么时候应该使用一个而不是另一个?

【问题讨论】:

  • 第一个例子锁定Object,第二个例子锁定BClass。就是这样。您的第二个问题在这里得到更好的解释:stackoverflow.com/questions/442564/…
  • 您可以选择要用作锁的对象。您刚刚发布了 2 个使用不同对象的代码 sn-ps。这就是区别。

标签: java syntax synchronization synchronized


【解决方案1】:

始终使用第一个。

如果您执行synchronized (this),则您正在对任何其他代码也具有同步能力的对象进行同步,从而在不知不觉中破坏了您的类的功能。

如果您在私有对象上进行同步,那么除了您的类中的代码之外,绝对没有人可以对其进行同步。没有人有权干涉您的功能。

【讨论】:

  • 但是如果我正在处理 AClass[] 数据并说将处理 3 个 AClass 实例,那么我们应该通过私有对象进行同步吗?
  • 是的,每个都应该有自己的同步对象……除非你需要它们相互同步,这听起来不像你做的那样。
  • 所以如果我们考虑到 CarPark[] parks 那么我们使用私有 Object 来锁定,但是如果地球上只有一个 CarPark 那么我们可以使用 synchronized(this) 吗?跨度>
  • 没有。外部代码仍可能在您的单个 CarPark 实例上同步,并干扰其在多线程环境中运行的能力。
  • 所以你是说使用同步(锁定)从来没有有用的需要,我们应该总是使用同步(这个)? (考虑到只有lock1存在,没有lock2)
【解决方案2】:

使用锁对象而不是this的原因只是为了给自己灵活性并避免死锁。请注意,这两个原因只有在不同的方法需要同步时才会发挥作用,而不是相互冲突。提供两个锁对象是有意义的。大多数时候,只使用 this 就可以了。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2010-12-23
    • 2014-03-11
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多