多线程能利用现代CPU的多核心特性,提高程序的性能,尤其在游戏开发中使用更为广泛。
在Java中提供了各种工具类,关键字来实现多线程的。
多线程中最难的莫过于线程同步和线程协作,怎样实现同步?下面本人提出自己解决多线程的一些观点:
比如有个boss,多个玩家可以打他,这时候需要对boss进行同步。
案例代码1(synchnorized加锁):
synchnorized(boss){ player.fight(boss); }
synchnorized(boss){ synchnorized(player){ player.fight(boss); } }
案例代码2(lock加锁):
在boss中我们增加2个锁,被打和打,比如:
class Boss{ private final Lock FIGHT = new ReentrantLock(); private final Lock DEFEND = new ReentrantLock(); }
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进行同步。时间关系,这个将在下一篇文章给出。