java代码死锁情况?

标签 java

这是代码

public class TestDeadlockExample1 {
     public static void main(String[] args) {  
            final String resource1 = "xyz";  
            final String resource2 = "pqr";  
            // t1 tries to lock resource1 then resource2  
            Thread t1 = new Thread() {  
              public void run() {  
                  synchronized (resource1) {  
                   System.out.println("Thread 1: locked resource 1");  

                   try { Thread.sleep(10000);} catch (Exception e) {}  

                   synchronized (resource2) {  
                    System.out.println("Thread 1: locked resource 2");  
                   }  
                 }  
              }  
            };  

            // t2 tries to lock resource2 then resource1  
            Thread t2 = new Thread() {  
              public void run() {  
                synchronized (resource2) {  
                  System.out.println("Thread 2: locked resource 2");  

                  try { Thread.sleep(10000);} catch (Exception e) {}  

                  synchronized (resource1) {  
                    System.out.println("Thread 2: locked resource 1");  
                  }  
                }  
              }  
            };  


            t1.start();  
            t2.start();  
            System.out.println("completed");
          }  
}


here 

 t1.start();  
 t2.start();  
 System.out.println("completed");

这里

在此 t1.start() 和 t2.start() 是按顺序编写的,所以我怀疑两个线程是否同时启动 或者t1启动,执行然后来到t2并执行,如果这是正确的,这如何成为死锁情况..我想知道这些线程的执行

最佳答案

当您启动 Java 程序时,JRE 会生成主线程,并且该主线程会执行您的 main 方法。

当您调用t1.start()时,新线程会生成并执行第一个匿​​名类的run方法。从此时起,您的程序中有 2 个线程同时执行:“主线程”和“线程 1”。

当您调用t2.start()时,另一个线程会生成并执行第二个匿名类的run方法。从此时起,您的程序中有 3 个线程同时执行:“主线程”、“线程 1”、“线程 2”。

线程的执行顺序未定义。它可以是任何东西。一般来说,它们是同时执行的。

您的“线程 1”和“线程 2”分别获取 resource1resource2 上的锁,并 hibernate 10 秒。当发生这种情况时,您的“主”线程完成其执行。但是您的程序中还有 2 个线程,因此虽然 main 方法完成,但程序尚未完成。

hibernate 后,“线程 1”和“线程 2”尝试获取资源 2 和资源 1 上的锁,但这些锁已被获取,因此它们将等待锁持有者释放它。锁持有者永远不会释放它,因为它等待其他资源,因此该程序永远不会停止。这是典型的僵局情况。

关于java代码死锁情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29092754/

相关文章:

java - 如何使用 PowerMock 在 Selenium 框架中对页面对象进行单元测试

java - Android持久化有什么用?

java.sql.SQLException : No suitable driver

java - Cordova run android 无法找到 JAVA_HOME,即使它已正确设置

java - 为什么我的打印方法无法按顺序打印出二叉搜索树?

java - 使用反射修改方法并获得对其局部变量的访问权限

java - Android Studio 语法错误

java - 如何将所有字节发送到单个数组中,然后在字节之间进行异或?

java - 使用几个 boolean 条件 java 改进代码

java - 重新编码从可调用返回值的 future