Java高并发编程详解-多线程架构与设计:线程间的通信
同步、异步、阻塞、非阻塞概念同步和异步结果的通知机制 。 自己问还是别人通知 。 同步:主动等待结果的返回 。 如阻塞等待 , 轮询(同步非阻塞) 。 异步:被动等待结果的返回 。 如 消息回调 。
阻塞和非阻塞结果返回以前 , 调用方的状态 。 等还是不等 。 阻塞:结果返回以前 , 什么也不干 。
非阻塞:在结果返回以前 , 可以先做一些其他事情 。
Monitor锁下面所说的获取monitor锁都是指的先使用synchronized获取对象锁不应该叫synchronized(mutex)为锁 , 而应该是某个线程获取了与mutex关联的monitor锁 。
wait 与 notify【Java高并发编程详解-多线程架构与设计:线程间的通信】wait 理解成线程在等待直到该对象可用 。 (被notify后就不再等待)
notify理解成线程通知该对象可用 。
使用wait的注意事项
- wait必须在同步方法中使用 , 因为wait必须由拥有monitor(已用synchronize获取锁)的线程调用 。
- wait可以被中断 , 为了防止wait被interrupt唤醒 , wait方法需要在循环中使用 。
- 使用wait后自动释放线程对应的锁 。 –release ownership of this monitor
- wait会等待直到其他线程调用notify/notifyAll唤醒 。 –waits until anthoer thread notifies threads waiting on this object’s monitor to wake up…
- 被notify/notifyAll唤醒后会重新获得锁的拥有权,然后接着执行 。 –re-obtain ownership of the monitor and resumes execution.
- 线程调用wait后 ,会加入与之对应的wait set.每个对象都有一个与之对应的wait set.使用notify会将其中一个弹出 , notifyAll弹出所有线程 。 (C5.3.2)Causes the current thread to wait until another thread invokes the* {@link java.lang.Object#notify()} method or the* {@link java.lang.Object#notifyAll()} method for this object.* In other words, this method behaves exactly as if it simply* performs the call {@code wait(0)}.** The current thread must own this object’s monitor. The thread* releases ownership of this monitor and waits until another thread* notifies threads waiting on this object’s monitor to wake up* either through a call to the {@code notify} method or the* {@code notifyAll} method. The thread then waits until it can* re-obtain ownership of the monitor and resumes execution.* As in the one argument version, interrupts and spurious wakeups are* possible, and this method should always be used in a loop:* synchronized (obj) {* while (
)* obj.wait();* … // Perform action appropriate to condition* }* This method should only be called by a thread that is the owner* of this object’s monitor. See the {@code notify} method for a* description of the ways in which a thread can become the owner of a monitor.
- 必须在同步方法中使用wait、notify , 因为他们的使用前提都是持有monitor所有权 。
- 同步代码块的monitor必须与执行 wait 、notify的对象一致 , 也就是说对哪个对象同步 , 才能调用哪个对象的 wait、notify 。
文章插图
在while而不是if中调用wait!否则一旦被interrupt , 会跳过判断继续执行 。 如
文章插图
推荐阅读
- 计算机专业大一下学期,该选择学习Java还是Python
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 学习大数据是否需要学习JavaEE
- 从事Java开发时发现基础差,是否应该选择辞职自学一段时间
- 2021年Java和Python的应用趋势会有什么变化?
- 普通大学计算机专业的本科生,该选择主攻前端还是Java
- Java语言会不会随着容器的兴起而衰落
- 大一有考研计算机专业的打算,该学习C++还是Java
- 计算机专业的同学在掌握了Java之后,还可以学习哪门后端语言
- 不实习,如何增加Java项目经验