多线程能利用现代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进行同步。时间关系,这个将在下一篇文章给出。