锁定类的静态成员

Cha*_*ani 6 java concurrency multithreading deadlock locking

根据我的理解,下面的代码应该导致死锁.原因是,当线程t1锁定静态对象firstData时,他已经获得了对类的锁定.因此,当他试图锁定另一个静态对象secondData时,请求应该阻塞.

但是,该程序运行良好并打印 *** Successfully acquired both the locks

锁定静态对象的原因是什么?

public class Deadlock {
    public static void main(String[] args) {

        Thread t1 = new Thread(new DeadlockRunnable());
        t1.start();
    }
} 

 class DeadlockRunnable implements Runnable {
    static  Object firstData = new Object();
    static  Object secondData = new Object();

    public void run() {
        synchronized(firstData) {
            synchronized(secondData) {
                System.out.println("*** Successfully acquired both the locks");
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

对于那些谁回答了锁的对象,而不是类,请看看这个

Mar*_*ers 14

首先,你有一个错误:

原因是,当线程t1锁定静态对象firstData时,他已经获得了对类的锁定.

锁定静态对象仅锁定该对象,而不是类.您正在锁定两个单独的对象.

您提到问题同步方法而不是同步语句.这两个相关的结构以稍微不同的方式工作.


其次,即使您锁定了同一个对象,您的代码仍然不会死锁(ideone).内在锁是可重入的.这意味着如果线程尝试两次使用相同的锁,则线程不会自行死锁.

可重入同步

回想一下,线程无法获取另一个线程拥有的锁.但是一个线程可以获得它已经拥有的锁.允许线程多次获取相同的锁可启用重入同步.这描述了一种情况,其中同步代码直接或间接地调用也包含同步代码的方法,并且两组代码使用相同的锁.在没有可重入同步的情况下,同步代码必须采取许多额外的预防措施,以避免线程导致自身阻塞.

资源