前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发编程之信号量

并发编程之信号量

作者头像
爱撒谎的男孩
发布2018-07-04 15:25:51
6610
发布2018-07-04 15:25:51
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

并发编程之信号量

详解

1、Semaphore可以控同时访问的线程个数

2、Semaphore类位于java.util.concurrent包下,它提供了2个构造器:

12345678

//参数permits表示许可数目,即同时可以允许多少线程进行访问public Semaphore(int permits) { sync = new NonfairSync(permits);}//这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可public Semaphore(int permits, boolean fair) { sync = (fair)? new FairSync(permits) : new NonfairSync(permits);}

3、重要方法,acquire()、release()方法:

  • acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可
  • release()用来释放许可。注意,在释放许可之前,必须先获获得许可
  • 这4个方法都会被阻塞

1234

public void acquire() throws InterruptedException { } //获取一个许可public void acquire(int permits) throws InterruptedException { } //获取permits个许可public void release() { } //释放一个许可public void release(int permits) { } //释放permits个许可

  • 不阻塞的方法如下:

12345678

//尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回falsepublic boolean tryAcquire() { }; //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回falsepublic boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException { }; //尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回falsepublic boolean tryAcquire(int permits) { }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回falsepublic boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException { };

  • 通过availablePermits()方法得到可用的许可数目

举例

  • 我们知道读锁可以允许多个线程同时进行读取,我们可以使用信号量来限制线程个数,如下

12345678910111213141516171819202122232425262728293031323334

public class TestSemaphore { private static final Semaphore semaphore=new Semaphore(5,true); //创建5个信号量同时用与读文件 private static final ReentrantReadWriteLock rwLock= new ReentrantReadWriteLock(); private static final Lock rLock=rwLock.readLock(); //获取读锁 public static void main(String[] args) { //执行10个线程,通过信号量控制,只能5个线程5个线程的执行 for (int i = 0; i < 10; i++) { MyThread thread=new MyThread(); thread.setName("线程"+(i+1)); thread.start(); } } static class MyThread extends Thread{ @Override public void run() { reader(); } //读方法 public void reader(){ rLock.lock(); //获取读锁 try { semaphore.acquire(); //获取信号量,信号量-1,如果没有成功获取,那么阻塞 System.out.println(this.getName()+"正在读文件"); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); }finally{ semaphore.release(); //释放信号量 rLock.unlock(); //释放锁 } } }}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 并发编程之信号量
    • 详解
      • 举例
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档