643 字
3 分钟
线程间有哪些通信方式?

线程间有哪些通信方式?#

Java 中线程之间的通信主要是为了解决线程之间如何协作运行的问题。Java 提供了多种线程通信的方式,使得线程可以在合适的时间和地点进行同步。 image.png 线程间通信方式 ①、volatile 和 synchronized 关键字 关键字 volatile用来修饰成员变量,告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,保证所有线程对变量访问的可见性。 关键字 synchronized 可以修饰方法,或者以同步代码块的形式来使用,确保多个线程在同一个时刻,只能有一个线程在执行某个方法或某个代码块。 ②、等待/通知机制 一个线程调用共享对象的 wait() 方法时,它会进入该对象的等待池,并释放已经持有的该对象的锁,进入等待状态,直到其他线程调用相同对象的 notify() 或 notifyAll() 方法。 一个线程调用共享对象的 notify() 方法时,它会唤醒在该对象等待池中等待的一个线程,使其进入锁池,等待获取锁。 Condition 也提供了类似的方法,await() 负责等待、signal() 和 signalAll() 负责通知。 通常与锁(特别是 ReentrantLock)一起使用,为线程提供了一种等待某个条件成真的机制,并允许其他线程在该条件变化时通知等待线程。更灵活、更强大。 ③、管道输入/输出流 管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同,它主要用于线程之间的数据传输,而传输的媒介为内存。 管道输入/输出流主要包括了如下 4 种具体实现:PipedOutputStream、PipedInputStream、 PipedReader 和 PipedWriter,前两种面向字节,而后两种面向字符。 ④、使用 Thread.join() 如果一个线程 A 执行了 thread.join()语句,其含义是:当前线程 A 等待 thread 线程终止之后才从 thread.join()返回。 ⑤、使用 ThreadLocal ThreadLocal是 Java 中提供的一种用于实现线程局部变量的工具。它允许每个线程都拥有自己的独立副本,从而实现线程隔离。ThreadLocal 可以用于解决多线程中共享对象的线程安全问题。 那其实除了上面提到的这些,还有很多通信工具类 CountDownLatchCyclicBarrierSemaphore等并发工具类。

线程间有哪些通信方式?
作者
强人自传
发布于
2020-05-21
许可协议
CC BY-NC-SA 4.0