Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的同步?_Java_Synchronization_Synchronized_Synchronize - Fatal编程技术网

Java中的同步?

Java中的同步?,java,synchronization,synchronized,synchronize,Java,Synchronization,Synchronized,Synchronize,我是线程安全编程的新手,我想知道如果我有下面这样的东西,一旦编译并运行,这会不会安全地避免死锁 public class Foo { protected CustomClass[] _mySynchedData = new CustomClass[10]; public void processData() { synchronized(_mySynchedData) { // ...do stuff with synch

我是线程安全编程的新手,我想知道如果我有下面这样的东西,一旦编译并运行,这会不会安全地避免死锁

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

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

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

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


您的代码当前仅引用一个锁:与
\u mySynchedData
关联的锁。您尝试两次锁定它并不重要,因为Java中的锁是可重入的,RichN是正确的,因为您的代码只包含一个线程,因此不可能出现死锁。还请注意,要发生死锁,需要多个线程获取多个锁(尽管顺序不同),才能发生死锁


您的代码当前仅引用一个锁:与
\u mySynchedData
关联的锁。您尝试两次锁定它并不重要,因为Java中的锁是可重入的,您的问题是在同一对象上同步两次会发生什么

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


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

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

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

死锁只能发生在您有两个监视器,并且您试图在不同的线程中以不同的顺序锁定它们的情况下。

事实上,如果它不支持嵌套(并非所有的锁都支持),我很好地将其称为死锁,即使只涉及一个线程。事实上,如果它不支持嵌套(并非所有的锁都支持),我可以称之为死锁,即使只涉及一个线程。