你也可以只创建一个线程实例 丢进2个线程对象中 这样头前的变量不需要加静态修饰
但是这样就赵成了flag=ture不能执行 还是不会死锁
所有你要提供一个修改flag 的方法 让线程1启动之后 主线程sleep 让cpu运行线程1 线程的同步快里sleep切换到主线程 在把flag设置为true 线程2启动
- public class Text1 {
- }
- /*
- 死锁程序,两个执行线程各持一个锁,然后想用对方方法的锁,相持不下,死锁
- */
- class DeadLock implements Runnable
- {
- int i = 0;
- private boolean flag;
- public DeadLock(boolean m){flag=m;}
- //新建两个锁
- Object suo1=new Object();
- Object suo2=new Object();
- public void setFlag(boolean flag){
- this.flag=flag;
- }
- public DeadLock(Object lock1,Object lock2){
- suo1=lock1;
- suo2=lock2;
- }
- public void run()
- {
- if(flag)
- {
- //无限循环,让锁1里面有锁2
- while(true)//第一次不行后添加无限循环
- {
- synchronized(suo1)
- {
- System.out.println("if Locka"+i);//打印添加了个序号i,用以区别两次不同的打印!!
- i++;
- try{Thread.sleep(100);}catch(Exception e){}//第二次不行后添加睡眠时间。一个睡100ms,一个睡10ms
- synchronized(suo2)
- {
- System.out.println("if Lockb"+i);
- i++;
- }
- }
- }
- }
- else
- {
- //无限循环,让锁21里面有锁1
- while(true)
- {
- synchronized(suo2)
- {
- System.out.println("else Lockb"+i);
- i++;
- try{Thread.sleep(10);}catch(Exception e){}
- synchronized(suo1)
- {
- System.out.println("else Locka"+i);
- i++;
- }
- }
- }
- }
- }
- }
- class DeadLockDemo
- {
- //public static void main(String[] args) throws InterruptedException
- //{
- // DeadLock d1=new DeadLock(false);
- // Thread t1=new Thread(d1);
- // Thread t2=new Thread(d1);
- // t1.start();
- // Thread.sleep(1);
- // d1.setFlag(true);
- // t2.start();
- //}
- public static void main(String[] args) throws InterruptedException{
- Object lock1=new Object();
- Object lock2=new Object();
- DeadLock d1=new DeadLock(lock1,lock2);
- DeadLock d2=new DeadLock(lock1,lock2);
- d2.setFlag(true);
- Thread t1=new Thread(d1);
- Thread t2=new Thread(d2);
- t1.start();
- Thread.sleep(1);
- t2.start();
- }
- }
- //如果2个Thread里传的是同个线程实现对象 你么你可以不传锁 设计线程实现代码时可以直接用this(不能用在静态成员中)和
- //DeadLockDemo.class 如果是不同的实现对象那么就得传入一把锁。
复制代码 |