Java并发系列3

Wesley13
• 阅读 410

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

public class SemapDemo implements Runnable {
    final Semaphore semaphore = new Semaphore(5);

    @Override
    public void run() {
        try {
            semaphore.acquire();
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getId() + "done!");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(20);
        SemapDemo demo = new SemapDemo();
        for (int i = 0; i < 20; i++) {
            service.execute(demo);
        }
        service.shutdown();
    }
}

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

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

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

点赞
收藏
评论区
推荐文章
MaxSky MaxSky
3年前
Steam Apex Legends 领取方法
博主是个热爱Apex的玩家,OriginSteam上已经有1000小时左右的游戏时长了。游戏场次...超过5000;)Apex上了Steam平台,所以不少玩家已经卸载了“烂橘子”。当然,我也是。不过Steam上锁了国区,如果我们直接访问最终会得到<fontcolor"orange"“您所在的地区目前不提供此物品
Wesley13 Wesley13
2年前
Java垃圾回收调优
Java垃圾回收调优博客分类:jvmjava在Java中,通常通讯类型的服务器对GC(GarbageCollection)比较敏感。通常通讯服务器每秒需要处理大量进出的数据包,需要解析,分解成不同的业务逻辑对象并做相关的业务处理,这样会导致大量的临时对象被创建和回收。同时服务器如果需要同时保存用户状态的话,又会产生很多永久的对象,比如用户sess
Stella981 Stella981
2年前
Skynet 通过组播(Multicast)实现一个简单的世界频道
什么是世界频道?  "世界频道"这个概念就是在一个游戏内经常见到。简单来说,世界频道就是在游戏内的一个大区中所有玩家可以接收、发布的消息的一个玩家间的统称。  玩家在游戏中进行体验的同时,通常需要发布一些特殊的消息,包含:"买卖装备、组队等";通常游戏中的各种频道的实现都依赖于消息队列的广播方式。Skynet的组播解决
Stella981 Stella981
2年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Wesley13 Wesley13
2年前
Java 并发编程:进程、线程、并行与并发
一谈到Java并发编程,我们一般就会联想起进程、线程、并行、并发等等概念。那么这些概念都代表什么呢?进程与线程有什么关系?并发与并行又是什么关系呢?进程与线程进程是指程序的一次动态执行过程,通常我们说计算机中正在执行的程序就是进程,每个程序都会对应着一个进程。一个进程包含了从代码加载到执行完成的一个完整过程,它是操作系统资源分配最小单
Wesley13 Wesley13
2年前
Java并发系列[6]
Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制。Semaphore提供了一个许可证的概念,可以把这个许可证看作公共汽车车票,只有成功获取车票的人才能够上车,并且车票是有一定数量的,不可能毫无限制的发下去,这样就会导致公交车
Wesley13 Wesley13
2年前
Java并发系列(6)Semaphore源码分析
Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制。Semaphore提供了一个许可证的概念,可以把这个许可证看作公共汽车车票,只有成功获取车票的人才能够上车,并且车票是有一定数量的,不可能毫无限制的发下去,这样就会导致公
物理裸机配置如何转换为天翼云云主机配置
在IT系统建设中,软件平台厂商(ISV)给出的IT资源需求往往是物理机裸机配置。上云后怎么把物理裸机配置转变为云主机配置就成了一个需要认真考虑的问题。今天就来讨论一下这个问题。以应用服务器为例,假如软件平台厂商给出的是华为RH2288Hv3这样一款物理裸机,配置如下:拿到服务器配置后,首先我们要核对一下这款服务器的应用场景,确认在这个场景中是否能使用云主机
京东云开发者 京东云开发者
7个月前
浅谈Redis - 热点key问题 | 京东云技术团队
热key问题就是突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis服务器直接宕机。
公孙晃 公孙晃
4个月前
Mac电脑模拟建造游戏:伊始之地Terra Nil for Mac
是一款Mac上的模拟建造游戏,玩家将在荒芜的星球上开展探险,通过采集资源、研究技术、建立基地等方式来打造一个全新的生态系统。游戏画面精美,音效逼真,同时支持中文语言。在游戏中,玩家需要灵活运用各种资源和技术,解决生存和发展的问题,逐步建立起一个繁荣的生态系