问题一:
源代码:
- class Test implements Runnable
- {
- private boolean flag;
- Test(boolean flag)
- {
- this.flag=flag;
- }
- public void run()
- {
-
-
- if(flag)
- {
- //while(true) //因为将while注释掉线程只运行一次,如果能出现死锁,死锁出现的情况也非常难弄出来
- synchronized(Mylock.locka) //获得锁 locka
- {
- System.out.println(Thread.currentThread().getName()+
- "if ----locka----");
- synchronized(Mylock.lockb)//获得锁 lockb
- {
- System.out.println(Thread.currentThread().getName()+
- "if ----lockb----");
- }
- }
- }
- else
- {
- //while(true)//将while 注释点线程只运行一次
- synchronized(Mylock.lockb) //获得锁lockb
- {
- System.out.println(Thread.currentThread().getName()+
- "else ----lockb----");
- if(flag=true)//因为词句为赋值语句,而值为true,所以不管运行几次都不会运行else语句。
- {
- synchronized(Mylock.lockb)//获得锁lockb
- {
- System.out.println(Thread.currentThread().getName()+
- "else----lockb----");
- }
- }
- else
- {
- synchronized(Mylock.locka)
- {
- System.out.println(Thread.currentThread().getName()+
- "else----locka----");
- }
- }
- /*synchronized(Mylock.locka)
- {
- System.out.println(Thread.currentThread().getName()+
- "else----locka----");
- }
- */
- }
- }
-
-
- }
- }
- class Mylock
- {
- public static final Object locka=new Object();
- public static final Object lockb=new Object();
- }
- class Dead
- {
- public static void main(String[] args)
- {
- Test a=new Test(true);
- Test b=new Test(false);
- Thread t1=new Thread(a);
- Thread t2=new Thread(b);
- t1.start();
- t2.start();
- }
- }
复制代码
如果t1先执行获得locka的锁,对t2没有影响,如果t1继续获得lockb 那么t2就会等待等到t1运行结束,t2在运行;如果t2获得lockb锁那么在t2运行完之前t1等待.
如果t2先获得锁lockb,对t1获得锁locka没有影响,对于t1获得锁locka对t2没有影响,但t1想获得lockb锁,要等到t2运行完;
所以不出现死锁。
所以出现的结果是固定的几种。
问题二:
一个有全部两个钥匙,一个就只有一个,是不可能死锁的。 |