这段代码展示了Java中的一个死锁示例,强制Thread1resource1上获取lock1,强制Thread2resource2上获取lock2.然后Thread1try 获取lock2,而Thread2try 获取lock1,这会导致死锁.

根据this,我希望看到Thread2和Thread1的状态是BLOCKED,但当我用thread.getState()监视状态时,它们无限期地处于WAITING状态.

你能告诉我为什么吗?

考虑一下锁在主类中声明为:

    Lock lock1 = new ReentrantLock();
    Lock lock2 = new ReentrantLock();

这是ThreadClass的代码

import java.util.concurrent.locks.Lock;

public class ThreadClass extends Thread {
    private Lock lock1; 
    private Lock lock2;
    private Resource resource1; 
    private Resource resource2;

    public ThreadClass(Resource resource1, Resource resource2, String name, Lock lock1, Lock lock2) {
        this.resource1 = resource1;
        this.resource2 = resource2;
        this.lock1 = lock1;
        this.lock2 = lock2;
        this.setName(name);
    }

    @Override
    public void run() {
        if (Thread.currentThread().getName().equals("Thread1")) {
            lock1.lock();
            System.out.println(Thread.currentThread().getName() + ": Using " + resource1.name);
            // Simulating work on RESOURCE 1
               
            lock2.lock();
            System.out.println(Thread.currentThread().getName() + ": Using " + resource2.name);
            // Simulating work on RESOURCE 2
            lock2.unlock();

            lock1.unlock();
        }
        if (Thread.currentThread().getName().equals("Thread2")) {
            lock2.lock();


            // Simulating work on RESOURCE 2

            lock1.lock();
            System.out.println(Thread.currentThread().getName() + ": Using resource1");
            lock1.unlock();

            lock2.unlock();
        }
    }
}

推荐答案

您引用的文档是关于内部锁的--内置于每个Java对象(也称为监视器)中的锁.它们是一种低级别的、略显遗留的机制,具有已知的警告.内部锁与synchronized关键字一起使用,并且仅当线程进入静态标记为synchronized的代码块时才会被获取.

你正在使用一个不同的,更高级别的API,所以无论文档中说什么锁都不适用.我从来没有看过ReentrantLock的内部实现,但是-正如你可以从Thread s状态中看到的-它没有使用synchronized块来停放线程,而是调用Objectwait方法(它总是从synchronized块内部进行,并形成Java线程构建的另一个低级原语).

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

Jooq外键关系

Java .类参数不通过构造函数传递

Hibernate 6支持Joda DateTime吗?

具有多种令牌类型和段的复杂Java 17正则表达式

使用REST客户端和对象映射器从字符串反序列化Json

什么是Java原子属性的正确getter和setter

当Volatile关键字真的是必要的时候?

如何对多个字段进行分组和排序?

Java Mooc.fi Part 12_01.Hideout -返回和删除方法

如何为JavaFX Spring Boot应用程序制作Windows/MacOS/Linux安装程序

为什么Collectors.toList()不能保证易变性

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

STREAMS减少部分结果的问题

Java递归泛型是否可以被视为继承和重写的语法糖

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

移动二维数组的行

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?

单例模式中热切初始化和惰性初始化的区别