线程同步工具:Semaphore

Semaphore可以控制某个资源可被同时访问的线程个数,通过  acquire()  获取一个许可,如果没有就等待,而   release()  释放一个许可。

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。此类的构造方法可选地接受一个公平 参数。当设置为 false 时,此类不对线程获取许可的顺序做任何保证。当公平设置为 true 时,信号量保证对于任何调用 acquire 方法的线程而言,都按照处理它们调用这些方法的顺序来选择线程、获得许可。

图片

public static void main(String[] a){

        final Semaphore semaphore=new Semaphore(5);//初始化,表示只有5个人同时上厕所

        //final Semaphore semaphore=new Semaphore(5,true);//表示只有5个人同时上厕所,谁先等谁先得
        for(int i=0;i<10;i++){

            final int t=i+1;

            new Thread(new Runnable() {

                @Override

                public void run() {

                    try {

                        semaphore.acquire();//获取一个坑,如果没有空闲的就一直等待

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(t + " 获得了一个坑");

                    try {

                        Thread.sleep(2000);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(t + " 离开坑");


                    semaphore.release();//释放位置



                }

            }).start();

        }

    }

 运行结果:

6 获得了一个坑

10 获得了一个坑

4 获得了一个坑

8 获得了一个坑

1 获得了一个坑

4 离开坑

6 离开坑

5 获得了一个坑

9 获得了一个坑

10 离开坑

2 获得了一个坑

8 离开坑

3 获得了一个坑

1 离开坑

7 获得了一个坑

2 离开坑

9 离开坑

5 离开坑

3 离开坑

7 离开坑

 可以看到,前面5个线程可以获得位置,然后几个线程释放了位置,就有几个线程又能获得位置。
====================================================================================
关注微信公众号 “Java技术”,可以实时获取有价值的技术文章推送。
"Java技术"交流群: 245130488  

"Java软件工程师培训"系列课程正式推出,助你自学成才,进入IT行业。

www.chuanke.com/s3377987.html

 本文用 菊子曰发布

你可能感兴趣的:(线程同步工具:Semaphore)