wait()/notify()是java内置的线程通信机制,必须在synchronized中使用,操作对象监视器,且一个锁只能对应一个等待队列;2. condition是lock接口的配套工具,一个lock可创建多个condition,实现多个等待队列,支持更精确的线程唤醒控制;3. blockingqueue是基于阻塞的线程安全队列,内部封装了生产者-消费者模式的同步与通信逻辑,适合简化此类场景的开发,无需手动处理wait/notify或condition的复杂逻辑,当需要高效实现生产者-消费者协作时应优先使用blockingqueue。
Java中实现多线程的同步与通信,核心在于确保共享数据的安全访问和线程间的有效协作。这主要通过锁机制(如
synchronized
ReentrantLock
wait()
notify()
notifyAll()
Condition
CountDownLatch
CyclicBarrier
Semaphore
BlockingQueue
Java多线程同步通信的详细教程
在Java多线程编程里,同步与通信是绕不开的话题。我个人觉得,这就像是给一群独立的舞者编排一场群舞,如果没有统一的节拍和彼此间的信号,那最终呈现的肯定是一团乱麻。
立即学习“Java免费学习笔记(深入)”;
同步(Synchronization) 同步的目的是为了控制多个线程对共享资源的访问,防止数据不一致或竞态条件(Race Condition)的发生。
synchronized
synchronized
synchronized
// 示例:synchronized方法 public synchronized void increment() { count++; } // 示例:synchronized代码块 public void updateList(List<String> sharedList, String item) { synchronized (sharedList) { // 锁定共享列表对象 sharedList.add(item); } }
synchronized
java.util.concurrent.locks.Lock
ReentrantLock
java.util.concurrent
ReentrantLock
Lock
synchronized
ReentrantLock
lock()
unlock()
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Counter { private int count = 0; private final Lock lock = new ReentrantLock(); public void increment() { lock.lock(); // 手动加锁 try { count++; } finally { lock.unlock(); // 确保锁被释放 } } }
ReentrantLock
tryLock()
lockInterruptibly()
Condition
通信(Communication) 通信的目的是让线程之间能够互相发送信号,协作完成任务。
Object
wait()
notify()
notifyAll()
synchronized
wait()
notify()
notifyAll()
notify()
notifyAll()
class MessageQueue { private String message; private boolean hasMessage = false; public synchronized void put(String msg) { while (hasMessage) { // 避免虚假唤醒 try { wait(); // 等待消费者取走消息 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } this.message = msg; this.hasMessage = true; notifyAll(); // 通知消费者有新消息了 } public synchronized String take() { while (!hasMessage) { // 避免虚假唤醒 try { wait(); // 等待生产者放入消息 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } String msg = this.message; this.hasMessage = false; notifyAll(); // 通知生产者可以放新消息了 return msg; } }
java.util.concurrent.locks.Condition
Condition
Lock
wait()
notify()
Lock
Condition
Condition
notifyAll()
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); // 缓冲区不满的条件 final Condition notEmpty = lock.newCondition(); // 缓冲区不空的条件 final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) { notFull.await(); // 缓冲区满,等待notFull条件 } items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); // 通知notEmpty条件等待的线程(有新元素了) } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) { notEmpty.await(); // 缓冲区空,等待notEmpty条件 } Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); // 通知notFull条件等待的线程(有空位了) return x; } finally { lock.unlock(); } } }
java.util.concurrent
CountDownLatch
CyclicBarrier
Semaphore
BlockingQueue
Exchanger
这些工具类,简直是并发编程的“瑞士军刀”,很多复杂的同步通信场景,用它们能瞬间变得优雅和高效。比如
BlockingQueue
多线程同步的重要性,在我看来,就像是给高速公路上飞驰的汽车设置交通规则。如果没有这些规则,即使车速再快,也迟早会因为混乱而发生事故。在多线程编程中,这些“事故”通常表现为数据错误或程序崩溃。
它主要解决了以下几个核心问题:
i++
i++
synchronized
volatile
回想起来,我刚开始写多线程代码时,总是被这些“幽灵bug”折磨,数据莫名其妙地错了,后来才意识到,都是同步没做好。所以,同步不仅仅是让程序跑起来,更是让它“跑对”。
synchronized
Lock
ReentrantLock
在Java并发编程中,
synchronized
ReentrantLock
synchronized
ReentrantLock
synchronized
synchronized
synchronized
Object.wait()/notify()
synchronized
ReentrantLock
synchronized
ReentrantLock
lockInterruptibly()
tryLock()
new ReentrantLock(true)
Condition
ReentrantLock
synchronized
unlock()
finally
synchronized
ReentrantReadWriteLock
ReentrantLock
如何选择?
我的经验是,除非有明确的需求(比如需要可中断的锁、非阻塞的锁、或者多个条件变量),否则优先考虑
synchronized
只有当
synchronized
synchronized
ReentrantLock
ReentrantLock
Condition
synchronized
wait
notify
wait()
notify()
Condition
BlockingQueue
以上就是java如何实现多线程的同步与通信 java多线程同步通信的详细教程的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号