必须在 synchronized 块中调用 wait/notify,否则抛 IllegalMonitorStateException;推荐优先使用 BlockingQueue 或 Condition 替代手写 wait/notify。
wait/notify 必须在 synchronized 块中调用
直接调用
或
会抛出
,因为这两个方法依赖当前线程持有对象的监视器锁。JVM 要求调用前必须已通过
获取该对象锁。
错误写法:
(未加锁)→ 立即崩溃
正确写法:
会释放锁并挂起线程;
不释放锁,只唤醒一个等待线程
用
更安全,避免因条件判断不一致导致的“假死”(如多个生产者/消费者共用同一锁)
用 Condition 替代 wait/notify 实现更清晰的等待队列
是
包提供的替代方案,配合
使用,能为不同等待逻辑创建独立的等待队列,避免
唤醒错类型线程的问题。
一个
可关联多个
:比如
和
类似
,但需在
/
块内
唤醒指定队列:
不会影响
上等待的线程
注意:不能混用
+
,否则抛
volatile 不足以实现线程间通信,仅适合简单状态通知
能保证变量读写的可见性与有序性,但无法保证原子性。它适用于「一个线程改、多个线程读」的轻量级信号场景(如开关标志),但不能替代
同步机制
来协调共享资源访问。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
适用:
,配合循环检查
不适用:计数器
—— 该操作包含读-改-写三步,
无法阻止竞态
若需原子更新,改用
或加锁;若需等待条件成立,仍得靠
或
BlockingQueue 是最实用的线程间通信抽象
对于典型的生产者-消费者模型,直接使用
(如
、
)比手写
更可靠、简洁,且内置了线程安全和阻塞语义。
立即学习
“
Java免费学习笔记(深入)
”;
在队列满时自动阻塞,
在空时自动阻塞
所有操作线程安全,无需额外同步;容量可选(有界 vs 无界),影响背压行为
避免手动管理锁、条件变量、中断响应等细节,减少出错概率
注意:
和
支持超时,适合需要响应中断或避免永久阻塞的场景
实际协作逻辑越复杂,越容易在唤醒时机、锁粒度、中断处理上出问题。别为了“理解原理”在线程通信上反复造轮子——先用
或
、
这类高级工具,真卡在性能或语义限制上,再深入
或
。
wait()notify()IllegalMonitorStateExceptionsynchronizedobj.wait();synchronized(obj) { obj.wait(); }wait()notify()notifyAll()Conditionjava.util.concurrent.locksReentrantLocknotify()ReentrantLockConditionnotFullnotEmptycondition.await()wait()lock.lock()lock.unlock()notFull.signal()notEmptysynchronizedConditionIllegalMonitorStateExceptionvolatileprivate volatile boolean shutdownRequested = false;counter++volatileAtomicIntegerwait/notifyConditionBlockingQueueArrayBlockingQueueLinkedBlockingQueuewait/notifyqueue.put(item)queue.take()offer(item, timeout, unit)poll(timeout, unit)BlockingQueuePhaserExchangerConditionLockSupport