关于synchroized()的钥匙问题,我写了一个测试问题,得出的结论是在两个不同的线程中,只有当钥匙出来之后才能打开另一个把锁,之前一直搞不懂,现在好像明白了死锁问题,在同一时间,两把不同的锁相互需要,而且不能“拔出钥匙”的时候会出现死锁,测试代码如下,不知道有没有同学需要的,分享出来吧。- import java.util.Date;
- public class SychronizedName {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TestSynchronized1 t1 = new TestSynchronized1();
- TestSynchronized2 t2 = new TestSynchronized2();
- Thread th1 =new Thread (t1);
- Thread th2 =new Thread (t2);
- th2.start();
- try{Thread.sleep(10);}catch(Exception e){}
- th1.start();
- }
- }
- class MyLock{
- static Object locka = new Object();
- static Object lockb = new Object();
- }
- class TestSynchronized1 implements Runnable{
- public void run() {
- synchronized(MyLock.locka){
- System.out.println("执行TestSynchronized1"+""+ new Date());
- synchronized(MyLock.lockb){
- System.out.println(MyLock.locka.toString() +""+ new Date()+" lockb1");
- }
- try{Thread.sleep(5000);}catch(Exception e){}
- System.out.println(MyLock.lockb.toString()+""+ new Date()+" locka1");
- }
-
- }
- }
- class TestSynchronized2 implements Runnable{
- public void run() {
- synchronized(MyLock.lockb){
- System.out.println("执行TestSynchronized2"+""+ new Date());
- try{Thread.sleep(2000);}catch(Exception e){}
- System.out.println(MyLock.locka.toString() +""+ new Date()+" lockb2");
- }
-
- }
-
- }
复制代码
执行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//说明钥匙在使用时依然可以调用,但是不能开锁 |