资讯专栏INFORMATION COLUMN

java并发编程学习9-同步器--信号量

Jokcy / 2312人阅读

摘要:为了通过信号量,线程通过调用请求许可。许可的数目是固定的,由此限制了线程通过的数量。当设置为时默认也是,此类不对线程获取许可的顺序做任何保证。

【同步器

java.util.concurrent包包含几个能帮助人们管理相互合作的线程集的类。这些机制具有为线程直间的共用集结点模式提供的‘预制功能’。如果有一个相互合作的线程满足这些行为模式之一,那么应该直接使用提供的类库而不是显示的使用锁与条件的集合。

【信号量

一个信号量管理过个许可证。为了通过信号量,线程通过调用acquire()请求许可。其实没有实际的许可对象,信号连也仅仅是维护一个计数器。许可的数目是固定的,由此限制了线程通过的数量。当一个线程执行完之后,应该调用release()释放许可证,让其他线程有机会执行。事实上,任意一个线程都有可以释放任意个数的许可证,这可能会增加许可证的个数。所以我建议,如果不是非常明确的知道为什么要释放多个许可证,就一定是让获得许可证的线程是放一个许可证。

【常用方法

构造函数:
  - Semaphore(int permits):创建具有给定许可数和非公平设置的Semaphore
  - Semaphore(int permits,boolean fair):此类的构造方法可选地接受一个公平 参数。当设置为 false 时(默认也是false),此类不对线程获取许可的顺序做任何保证。特别地,闯入是允许的,也就是说可以在已经等待的线程前为调用 acquire() 的线程分配一个许可,从逻辑上说,就是新线程将自己置于等待线程队列的头部。当公平设置为 true 时,信号量保证对于任何调用获取方法的线程而言,都按照处理它们调用这些方法的顺序(即先进先出;FIFO)来选择线程、获得许可。注意,FIFO 排序必然应用到这些方法内的指定内部执行点。所以,可能某个线程先于另一个线程调用了 acquire,但是却在该线程之后到达排序点,并且从方法返回时也类似。

  2. Semaphore还提供一些其他方法:

    - int availablePermits() :返回此信号量中当前可用的许可证数。
    - int getQueueLength():返回正在等待获取许可证的线程数。
    - boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
    - void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
    - Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
    
 

当许可证的个数为1时,可以充当互斥锁使用。

【例子:只能同时有5个线程访问的信号量
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaTest {

    public static void main(String[] args) throws InterruptedException {
        // 线程池
        ExecutorService exec = Executors.newFixedThreadPool(20);
        // 只能5个线程同时访问
        final Semaphore semp = new Semaphore(5);
        // 模拟20个客户端访问
        for (int index = 0; index < 20; index++) {
            final int NO = index;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        //记住这里需要使用while,如果直接用if判断,那么每个线程只有一次机会去尝试占有对象
                        while (1 == 1){
                            // 获取许可
                            if(semp.tryAcquire()) {
                                System.out.println(Thread.currentThread().getName() + " 【 Access: " + NO);
                                Thread.sleep(100);
                                // 访问完后,释放
                                semp.release();
                                System.out.println(Thread.currentThread().getName() + " 【 Release: " + NO);
                                System.out.println("----------------- 【 " + Thread.currentThread().getName() + "】" + semp.availablePermits());
                                break;
                            }else{
                                System.out.println(Thread.currentThread().getName() + " 【 NOT Access: " + NO);
                                Thread.sleep(100);
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            exec.execute(run);
        }
        //让子线程有充分时间运行完
        Thread.sleep(1000);
        exec.shutdown();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68091.html

相关文章

  • Java 多线程并发编程面试笔录一览

    摘要:创建线程的方式方式一将类声明为的子类。将该线程标记为守护线程或用户线程。其中方法隐含的线程为父线程。恢复线程,已过时。等待该线程销毁终止。更多的使当前线程在锁存器倒计数至零之前一直等待,除非线 知识体系图: showImg(https://segmentfault.com/img/bVbef6v?w=1280&h=960); 1、线程是什么? 线程是进程中独立运行的子任务。 2、创建线...

    bitkylin 评论0 收藏0
  • java

    摘要:多线程编程这篇文章分析了多线程的优缺点,如何创建多线程,分享了线程安全和线程通信线程池等等一些知识。 中间件技术入门教程 中间件技术入门教程,本博客介绍了 ESB、MQ、JMS 的一些知识... SpringBoot 多数据源 SpringBoot 使用主从数据源 简易的后台管理权限设计 从零开始搭建自己权限管理框架 Docker 多步构建更小的 Java 镜像 Docker Jav...

    honhon 评论0 收藏0
  • Java并发编程笔记(二)

    摘要:本文探讨并发中的其它问题线程安全可见性活跃性等等。当闭锁到达结束状态时,门打开并允许所有线程通过。在从返回时被叫醒时,线程被放入锁池,与其他线程竞争重新获得锁。 本文探讨Java并发中的其它问题:线程安全、可见性、活跃性等等。 在行文之前,我想先推荐以下两份资料,质量很高:极客学院-Java并发编程读书笔记-《Java并发编程实战》 线程安全 《Java并发编程实战》中提到了太多的术语...

    NickZhou 评论0 收藏0
  • 并发编程导论

    摘要:并发编程导论是对于分布式计算并发编程系列的总结与归纳。并发编程导论随着硬件性能的迅猛发展与大数据时代的来临,并发编程日益成为编程中不可忽略的重要组成部分。并发编程复兴的主要驱动力来自于所谓的多核危机。 并发编程导论是对于分布式计算-并发编程 https://url.wx-coder.cn/Yagu8 系列的总结与归纳。欢迎关注公众号:某熊的技术之路。 showImg(https://...

    GeekQiaQia 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<