Java死锁实例

并发编程是指多个线程同时进行,对同一资源进行操作,那么就会产生并发问题。如何解决?可以用锁。synchronized是最常用的,但是有时难免会出现死锁的现象。
下面就以一个实例讲解死锁的过程:


  假定有一个分布式微博工具,下面是其后台代码。在她的propagateUPdate()方法被调用时,ExampleTimingNode类会收到更新,也可以查询看它是否收到了特定更新。
package com.Test.Tread;

public class MicroBlogNode implements SimpleMicroBlogNode{
   private final String ident;
   public MicroBlogNode(String ident_){
       ident = ident_;
   }
   public String getIdent(){
       return ident;
   }
   public synchronized void propagateUpdate(Update upd_,MicroBlogNode backup_) {
       System.out.println(ident +": recvd: "+upd_.getUpdateText()+" ; banckup: "backup_.getIdent());
       backup.confirmUpdate(this,upd_);
   }
   public synchronized void confirmUpdate(MicroBlogNode other_,Update update_) {
       System.out.println(ident +": recvd confirm: "+update_.getUpdateText() +" from "+other_.getIdent());

   }
}
final MicroBlogNode local = new MicroBlogNode("localhost:8888");
final MicroBlogNode other = new MicroBlogNode("localhost:8988");
final Update first = getUpdate("1");
final Update second = getUPdate("2");

    new Thread(new Runnable(){
           public void run(){
               local.propagateUpdate(first,other);
           }
    }).start();

    new Thread(new Runnable(){
           public void run(){
               other.propagateUpdate(second,local);
           }
    }).start();

上述中有两个更新分别发送给不同的线程,每一个都必须由后备线程进行确认,如此看来似乎没什么问题,但是实际执行起来就会发生死锁问题,,每个线程都说自己收到了更新,因为每个线程在确认方法能够得到确认之前都要求另一个线程释放线程锁。

本例中第一个线程以A(propagateUpdate),B(confirmUpdate)的顺序获得锁,而第二个线程以B,A的方式获得线程锁,有一个处理死锁的技巧:两个线程都已A,B的顺序获得线程锁即可。

两个线程两把锁,若是以不同的顺序获得锁就很有可能发生死锁现象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值