网上总结了10多种线程间通信的方式,看得我有些头晕,有的人说while轮询也是一种线程通信方式,我想问个问题,那我for轮询是不是也算一种轮询方式呢?问题的关键在于,怎样总结这些线程通信的模型。
我认为,线程通信只有两种,1.共享内存;2.线程间直接通信。再多的都是从这两种演化出来的实现方法。
共享内存通信
- await,notify
- join
- volatile
- cyclicBarrier
- AtomicInteger
- synchronized
- ReentrantLock,Condition
例子可能还有很多,这些通信的模型是一样的,在JVM堆空间有一个变量做控制符。我们通过对他的修改和一种保证线程安全的机制完成共享内存呢的通信,比如await,notify就是根据一个变量的值的变化而等待或释放,在这种情况下,实际上具体用的是synchronized还是ReentrantLock是没区别的。
这种方法的核心是根据变量的变化切换执行的线程,所以volatile也可以达到效果。
线程间直接通信
- Future
- PipedInputStream、PipedOutputStream
这一类方法不借助任何共享变量,直接在两个线程直接互通有无。第一种Futrue的callable接口继承了runnable增加了返回值,A线程发给B线程的消息通过返回值Future可以返回A,不严格的说,这也算是两个线程有了通信的效果。第二种方式是管道法,走IO流的概念,这更是教科书般的线程间直接通信的模版。