public class DLTest { public static void main(String[] args) { String str = "ABC"; MyThread myThread = new MyThread(str); myThread.start(); synchronized (str){ System.out.println("str 变量的哈希值为:" + str.hashCode()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } try { myThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main is over"); } } class MyThread extends Thread{ String string; MyThread(String str){ this.string = str; } @Override public void run() { synchronized (string){ System.out.println("string 变量的哈希值为:" + string.hashCode()); } } }这段代码为什么没有死锁
时间: 2024-02-15 22:27:02 浏览: 22
这段代码没有死锁是因为主线程和 MyThread 线程在使用同步块时,都是在不同的时间段内使用的,因此不会产生互相等待对方释放锁的情况。
具体来说,主线程首先创建 MyThread 对象并启动了它的线程,然后获取了 str 对象的锁,并执行同步块中的代码。在这段代码执行过程中,MyThread 线程一直处于等待状态。
当主线程释放了 str 对象的锁后,MyThread 线程才获取了该锁,并执行了同步块中的代码。因为主线程已经释放了该锁,所以 MyThread 线程可以顺利地获取到该锁,避免了死锁的产生。
在主线程中,通过调用 myThread.join() 方法,主线程等待 MyThread 线程执行完毕后再结束,这也确保了 MyThread 线程在主线程结束前能够执行完毕。
相关问题
public class DLTest { public static void main(String[] args) { String str = "ABC"; MyThread myThread = new MyThread(str); myThread.start(); synchronized (str){System.out.println("str 变量的哈希值为:" + str.h死锁
这段代码存在死锁的风险。在主线程中,通过创建 MyThread 对象,并将 str 作为参数传递给它,然后启动它的线程。在 MyThread 中,将 str 对象用作锁,执行了一个同步块。在主线程中,也尝试获取同一个 str 对象的锁,但在 MyThread 线程执行同步块期间,该锁将一直处于占用状态,因此主线程将被阻塞,直到 MyThread 线程释放锁。
解决方法是避免在多个线程之间共享锁对象,或者在使用共享锁对象时,确保在同一时间只有一个线程持有该锁,以避免死锁的产生。
编程要求 根据提示,在右侧编辑器补充代码,使用继承Thread类的方式创建多线程,循环输出:线程在运行......package step1; public class CreateThreadPractice { public static void main(String[] args) { MyThread myThread = new MyThread();
好的,以下是符合您要求的代码:
```
package step1;
public class CreateThreadPractice {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
class MyThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println("线程在运行......");
}
}
}
```
在该代码中,我们创建了一个继承自Thread类的线程类 `MyThread`,并重写了 `run()` 方法,在该方法中使用一个无限循环输出"线程在运行......"。
在 `main()` 方法中,我们创建了一个 `MyThread` 对象并调用了 `start()` 方法来启动该线程。这样,线程会一直运行并输出预期的结果。