Update Java 并发.md

增加J.U.C中Exchanger说明
This commit is contained in:
HuaHero 2023-10-28 18:03:17 +08:00 committed by GitHub
parent b70121d377
commit d6a35cffc8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -726,7 +726,7 @@ after
[Java SE 9 Enum Thread.State](https://docs.oracle.com/javase/9/docs/api/java/lang/Thread.State.html)
## 七、J.U.C - AQS
## 七、J.U.C - AQS(AbstractQueuedSynchornizer)
java.util.concurrentJ.U.C大大提高了并发性能AQS 被认为是 J.U.C 的核心。
@ -814,6 +814,13 @@ public class CyclicBarrierExample {
before..before..before..before..before..before..before..before..before..before..after..after..after..after..after..after..after..after..after..after..
```
### Exchanger
Java中的Exchanger类是一个同步工具类用于在两个线程之间交换数据。它提供了一个exchange()方法,当两个线程都调用该方法时,它们会被阻塞,直到彼此都调用了该方法,然后交换数据并返回。
Exchanger类的实现原理是基于AQSAbstractQueuedSynchronizer同步器。当一个线程调用exchange()方法时它会尝试获取同步器的锁如果同步器的状态为0则表示没有其他线程在等待交换数据该线程会将自己加入到同步器的等待队列中并阻塞自己。当另一个线程也调用了exchange()方法时它会尝试获取同步器的锁如果同步器的状态为1则表示有一个线程在等待交换数据该线程会将自己从等待队列中取出并与另一个线程交换数据然后释放同步器的锁使得两个线程都可以继续执行。
需要注意的是Exchanger类只能用于两个线程之间交换数据如果需要多个线程之间交换数据可以使用CyclicBarrier或CountDownLatch等其他同步工具类。
### Semaphore
Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。