线程同步 wait()、notify()

简介: 线程安全 很重要的概念。 多线程访问同一段代码,不会产生不确定的结果。则可以说这段代码是线程安全的。 常用方法 调用sleep()的时候,锁并没有被释放,调用yield()也属于这种情况;而wait()方法会将锁释放。 只能在同步控制方法或同步控制块里面调用 wait()、notify()、notifyAll()。如果在非同步控制块中调用这些方法,能通过编译但运行会出错,得到Il

线程安全

很重要的概念。
多线程访问同一段代码,不会产生不确定的结果。则可以说这段代码是线程安全的。

常用方法

调用 sleep()的时候,锁并没有被释放,调用yield()也属于这种情况;而wait()方法会将锁释放。
只能在同步控制方法或同步控制块里面调用 wait()、notify()、notifyAll()。如果在非同步控制块中调用这些方法,能通过编译但运行会出错,得到IllegalMonitorStateException异常。
当调用某个ExecutorService的shutdownNow()时,它会调用 所有 由它控制的 线程的interrupt()。

Thread. yield()告诉java线程调度器“重要的部分我已经完成,此刻可以将我挂起,切换给其他线程执行”。这个函数可用可不用,但用了它更容易按照自己的掌控去切换线程,从而验证一些东西。

调用 wait()时,执行两个动作:挂起线程,释放锁。
别的地方调用notifyAll(),将唤醒wait()所挂起的线程。在线程继续运行之前将重新获得上次wait()调用时释放的锁。

使用 notify()时,在众多等待同一个锁的任务中只有一个会被唤醒。
notifyAll()唤醒所有等待同一个锁的任务。注意,这并不意味着在程序的任何地方,任何被wait()挂起的线程都会被唤醒,。当notifyAll()因为某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒。

微笑打蜡、抛光在多个线程中交替进行。
需要一个状态切换的标志位,两对wait()、notify()操作。
一:Thinking in  Java 的例子
调试时可以看到有三个线程,很直观。

二:自己改造,wait() notify()全放在Car类中处理



目录
相关文章
|
5月前
|
监控 安全
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
32 0
|
1月前
|
Java
在多线程中sleep()和wait()的区别(详细)
在多线程中sleep()和wait()的区别(详细)
|
2月前
|
Java 调度
多线程(初阶五:wait和notify)
多线程(初阶五:wait和notify)
34 0
|
3月前
|
设计模式 安全 编译器
线程学习(3)-volatile关键字,wait/notify的使用
线程学习(3)-volatile关键字,wait/notify的使用
26 0
|
4月前
|
调度
多线程之wait&notify
多线程之wait&notify
|
4月前
|
存储 安全 Java
wait和notify实现线程之间的通信
wait和notify实现线程之间的通信
39 0
wait和notify实现线程之间的通信
|
8月前
|
Java 调度
【Java|多线程与高并发】wait和notify方法详解
在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要wait和notify这两个方法
|
10月前
多线程之——wait/notify
多线程之——wait/notify
43 0
|
11月前
|
数据可视化
高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
36 0
|
11月前
|
Java 调度
高并发编程-线程通信_使用wait和notify进行线程间的通信
高并发编程-线程通信_使用wait和notify进行线程间的通信
61 0

热门文章

最新文章