Java并发系列3

考虑这样的场景:我司出了一款新游戏,因模式新颖、宣传到位,导致游戏开服火爆,每次新开一个服务器就会一下涌入大量玩家。假如一个线路服务器的承载力上限是5000,那么我们该通过什么机制进行资源调配呢?
比较容易想到的方法就是给每个玩家发许可证,同时一个服务器的许可证上限为5000,这样的话,许可证超出上限则玩家需要排队。
今天我们讲的并发工具就如同代码层面的许可证。
先来看代码:

1public class SemapDemo implements Runnable { 2 final Semaphore semaphore = new Semaphore(5); 3 4 @Override 5 public void run() { 6 try { 7 semaphore.acquire(); 8 Thread.sleep(1000); 9 System.out.println(Thread.currentThread().getId() + "done!"); 10 semaphore.release(); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 15 } 16 17 public static void main(String[] args) { 18 ExecutorService service = Executors.newFixedThreadPool(20); 19 SemapDemo demo = new SemapDemo(); 20 for (int i = 0; i < 20; i++) { 21 service.execute(demo); 22 } 23 service.shutdown(); 24 } 25}

看到我们的主角:Semaphore,他的构造必须有一个参数,表示许可证的数量。
Semaphore的主要方法有:

  • acquire() 用于获取一个许可,如果暂时无法获得,则进行等待
  • acquireUninterruptibly() 不响应中断的acquire()方法
  • tryAcquire() 尝试获得一个许可,成功返回true;不成功立即返回。还有一个可设置等待时间的重载方法
  • release() 释放一个许可

我们看到这个工具类使用起来还是相对简单的。
扩展阅读:锁框架核心:AbstractQueuedSynchronizer

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Steam Apex Legends 领取方法

博主是个热爱Apex的玩家,OriginSteam上已经有1000小时左右的游戏时长了。游戏场次...超过5000;)Apex上了Steam平台,所以不少玩家已经卸载了“烂橘子”。当然,我也是。不过Steam上锁了国区,如果我们直接访问最终会得到<fontcolor"orange"“您所在的地区目前不提供此物品

Skynet 通过组播(Multicast)实现一个简单的世界频道

什么是世界频道?  "世界频道"这个概念就是在一个游戏内经常见到。简单来说,世界频道就是在游戏内的一个大区中所有玩家可以接收、发布的消息的一个玩家间的统称。  玩家在游戏中进行体验的同时,通常需要发布一些特殊的消息,包含:"买卖装备、组队等";通常游戏中的各种频道的实现都依赖于消息队列的广播方式。Skynet的组播解决

Noark入门之线程模型

0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被

Java 并发编程:进程、线程、并行与并发

一谈到Java并发编程,我们一般就会联想起进程、线程、并行、并发等等概念。那么这些概念都代表什么呢?进程与线程有什么关系?并发与并行又是什么关系呢?进程与线程进程是指程序的一次动态执行过程,通常我们说计算机中正在执行的程序就是进程,每个程序都会对应着一个进程。一个进程包含了从代码加载到执行完成的一个完整过程,它是操作系统资源分配最小单

Java并发系列[6]

Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制。Semaphore提供了一个许可证的概念,可以把这个许可证看作公共汽车车票,只有成功获取车票的人才能够上车,并且车票是有一定数量的,不可能毫无限制的发下去,这样就会导致公交车