等!!!

空白已存在 2017-08-21 08:37:26
package com.wjk.java.synchronized_;

public class Deadlock {

public static void main(String[] args) {
// TODO Auto-generated method stub
TestA a = new TestA();
TestB b = new TestB();

Thread t1 = new Thread(a,"线程A");
Thread t2 = new Thread(b,"线程B");

t1.start();
t2.start();
}

}

class TestA implements Runnable{
public void run(){
A();
}
public synchronized void A(){
TestB b = new TestB();
System.out.println(Thread.currentThread().getName());
//此处等待是给B能锁住机会
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//占用着A,调用B
b.B();
System.out.println("这行代码执行不了,因为死锁了");
}
}
class TestB implements Runnable{
public void run(){
B();
}
public synchronized void B(){
TestA a = new TestA();
System.out.println(Thread.currentThread().getName());
//此处等待是给A能锁住机会
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//占用着B,调用A
a.A();
System.out.println("这行代码执行不了,因为死锁了");
}
}


为什么没有发生死锁,而是递归栈溢出了?
...全文
142 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
空白已存在 2017-08-22
  • 打赏
  • 举报
回复
原来不是同一个对象,自然都能获得对象锁
空白已存在 2017-08-21
  • 打赏
  • 举报
回复
希望帮忙解决下疑问,谢了
空白已存在 2017-08-21
  • 打赏
  • 举报
回复
public class Deadlock { public static void main(String[] args) { TestA a = new TestA(); TestB b = new TestB(); Thread t1 = new Thread(a,"线程A"); Thread t2 = new Thread(b,"线程B"); t1.start(); t2.start(); } } class TestA implements Runnable{ public void run(){ A(); } public synchronized void A(){ TestB b = new TestB(); System.out.println(Thread.currentThread().getName()); //此处等待是给B能锁住机会 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //占用着A,调用B b.B(); System.out.println("这行代码执行不了,因为死锁了"); } } class TestB implements Runnable{ public void run(){ B(); } public synchronized void B(){ TestA a = new TestA(); System.out.println(Thread.currentThread().getName()); //此处等待是给A能锁住机会 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //占用着B,调用A a.A(); System.out.println("这行代码执行不了,因为死锁了"); } }
重新编排了下,这样你们看的清楚点

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧