public class TestDeadLock implements Runnable {
public int t;
static Object o1=new Object();
static Object o2=new Object();
public static void main(String[] args) {
TestDeadLock d1 = new TestDeadLock();
TestDeadLock d2 = new TestDeadLock();
d1.t=0;
d2.t=1;
Thread t1 = new Thread(d1);
Thread t2= new Thread(d2);
t1.start();
t2.start();
} public void run() {
System.out.println(t);
if(t==1){
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(o2){
System.out.println("1");
}
}
if(t==0){
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(o1){
System.out.println("0");
}
}
}}以上代码我运行,未造成死锁,不知道是哪点出了毛病,高手进来看下!!!
解决方案 »
- java 网络编程 关于套接字 服务器与客服端的通讯问题
- 使用EditPlus编译,老是出现奇怪的问题:Exception in thread "main"
- 这个SQL怎么写成HQL怎么写?(在线等)
- tomcat无法启动
- 想问一个问题 java中怎么样把windows的多个exe文件组合成一个exe文件(具体看内容)
- 上次那位大哥发的<张孝祥JAVA视频教程>电驴下载的请再给发一次,谢谢了.
- java能调用window下的exe,那么请教java要是想调用java写的一个shell里的命令,而且这个命令是带参数的,咋办?
- 如何通过Class.getField得到类的静态属性
- 关于LIST中元素更换位置的问题~~~
- 那里有下载JBUILDER5.0完整版??? 谢谢
- java绘图问题
- 帮别人问一道JAVA题
睡的长一点的先启动,main线程小睡一点,等先启动的那个线程锁住一下O,再启动第二个线程.让第二个线线程锁住第二个O
t2.start();
改为:
t1.start();
Theard.sleep(100);
t2.start();
这样试试吧.
public int t;
static Object o1 = new Object();
static Object o2 = new Object(); public static void main(String[] args) {
TestDeadLock d1 = new TestDeadLock();
TestDeadLock d2 = new TestDeadLock();
d1.t = 0;
d2.t = 1;
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
} public void run() {
System.out.println(t);
if (t == 1) {
synchronized (o1) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} synchronized (o2) {
System.out.println("1");
}
}
}
if (t == 0) {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} synchronized (o1) {
System.out.println("0");
}
}
}
}}主要是因为当一个线程锁住一个资源时,最好不要让它在锁住一个资源,如果两个线程相互锁住了对方需要的资源,这样就容易出现死锁的现象!
public int t;
static Object o1=new Object();
static Object o2=new Object();
public static void main(String[] args) {
TestDeadLock d1 = new TestDeadLock();
TestDeadLock d2 = new TestDeadLock();
d1.t=0;
d2.t=1;
Thread t1 = new Thread(d1);
Thread t2= new Thread(d2);
t1.start();
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
t2.start();
} public void run() {
System.out.println(t);
if(t==0){
synchronized (o1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}}
}else{
synchronized (o2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1){
System.out.println("0");
}}
}
}}
Class1 objClass1=new Class1();
Class2 objClass2=new Class2();
Thread1 objThread1=new Thread1(objClass1,objClass2);
Thread2 objThread2=new Thread2(objClass1,objClass2);
objThread1.start();
objThread2.start();
}
}
class Thread1 extends Thread{
private Class1 obj1;
private Class2 obj2;
public Thread1(Class1 obj1, Class2 obj2) {
super();
this.obj1 = obj1;
this.obj2 = obj2;
} public void run(){
synchronized(obj1){
try{
sleep(500);
}catch(Exception e){
e.printStackTrace();
}
obj2.method();
obj1.method();
}
}
}
class Thread2 extends Thread{
private Class1 obj1;
private Class2 obj2;
public Thread2(Class1 obj1, Class2 obj2) {
super();
this.obj1 = obj1;
this.obj2 = obj2;
} public void run(){
synchronized(obj2){
try{
sleep(500);
}catch(Exception e){
e.printStackTrace();
}
obj1.method();
obj2.method();
}
}
}
class Class1{
synchronized public void method(){
for(int i=0;i<5;i++){
System.out.println("调用第一个对象的方法");
}
System.out.println("*********************************************end");
}
}
class Class2{
synchronized public void method(){
for(int i=0;i<5;i++){
System.out.println("调用第二个对象的方法");
}
System.out.println("*********************************************end");
}
}我也写一个
对于t2也一样.这样才能死锁.