![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=1739372413-xjE4wvHAXsey3FpRgrLwZkreXLoMsHK8-0-f7c1f0f9233cf1f152aa74fd379cad7d)
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=1739372413-uPm8AOxsyMEohCRYhC37UWazZ6uwcbbJ-0-fdbd501d73571b2af4fb19f0e1daa88f)
图1-5 3个线程类代码
程序运行后的效果如图1-6所示。
图1-6中打印的结果说明同一时间只有2个线程可以同时执行acquire()和release()之间的代码。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0017_0002.jpg?sign=1739372413-mSXvvXec2GGZEsA3lj5JUs7IJrDKH9qo-0-0e1f8600032890e245b3e415d0b76871)
图1-6 线程AB共同进入C被排斥
另外需要说明一下,对Semaphore类的构造方法传递的参数permits值如果大于1时,该类并不能保证线程安全性,因为还是有可能会出现多个线程共同访问实例变量,导致出现脏数据的情况。