上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时,该类并不能保证线程安全性,因为还是有可能会出现多个线程共同访问实例变量,导致出现脏数据的情况。