一、semaphore的使用
1.类semaphore的同步性
多线程中的同步概念其实就是排着队去执行一个任务,执行任务是一个一个执行,并不能并行执行,这样的优点是有助于程序逻辑的正确性,不会出现非线程安全问题,保证软件系统功能上的运行稳定性。

类semaphore的构造函数参数permits是许可的意思,代表同一时间内,最多允许多少个线程同时acquire()和release()之间的代码。
无参方法acquire()的作用是使用1个许可,是减法操作。
2.类semaphore构造方法permits参数的作用
private Semaphore semaphore = new Semaphore(1);
使同一时间内最多只有1个线程可以执行acquire()和release()之间的代码,因为只有一个许可。

new Semaphore(2);含义是同一时间内最多允许2个线程执行acquire()和release()之间的代码。
3.方法acquire(int permits)参数作用及动态添加permits许可数量
有参方法acquire(int permits)的功能是每调用1次此方法,就使用X个许可。


4.方法acquireUninterruptibly的使用
方法acquireUninterruptibly()的作用是使等待进入acquire()方法的线程,不允许被中断。



5.方法availablePermits()和drainPermits()
availablePermits()返回此semaphore对象中当前可用的许可数,此方法通常用于调试,因为许可的数量有可能时时在变化,并不是固定的数量。
drainPermits()可获取并返回立即可用的所有的许可个数,并将可用许可置0.


6.方法getQueueLength()和hasQueuedThreads()
getQueueLength()的作用是获取等待许可的线程个数。
hasQueuedThreads()的作用是判断有没有线程在等待这个许可。
7.方法tryAcquire()的使用
该方法尝试地获取1个许可,如果获取不到则返回false,此方法通常与if语句结合使用,其具有无阻塞的特点。
8.方法tryAcquire(int permits)的使用
该方法的作用是尝试的获取X个许可,如果获取不到则返回false。
9.方法tryAcquire(long timeout, TimeUnit unit)的使用
该方法的作用是在指定的时间内尝试地获取1个许可,如果获取不到则返回false。
10.方法tryAcquire(int permits, long timeout, TimeUnit unit)的使用
在指定时间内尝试地获取X个许可,如果获取不到则返回false。
二、Exchanger的使用
类exchange的功能可以使2个线程之间传输数据,它比生产者/消费者模型使用的wait和notify更加方便。
1.方法exchange()阻塞的特性
类Exchanger中的exchange()方法具有阻塞的特色,也就是此方法被调用后等待其他线程来获取数据,如果没有其他线程取得数据,则一直等待。


2.方法exchange()传递数据



本文详细介绍了Semaphore的构造方法、各类方法的使用及其作用,包括许可数量的控制、线程同步等;同时还介绍了Exchanger的基本使用,特别是exchange()方法的阻塞性质,帮助读者更好地理解这两个并发工具类。



1万+

被折叠的 条评论
为什么被折叠?



