如果在Java中重新分配同步变量,会发生什么?

10 浏览
0 Comments

如果在Java中重新分配同步变量,会发生什么?

下面的代码发生了什么?同步机制有效吗?这是一个面试问题。

class T
{
    public static void main(String args[])
    {
        Object myObject = new Object();
        synchronized (myObject)
        {
            myObject = new Object();
        } // 同步块结束
    }
}

0
0 Comments

当在Java中重新分配同步变量时会发生什么?

在Java中,每次进入同步块时,您都会在一个不同的对象上进行同步。大多数情况下,这不会产生任何效果,只会使您感到困惑,但有一小部分机会,两个线程将看到相同的对象并等待。

因此,如果您在一个不是final的字段上进行同步,任何代码分析器都会给出警告。

解决这个问题的方法是将同步变量声明为final。这样,每个线程都将在同一个对象上进行同步,避免了可能的等待和混淆。

以下是一个示例代码,展示了如何使用final字段进行同步:

public class SynchronizationExample {
    private final Object lock = new Object();
    public void synchronizedMethod() {
        synchronized (lock) {
            // 同步的代码块
        }
    }
}

请注意,lock字段被声明为final,以确保所有线程都在同一个对象上同步。

通过遵循这个解决方法,您可以避免在重新分配同步变量时可能出现的问题,并确保正确的同步行为。

0
0 Comments

原因:问题的原因是当同步变量被重新分配时,会导致锁定的对象发生变化,无法达到预期的同步效果。

解决方法:将同步变量声明为final类型,确保不会被重新分配。这样可以保证锁定的对象不会发生变化,从而实现预期的同步效果。

以下是问题原文的中文翻译及整理:

不,这样是行不通的。每当一个新的线程进入时,都会创建一个新的myObject对象。特别是现在myObject是一个局部变量!

即使myObject是一个类成员,也无法工作,因为你会改变你正在锁定的对象。关于非final字段的同步的更长的解释,请参见关于同步非final字段的问题。

原文链接:https://stackoverflow.com/questions/6910807

0
0 Comments

如果在Java中重新分配同步变量会发生什么?

原因:

- 同步是应用于对象(或与对象关联的监视器),而不是变量。

- 当达到同步块的开始时,获得/释放的监视器取决于表达式的值。

- 表达式在同步块结束时不会重新评估。

解决方法:

- 避免在同步块中重新分配同步变量。

0