【问题标题】:Locking on a mutable object - Why is it considered a bad practice?锁定一个可变对象 - 为什么它被认为是一种不好的做法?
【发布时间】:2012-03-08 17:49:47
【问题描述】:

看到这个answer。它说:

六个非常糟糕的例子;

...

锁定一个可变字段。例如同步(对象){对象= ...; }

锁定可变字段有什么问题?如果 object 被声明为 final 但不是不可变类怎么办?

【问题讨论】:

  • 我认为您将可变字段与不可变类(仅包含不可变字段的类)混淆了。

标签: java multithreading concurrency thread-safety synchronized


【解决方案1】:

这是一个坏主意,因为如果另一个线程更改了临界区中的引用,线程将不再看到相同的引用,因此它们不会在同一个对象上同步,从而不受控制地运行。示例:

 synchronized(lock1) {
     lock1 = new Object();
     sharedVariable++;
 }

假设有 2 个线程试图进入这个临界区。线程 1 进入,线程 2 等待。线程 1 进入,重新分配 lock1 并继续。现在线程 2 看到的锁与线程 1 获得的锁不同,它也是空闲的,所以它也可以进入临界区。乐趣随之而来!

如果对象是final,则不能将引用重新分配给不同的对象,因此上述问题不再适用。

【讨论】:

    【解决方案2】:

    “可变”在这里不是正确的词。锁定可变对象是可以的,即具有状态的对象。错误是锁定一个字段,更改它,然后期望另一个线程锁定同一个对象。

    【讨论】:

      【解决方案3】:

      我认为锁定一个可变对象本身并不坏。很难做到正确。还有其他用于并发处理的模型,例如演员。我建议你研究一下 Akka,它可以在 Java 和 Scala 中使用,并且是一个非常可靠的实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-13
        • 2010-11-09
        • 2010-10-15
        • 1970-01-01
        • 2010-09-26
        • 2012-05-18
        • 2010-10-22
        • 2011-11-20
        相关资源
        最近更新 更多