java访问并发控制semaphore使用与总结

原创 2018年04月16日 15:24:00

semaphore 这个类是用作访问并发控制,可以设置资源最大同时访问的个数。
初始化时参数1 permits(许可数),定义资源可以并发访问的最大个数
例如

public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Semaphore semaphore = new Semaphore(3);//资源最多可被3个线程并发访问
        for(int i = 0;i < 20;i++){
            final int threadnum = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("current thread"+Thread.currentThread().getName());
                        semaphore.acquire(1);//获取许可
                        test(threadnum);
                        semaphore.release(1);//释放许可
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        executorService.shutdown();//如果不shutdown工程不会结束
    }

    private static void test(int threadNum) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        System.out.println(simpleDateFormat.format(new Date())+"  method run "+Thread.currentThread().getName());
        Thread.sleep(1000);
    }

核心方法semaphore.acquire()默认一次获取一个许可,也可以一次获取多个许可,例如semaphore.acquire(3),如果当前可获取的许可数不足,那么当前线程被阻塞。CPU调度其他线程执行。当可以获取到许可时,线程继续执行,当访问需要的资源结束时需要调用semaphore.release(),默认释放一个许可,也可以释放多个许可。如果忘记释放许可,那么当初始化定义的所有许可都被使用完后,其他线程获取不到许可都会处于阻塞状态,程序就无法继续运行。该段代码中我们对test()方法进行了访问并发控制,最大允许3个线程访问执行该方法。
运行结果如下:
这里写图片描述
可以看到test()方法确实每次只有3个线程能执行,其他的都处于阻塞状态。
Semaphore还可以定义是否公平
fair为TRUE时先阻塞的先获得锁
源码实现:

public Semaphore(int permits, boolean fair) {
    sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}

semaphore.tryAcquire();尝试获取一个锁,成功返回TRUE失败返回false
代码:

public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Semaphore semaphore = new Semaphore(3);//资源最多可被3个线程并发访问
        for(int i = 0;i < 10;i++){
            final int threadnum = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(Thread.currentThread().getName()+" running");
                      if(semaphore.tryAcquire()){
                          test(threadnum);
                          semaphore.release(1);
                      }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        executorService.shutdown();//如果不shutdown工程不会结束
    }

    private static void test(int threadNum) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        System.out.println(simpleDateFormat.format(new Date())+"  method run "+Thread.currentThread().getName());
        Thread.sleep(1000);
    }

运行结果:
这里写图片描述
只有3个线程执行了test()方法,其他尝试获取锁失败的线程就丢弃了
还有带参数的tryAcquire方法,第一个参数是等待的时间,第二个是等待时间的单位。
带参数时,方法会在定义的时间内一直尝试获取许可。
semaphore.tryAcquire(2,TimeUnit.SECONDS)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/d597180714/article/details/79961161

java多线程Semaphore使用实例,细化粒度控制并发数量

1、Semaphore:线程协同类,用来控制线程并发数量,并且可以更加细粒度的进行控制,因为真正被控制最大并发的代码放到了acquire和release之间。 2、主要方法: //初始值 co...
  • javaloveiphone
  • javaloveiphone
  • 2017-02-07 11:33:22
  • 1249

Java并发编程--深入理解Semaphore

Semaphore简介Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore的用途Semaphore可以用于做流量控制,特别...
  • u013309870
  • u013309870
  • 2017-06-06 16:03:28
  • 450

Semaphore 控制并发访问线程数

Semaphore, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 /** * Semaphore 信号量 控制并发访问的线程数 */ ExecutorS...
  • shineflowers
  • shineflowers
  • 2015-12-28 10:38:20
  • 1219

Java的Semaphore使用总结

前言: 信号量是用来对某一共享资源所能访问的最大个数进行控制 代码示例一: package com.example; import java.util.concurrent.Semaphore...
  • u010661782
  • u010661782
  • 2016-06-15 10:14:29
  • 2504

Java并发编程中Semaphore的用法

Semaphore又称信号量,是操作系统中的一个概念,在Java并发编程中,信号量控制的是线程并发的数量。public Semaphore(int permits)其中参数permits就是允许同时运...
  • sinat_36246371
  • sinat_36246371
  • 2016-12-25 21:13:13
  • 5583

Semaphore的介绍和使用

http://wosyingjun.iteye.com/blog/2299860 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后...
  • zzy7075
  • zzy7075
  • 2016-08-02 16:48:40
  • 1246

[C#学习笔记之多线程2]多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

“线程同步”的含义         当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thr...
  • wanjun8659
  • wanjun8659
  • 2012-05-31 23:05:20
  • 8664

Java中Semaphore(信号量)的使用

Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解...
  • zbc1090549839
  • zbc1090549839
  • 2016-11-29 10:30:44
  • 10267

Java并发之Semaphore详解

一、入题        Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016-08-09 20:51:38
  • 18196

Java Semaphore用法

操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取...
  • kevin_Luan
  • kevin_Luan
  • 2013-10-17 09:54:59
  • 11489
收藏助手
不良信息举报
您举报文章:java访问并发控制semaphore使用与总结
举报原因:
原因补充:

(最多只允许输入30个字)