java - 一个线程可以同时持有两个锁吗?

标签 java deadlock

该示例说明了死锁是如何发生的。有一点不太明白,就是当第一个调用实例alphone的方法bow的thead即将执行gaston.bowbBack(this)时,如果如果,该线程是否会释放锁并获取实例gaston的锁,假设,它不属于第二个线程?或者它会同时持有两个锁直到该方法的所有代码被完全执行?还有一个问题,有没有办法检查线程是否持有锁?

  public class Deadlock {
        static class Friend {
            private final String name;
            public Friend(String name) {
                this.name = name;
            }
            public String getName() {
                return this.name;
            }
            public synchronized void bow(Friend bower) {
                System.out.format("%s: %s"
                    + "  has bowed to me!%n",
                    this.name, bower.getName());
                bower.bowBack(this);
            }
            public synchronized void bowBack(Friend bower) {
                System.out.format("%s: %s"
                    + " has bowed back to me!%n",
                    this.name, bower.getName());
            }
        }

        public static void main(String[] args) {
            final Friend alphonse =
                new Friend("Alphonse");
            final Friend gaston =
                new Friend("Gaston");
            new Thread(new Runnable() {
                public void run() { alphonse.bow(gaston); }
            }).start();
            new Thread(new Runnable() {
                public void run() { gaston.bow(alphonse); }
            }).start();
        }
    }

最佳答案

1)一个线程可以有多个锁,就像这样

    ...
    synchronized (obj1) {
        System.out.println(1);
        synchronized (obj2) {
            System.out.println(2);
        }
    }
    ...

2) 我们可以检查线程是否持有锁 Thread.holdsLock(Object obj)

关于java - 一个线程可以同时持有两个锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27296727/

相关文章:

java - 当两个锁定的线程(通过变量)切换其中一个变量并尝试访问另一个变量时,会发生什么?

java - 如何通过twitter API中的代码批准关注请求?

c++ - 获取两个互斥量的锁并避免死锁

java - 仅 Grep 字符串中某些模式后的几个数字

java - 通过 Java 中的多个条目在 keystore 中通过别名获取证书

sql-server - 选择 TABLOCKX 然后 MERGE 与 MERGE with TABLOCKX

php - 查找mysql死锁原因

c++ - std::lock 仍然导致死锁

java - 在 AWT 中获取 AdjustmentListener 事件的来源

java - checkstyle + 抑制过滤器