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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值