`
朋在无锡
  • 浏览: 34319 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java游戏开发实践1_多线程

阅读更多

       游戏并发量较大,主要有三方面需要特殊处理:并发,nio以及持久化.今天将自己项目开发中的多线程心得总结一下,入门不久,希望多交流指导.目前开发中处理并发主要用到一下方法:

 

  1. synchronized.有锁定对象或者锁定mutext(互斥量),例如世界boss中血量的修改,所有玩家共享一个血量;

  2. 将客户端请求放入队列中,队列有单线程处理(executors.newSingleThreadExecutor).由于队列的先后顺序避免了加锁.例如在注册需要检查登录名字是否重复,将所有注册登录请求放入一个队列中处理;
  3. 每个玩家一个锁.维护一个map(playerid,playerMutex)。需要操作本玩家数据时需要先获取到该锁,玩家自身登陆时候也需要获取倒锁。充值和加入帮会都用这种方法处理(因为其它玩家会修改本玩家账户或者本玩家帮派属性)。特别地,为减少蝗虫玩家数据,我们会清理掉离线一定时间玩家缓存数据,同时使用redis分布式缓存需要共享给其他玩家的数据(如本人战斗力,领地资源点等),这里也使用了玩家锁;
  4. volatile:判断玩家是否拥有军团是通过玩家(PlayerEntity)的域变量legionId!=0完成,这里设置成volatile,不要编译器优化,需要变量每次都去主存获取,保证可视化;
  5. CAS:数据库自增长开销较大,我们将自增长放置到缓存中进行,数据只处理插入操作。玩家id(playerid)的获得即通过redis 的incr()方法,其会对redis中的id加1,并返回最新的一个id
  6. AtomicInteger:是CAS一个具体事例,保证原子性操作,项目中有几个线程修改时用到其中的getAndAdd以及get方法。
  7. reentrantLock,在await时这个锁是会释放的.同时可以tryLock尝试获取锁.提供比synchronized更细粒度的控制,当前项目中还具体使用.

欢迎留言指导.有更新会继续更新.谢谢!

主要参考书籍<java并发编程实战><Think in Java><Efficient Java>

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics