![Java并发编程:核心方法与框架](https://wfqqreader-1252317822.image.myqcloud.com/cover/235/822235/b_822235.jpg)
上QQ阅读APP看书,第一时间看更新
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/icon1.png?sign=1739289626-hYfjnHP9JLLRCqTK8LxEaCS7ffqdODiA-0-1259ecce2a3e50d11e4a820d94ad3a5f)
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所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0017_0001.jpg?sign=1739289626-bBzLQxIgAlMR8AQR3Qq02baTnGfuazX0-0-bc446e9e3efaf4a05ca78d9720305610)
图1-5 3个线程类代码
程序运行后的效果如图1-6所示。
图1-6中打印的结果说明同一时间只有2个线程可以同时执行acquire()和release()之间的代码。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0017_0002.jpg?sign=1739289626-HKpjHvZRjs7TOqusPywoM2frEEFHtqE5-0-9c73e6387216ee2dd4c6d2289d86da1a)
图1-6 线程AB共同进入C被排斥
另外需要说明一下,对Semaphore类的构造方法传递的参数permits值如果大于1时,该类并不能保证线程安全性,因为还是有可能会出现多个线程共同访问实例变量,导致出现脏数据的情况。