Java并发编程:核心方法与框架
上QQ阅读APP看书,第一时间看更新

1.1.2 类Semaphore构造方法permits参数作用

参数permits的作用是设置许可的个数,前面已经使用过代码:


        private Semaphore semaphore = new Semaphore(1);

来进行程序的设计,使同一时间内最多只有1个线程可以执行acquire()和release()之间的代码,因为只有1个许可。

其实还可以传入>1的许可,代表同一时间内,最多允许有x个线程可以执行acquire()和release()之间的代码。

创建实验用的项目SemaphoreTest2,将SemaphoreTest1项目中的所有源代码复制到SemaphoreTest2中。

并更改类Service.java代码如下:


        package service;
        import java.util.concurrent.Semaphore;
        public class Service {
            private Semaphore semaphore = new Semaphore(2);
            public void testMethod() {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()
                              + " begin timer=" + System.currentTimeMillis());
                    Thread.sleep(5000);
                    System.out.println(Thread.currentThread().getName()
                              + "    end timer=" + System.currentTimeMillis());
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

使用代码new Semaphore(2)来实例化Semaphore类的含义是同一时间内最多允许2个线程执行acquire()和release()之间的代码。

创建3个线程类如图1-5所示。

图1-5 3个线程类代码

程序运行后的效果如图1-6所示。

图1-6中打印的结果说明同一时间只有2个线程可以同时执行acquire()和release()之间的代码。

图1-6 线程AB共同进入C被排斥

另外需要说明一下,对Semaphore类的构造方法传递的参数permits值如果大于1时,该类并不能保证线程安全性,因为还是有可能会出现多个线程共同访问实例变量,导致出现脏数据的情况。