时间:2021-05-19
当synchronized使用过多时,可能会造成死锁,那么死锁到底是怎么一回事呢。先看下面的代码,实现死锁:
//死锁的实现classA{publicvoidget(){System.out.println("A说:我开始启动了,B,给我你的资源");}publicvoidsay(){System.out.println("A获得资源");}}classB{publicvoidget(){System.out.println("B说:我开始启动了,A,给我你的资源");}publicvoidsay(){System.out.println("B获得资源");}}classMyThreadimplementsRunnable{publicstaticAa=newA();publicstaticBb=newB();publicbooleanflag=false;publicvoidrun(){if(flag){synchronized(a){a.get();try{Thread.sleep(500);}catch(InterruptedExceptione){}synchronized(b){ //此同步代码块在另一同步代码块里a.say();}}}else{synchronized(b){b.get();try{Thread.sleep(500);}catch(InterruptedExceptione){}synchronized(a){ //此同步代码块在另一同步代码块里b.say();}}}}}publicclassDemo24{publicstaticvoidmain(Stringargs[]){MyThreadmt1=newMyThread();MyThreadmt2=newMyThread();mt1.flag=true;mt2.flag=false;Threadth1=newThread(mt1);Threadth2=newThread(mt2);th1.start();th2.start();}}以上代码由于 synchronized 的同步造成了死锁,死锁是两个或多个线程同时等待对方的完成,而程序无法继续执行。在解释代码前,首先要明白synchronized到底是怎么一回事。synchronized 定义同步,那么同步的什么,什么和什么同步了?
首先,我们得知道,什么是锁。在java中,每一个对象都有一个内部锁,如果以方法或代码块用 synchronized 进行声明,那么对象的锁将保护整个方法或代码块,要调用这个方法或者执行这个代码块,必须获得这个对象的锁。而且,任何时候都只能有一个线程对象执行被保护的代码
在以上代码中,在线程th1启动后,他就获得了a的锁,同时当其休眠完毕,求会申请获得b的锁,而此时,他的a锁没有放弃。在线程th2启动后,他就获得了b的锁,同时当其休眠完毕,求会申请获得a的锁,而此时,他的b锁没有放弃。
两方都握有自己的锁不放弃,而同时申请另一方的锁,所以,此时就造成了死锁。
同步,同步的就是线程和对象,将线程和对象进行绑定,获取对象的锁。
注意:通过以上代码可以发现,死锁的必要条件是不放弃已有的锁,而同时申请新锁。所以,要想实现死锁,就会有synchronized的嵌套。
这样才能同时操作两个以上的锁,从而造成死锁。
总结
以上就是本文关于java-synchronized 嵌套使用代码详解的全部内容,希望对大家有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java开发中嵌套类的详解在java语言规范里面,嵌套类(NestedClasses)定义是:Anestedclassisanyclasswhosedeclar
先看一段synchronized的详解:synchronized是java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个
详解Java中的嵌套类与内部类在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nestedclass)。嵌套类有两种类型:静态嵌套类和非静态嵌套类
Java中synchronize函数的实例详解java中的一个类的成员函数若用synchronized来修饰,则对应同一个对象,多个线程像调用这个对象的这个同步
本文实例讲述了Java使用synchronized实现互斥锁功能。分享给大家供大家参考,具体如下:代码packageper.thread;importjava.