从官方的javadoc可以知道,
- 当一个线程到达exchange调用点时,
- 如果它的伙伴线程此前已经调用了此方法,
- 那么它的伙伴会被调度唤醒并与之进行对象交换,
- 然后各自返回。
- 如果它的伙伴还没到达交换点,
- 那么当前线程将会被挂起,
- 直至伙伴线程到达——完成交换正常返回;
- 或者当前线程被中断——抛出中断异常;
- 又或者是等候超时——抛出超时异常。
- 如果它的伙伴线程此前已经调用了此方法,
内部实现比较巧妙,使用了unsafe的CAS原子操作、自旋来解决冲突问题
- 比如有2条线程A和B,A线程交换数据时,
- 发现slot为空,
- 则将需要交换的数据放在slot中等待其它线程进来交换数据,
- 等线程B进来,读取A设置的数据,
- 然后设置线程B需要交换的数据,
- 然后唤醒A线程,原理就是这么简单。
- 当时当多个线程之间进行交换数据时就会出现问题,
- 所以Exchanger加入了slot数组。
- 发现slot为空,