A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H._张_♂ 中级黑马   /  2014-3-22 00:51  /  1180 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于synchroized()的钥匙问题,我写了一个测试问题,得出的结论是在两个不同的线程中,只有当钥匙出来之后才能打开另一个把锁,之前一直搞不懂,现在好像明白了死锁问题,在同一时间,两把不同的锁相互需要,而且不能“拔出钥匙”的时候会出现死锁,测试代码如下,不知道有没有同学需要的,分享出来吧。
  1. import java.util.Date;


  2. public class SychronizedName {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 TestSynchronized1 t1 = new TestSynchronized1();
  9.                 TestSynchronized2 t2 = new TestSynchronized2();
  10.                 Thread th1 =new Thread (t1);
  11.                 Thread th2 =new Thread (t2);
  12.                 th2.start();
  13.                 try{Thread.sleep(10);}catch(Exception e){}
  14.                 th1.start();       
  15.         }

  16. }

  17. class MyLock{
  18.         static Object locka = new Object();
  19.         static Object lockb = new Object();
  20. }

  21. class TestSynchronized1 implements Runnable{

  22.         public void run() {
  23.                 synchronized(MyLock.locka){
  24.                         System.out.println("执行TestSynchronized1"+""+ new Date());
  25.                         synchronized(MyLock.lockb){       
  26.                                 System.out.println(MyLock.locka.toString() +""+ new Date()+" lockb1");
  27.                         }
  28.                         try{Thread.sleep(5000);}catch(Exception e){}
  29.                         System.out.println(MyLock.lockb.toString()+""+ new Date()+" locka1");
  30.                 }
  31.                
  32.         }
  33. }
  34. class TestSynchronized2 implements Runnable{

  35.         public void run() {
  36.                 synchronized(MyLock.lockb){
  37.                         System.out.println("执行TestSynchronized2"+""+ new Date());
  38.                         try{Thread.sleep(2000);}catch(Exception e){}
  39.                         System.out.println(MyLock.locka.toString() +""+ new Date()+" lockb2");
  40.                 }
  41.                
  42.         }
  43.        
  44. }
复制代码

执行TestSynchronized2Sat Mar 22 00:38:40 CST 2014//说明两个线程几乎同时执行,但是一定是线程2先执行10毫秒
执行TestSynchronized1Sat Mar 22 00:38:40 CST 2014//说明两个线程几乎同时执行,但是一定是线程2先执行10毫秒
java.lang.Object@5d391dSat Mar 22 00:38:42 CST 2014 lockb2//说明线程1中的b锁实在线程2中b锁出来的时候才开的锁
java.lang.Object@5d391dSat Mar 22 00:38:42 CST 2014 lockb1//说明线程1中的b锁实在线程2中b锁出来的时候才开的锁,所有时间晚了2秒后同时打印
java.lang.Object@d507e9Sat Mar 22 00:38:47 CST 2014 locka1//说明钥匙在使用时依然可以调用,但是不能开锁

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

2 个回复

倒序浏览
顶一下!
回复 使用道具 举报
以前理解死锁的时候是瞬间懂了, 然后想写个死锁,用了3个小时:L
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马