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进行同步。时间关系,这个将在下一篇文章给出。

你可能感兴趣的:(java,多线程,游戏,exception,Class,工具)