java线程锁 例子_Java多线程可重入锁例子解析

“可重入锁”的概念是:自己可以再次获得自己的内部锁。比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁。

classsysTest{synchronized voidtest1(String str){

System.out.println(str+"1");

test2(str);

System.out.println("end" +str);

}synchronizedvoidtest2(String str){

System.out.println(str+"2");

}

}class myThread extendsThread{

String str= null;publicmyThread(String str) {this.str =str;

}

@Overridepublic voidrun() {//TODO Auto-generated method stub

super.run();newsysTest().test1(str);

}

}public classsynchronizedTest {public static voidmain(String[] args) {//TODO Auto-generated method stub

myThread th1 = new myThread("1str");

myThread th2= new myThread("2str");

th1.start();

th2.start();

}

}

在加粗的sychronized在的时候结果会有下面,结果不唯一的:

1str1

2str1

1str2

2str2

end2str

end1str

在加粗的sychronized去掉的时候结果会有下面,结果唯一的:

1str1

1str2

end1str

2str1

2str2

end2str

在这里必须要认识到,加一个sychronized方法里调用sychronized方法会造成不同步,需要注意。原因是两个锁的问题,

这个时候使用可重入概念解决的话,就要使用对象锁,因为在sychronized()代码块中再次获得该锁就会可以得到:

classsysTest{static Object object = newObject();voidtest1(String str){synchronized(object){

System.out.println(str+"1");

test2(str);

System.out.println("end" +str);

}

}voidtest2(String str){synchronized(object){

System.out.println(str+"2");

}

}

}class myThread extendsThread{

String str= null;publicmyThread(String str) {this.str =str;

}

@Overridepublic voidrun() {//TODO Auto-generated method stub

super.run();newsysTest().test1(str);

}

}public classsynchronizedTest {public static voidmain(String[] args) {//TODO Auto-generated method stub

myThread th1 = new myThread("1str");

myThread th2= new myThread("2str");

th1.start();

th2.start();

}

}

结果:

1str1

1str2

end1str

2str1

2str2

end2str

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值