【问题标题】:Synchronization in Java?Java中的同步?
【发布时间】:2009-11-02 08:57:25
【问题描述】:

我对线程安全编程很陌生,想知道是否有类似下面的内容,一旦编译并运行,这是否可以避免死锁?

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();

【问题讨论】:

    标签: java synchronization synchronized synchronize


    【解决方案1】:

    您的代码只显示一个线程。

    只有一个线程,你不可能遇到任何死锁。

    添加:
    Java 语言支持他们正式称为reentrant synchronization 的东西。 这基本上意味着单个线程可以重新获取它已经拥有的锁。

    【讨论】:

    • 实际上,如果它支持嵌套(并不是所有的锁都支持),我会很好地称之为死锁,即使只有一个线程参与。
    【解决方案2】:

    你的问题是当你在同一个对象上同步两次时会发生什么。

    答案是:Java 将首先检查哪个线程拥有监视器(这是synchronized 操作的内部数据结构)。由于所有者线程与当前线程相同,Java 将继续。

    只有当你有两个监视器并且你试图在不同的线程中以不同的顺序锁定它们时才会发生死锁。

    【讨论】:

      【解决方案3】:

      Java synchronized 关键字获取的锁支持嵌套,因此您不会因为在同一个线程中对同一个对象进行多次同步而冒死锁的风险。

      【讨论】:

        【解决方案4】:

        RichN 是正确的,因为您的代码只包含一个线程,因此死锁是不可能的。另请注意,要发生死锁,您需要让多个线程获取多个锁(尽管以不同的顺序)才能发生死锁。

        您的代码当前仅引用一个锁:与_mySynchedData 关联的锁。您尝试将其锁定两次这一事实并不重要,因为 Java 中的锁是可重入的

        【讨论】:

          猜你喜欢
          • 2012-02-03
          • 1970-01-01
          • 1970-01-01
          • 2010-11-26
          • 2011-01-09
          • 1970-01-01
          • 2021-01-18
          • 2011-11-08
          相关资源
          最近更新 更多