线程间的数据共享除了定义一个共享数据然后各个线程去访问这种方式外,还可以使用Exchanger交换数据。
简单案例
首先看看Exchanger的运用,Exchanger最简单的测试代码,如下图:
对应打印的结果如下:
线程2创建对象java.lang.Object@3f6d4362
线程1创建对象java.lang.Object@c986ad7
线程2得到的类java.lang.Object@c986ad7
线程1得到的类java.lang.Object@3f6d4362
可以看出来线程2创建的对象与线程1得到的线程是同一个对象,也就是他们指向的是同一个引用。
Exchanger源码分析
Exchanger只提供了两个exchange方法,一个是只带交换的数据参数,另外一个不仅有数据参数,还有时间限制,这也从侧面说明exchange是一个阻塞线程的方法,并且可以指定阻塞时间,这里我们先分析下不带时间参数的exchange方法,源码分析主流程如下图:
左边是exchange方法的代码流程图,比较简单可以明显的看出来主要依靠两个方法slotExchange与arenaExchange方法,