繁体   English   中英

Java中的同步?

[英]Synchronization in Java?

我是线程安全编程的新手,并且想知道我是否有类似下面的内容,一旦编译并运行,这样可以避免死锁吗?

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语言支持他们所谓的可重入同步 这基本上意味着单个线程可以重新获取它已经拥有的锁。

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

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

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

Java sync关键字采用的锁支持嵌套,因此您不必在同一线程中多次在同一对象上进行同步而带来死锁的风险。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM