同一个进程中,两个线程要怎么交流?

1 个回答

  • 苏茹
    时间不在乎你拥有多少,而在于你怎样使用。
    同一个进程里两个线程通信,本质上就是**共享内存 + 线程同步**,因为它们本来就共享堆内存,但需要用同步手段来保证数据安全、有序。常见方式有: ## 1. 共享变量 + 同步机制 * **volatile 变量**:适合一个线程写、多个线程读的简单场景,保证可见性但不保证原子性。 * **synchronized / Lock**:一个线程写,另一个线程读时用锁保护,保证可见性和互斥。 * **Atomic 类(AtomicInteger、AtomicReference 等)**:CAS 方式保证原子性,适合计数器、状态标记等场景。 示例: ```java class Data { private volatile boolean flag = false; public void setFlag() { flag = true; } public boolean getFlag() { return flag; } } ``` ## 2. wait/notify 机制(Object 级别通信) * 利用 `wait()`、`notify()` / `notifyAll()` 在同一把锁对象上协调。 * 常用于“生产者-消费者”场景。 示例: ```java synchronized(lock) { while(!condition) { lock.wait(); // 等待 } // 条件满足,执行任务 lock.notifyAll(); // 通知其他线程 } ``` ## 3. 阻塞队列(BlockingQueue) * 使用 `ArrayBlockingQueue`、`LinkedBlockingQueue` 等,天然线程安全,生产者放数据、消费者取数据。 * 避免了手写 wait/notify 的麻烦。 示例: ```java BlockingQueue<String> queue = new LinkedBlockingQueue<>(); queue.put("data"); // 生产者 String msg = queue.take(); // 消费者 ``` ## 4. 信号量 / 条件变量 * **Semaphore**:控制线程并发数,或作为简单信号机制。 * **Condition**(配合 Lock 使用):功能类似 wait/notify,但可有多个条件队列,粒度更细。 ## 5. 其它高级方式 * **CountDownLatch**:等待一组线程执行完毕后继续。 * **CyclicBarrier**:多个线程到达屏障点后一起继续。 * **Exchanger**:两个线程直接交换数据。 > “同一个进程的线程共享堆内存,所以通信很简单,但必须用同步机制保证线程安全。常见方式包括共享变量 + 锁、wait/notify、BlockingQueue,以及 CountDownLatch、Semaphore、Exchanger 等工具类。”
    发布于 2025-08-13 11:33 •IP属地 河北
    举报
    评论
    收藏