Java多线程-1

多线程能利用现代CPU的多核心特性,提高程序的性能,尤其在游戏开发中使用更为广泛。

在Java中提供了各种工具类,关键字来实现多线程的。


多线程中最难的莫过于线程同步和线程协作,怎样实现同步?下面本人提出自己解决多线程的一些观点:

比如有个boss,多个玩家可以打他,这时候需要对boss进行同步。


案例代码1(synchnorized加锁):

synchnorized(boss){
  player.fight(boss);
}

这样就能简单解决多个玩家攻打boss的问题。如果玩家需要加锁(防止玩家同时打多个boss)。那么,可以这样:

synchnorized(boss){
  synchnorized(player){
    player.fight(boss);
  }
}

这样似乎解决了,但是有一种情况,很多玩家攻打boss,如果boss打玩家也是synchnorized锁,那么,boss需要等到所有玩家攻打他的锁被释放才能打其他玩家(最坏的情况是BOSS还没出手,就玩家刷死了)。解决方法请看案例2:

案例代码2(lock加锁):

在boss中我们增加2个锁,被打和打,比如:

class Boss{
  private final Lock FIGHT    = new ReentrantLock();
  private final Lock DEFEND = new ReentrantLock();
}

那么多玩家攻打boss可以使用代码:

try{
  int retryTime = 3;
  while(retryTime-->=0 && !boss.getDefendLock().tryLock()){
    player.fight(boss);
  }
}catch(Exception e){
}finally{
  boss.getDefendLock().unLock();
}

而boss攻打玩家可以使用代码:

try{
  int retryTime = 3;
  while(retryTime-->=0 && !boss.getFightLock().tryLock()){
    boss.fight(player);
  }
}catch(Exception e){
}finally{
  boss.getFightLock().unLock();
}

这样似乎解决了问题,但是,你想想,boss打玩家和玩家打boss既然是分开的,那么就有可能出现,玩家刚好打了boss100血,而boss在打玩家的时候显示这100血还在。

于是,我想出了使用CAS进行同步。时间关系,这个将在下一篇文章给出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值