十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
当synchronized使用过多时,可能会造成死锁,那么死锁到底是怎么一回事呢。先看下面的代码,实现死锁:
创新互联建站是一家集网站设计、做网站、网站页面设计、网站优化SEO优化为一体的专业网站设计公司,已为成都等多地近百家企业提供网站建设服务。追求良好的浏览体验,以探求精品塑造与理念升华,设计最适合用户的网站页面。 合作只是第一步,服务才是根本,我们始终坚持讲诚信,负责任的原则,为您进行细心、贴心、认真的服务,与众多客户在蓬勃发展的市场环境中,互促共生。
//死锁的实现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; Threadth2=newThread(mt1); Threadth3=newThread(mt2); th2.start(); th3.start(); } }
以上代码由于 synchronized 的同步造成了死锁,死锁是两个或多个线程同时等待对方的完成,而程序无法继续执行。在解释代码前,首先要明白synchronized到底是怎么一回事。synchronized 定义同步,那么同步的什么,什么和什么同步了?
首先,我们得知道,什么是锁。在java中,每一个对象都有一个内部锁,如果以方法或代码块用 synchronized 进行声明,那么对象的锁将保护整个方法或代码块,要调用这个方法或者执行这个代码块,必须获得这个对象的锁。而且,任何时候都只能有一个线程对象执行被保护的代码
在以上代码中,在线程th2启动后,他就获得了a的锁,同时当其休眠完毕,求会申请获得b的锁,而此时,他的a锁没有放弃。在线程th3启动后,他就获得了b的锁,同时当其休眠完毕,求会申请获得a的锁,而此时,他的b锁没有放弃。
两方都握有自己的锁不放弃,而同时申请另一方的锁,所以,此时就造成了死锁。
同步,同步的就是线程和对象,将线程和对象进行绑定,获取对象的锁。
注意:通过以上代码可以发现,死锁的必要条件是不放弃已有的锁,而同时申请新锁。所以,要想实现死锁,就会有synchronized的嵌套。
这样才能同时操作两个以上的锁,从而造成死锁。
总结
以上就是本文关于java-synchronized 嵌套使用代码详解的全部内容,希望对大家有所帮助。