线程同步 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类中处理



目录
相关文章
|
4月前
|
Java 程序员
从菜鸟到大神:JAVA多线程通信的wait()、notify()、notifyAll()之旅
【6月更文挑战第21天】Java多线程核心在于wait(), notify(), notifyAll(),它们用于线程间通信与同步,确保数据一致性。wait()让线程释放锁并等待,notify()唤醒一个等待线程,notifyAll()唤醒所有线程。这些方法在解决生产者-消费者问题等场景中扮演关键角色,是程序员从新手到专家进阶的必经之路。通过学习和实践,每个程序员都能在多线程编程的挑战中成长。
47 6
|
1天前
|
调度
【多线程-从零开始-陆】wait、notify和notifyAll
【多线程-从零开始-陆】wait、notify和notifyAll
8 0
|
2月前
|
安全 Java 调度
【多线程面试题十】、说一说notify()、notifyAll()的区别
notify()唤醒单个等待对象锁的线程,而notifyAll()唤醒所有等待该对象锁的线程,使它们进入就绪队列竞争锁。
【多线程面试题九】、说一说sleep()和wait()的区别
sleep()和wait()的主要区别在于sleep()是Thread类的静态方法,可以在任何地方使用且不会释放锁;而wait()是Object类的方法,只能在同步方法或同步代码块中使用,并会释放锁直到相应线程通过notify()/notifyAll()重新获取锁。
|
2月前
|
存储 Java 调度
【多线程面试题 八】、说一说Java同步机制中的wait和notify
Java同步机制中的wait()、notify()、notifyAll()是Object类的方法,用于线程间的通信,其中wait()使当前线程释放锁并进入阻塞状态,notify()唤醒单个等待线程,notifyAll()唤醒所有等待线程。
|
3月前
|
存储 SQL 安全
Java共享问题 、synchronized 线程安全分析、Monitor、wait/notify以及锁分类
Java共享问题 、synchronized 线程安全分析、Monitor、wait/notify以及锁分类
38 0
|
3月前
|
Java
Java中的线程通信:wait、notify与Condition详解
Java中的线程通信:wait、notify与Condition详解
|
4月前
|
Oracle Java 关系型数据库
面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?
面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?
73 0
|
13天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口