控制资源并发访问Semaphore
Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法处阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。
Semaphroe可以用于流量控制,特别是在公共资源优先的应用场景,比如数据库连接,假如有多个线程读取数据后,需要将数据保存在数据库中,而可用的最大数据库连接只有10个,这时候就需要使用Semaphroe来控制能够并发访问到数据库连接资源的线程个数最多只有10个。在限制资源使用的应用场景下,Semaphore是非常适合的。
Semaphore里面的一些方法:
根据输出结果进行饭呢西,Semaphore允许的最大许可数为5,也就是允许的最大并发执行的线程个数为5,可以看出,前5个线程(前5个学生)先获取到笔,然后填表,而6-10这5个线程,由于获取不到许可只能阻塞等待,当有线程释放许可后,其他线程才可以获取许可并继续往下执行。Semaphore用来做特殊资源的并发访问控制是相当合适的,如果有业务场景需要进行流量控制,可以优先考虑Semaphore。
线程间交换数据的工具Exchanger
Exchanger是一个用于线程间协作的工具类,用于两个线程间交换数据。它提供了一个交换的同步点,在这个同步点两个线程能够交换数据。交换数据是通过exchange方法来实现的,如果一个线程先执行exchange方法,那么它会同步等待另一个线程也执行exchange方法,这个时候两个线程就都达到了同步点,两个线程就可以交换数据。
Exchange除了一个无参的构造方法外,主要方法也很简单:
例子:
输出结果
这个例子很简单,也很能说明Exchanger的基本使用。当两个线程都到达调用excheange方法的同步点的时候,两个线程能交换彼此的数据。