新手 Java 多线程 wait()

.wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。
那 .wait前面的对象要填什么 。有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait

图片说明

        .wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。

那 .wait前面的对象要填什么 。有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait

0

3个回答

self锁的执行部分已经结束了,锁已经释放。这个wait让当前线程阻塞并释放prev的锁。
假设此时的self为a,prev为c,那执行wait后a的锁已经释放,这段代码的逻辑是在多线程状态下按顺序循环输出各个线程的name,所以需要等上一个线程释放锁当前线程才能运行,也就是prev.wait()
附一个你可能看过的链接
https://www.cnblogs.com/csuwater/p/5411693.html

0
weixin_41423378
银翼的魔术师s 嗨 ,再问一下 如果A线程调用了 obj.wait() ,是不是要 B(其他)线程调用 obj.notify() 才能醒来
11 个月之前 回复
weixin_41423378
银翼的魔术师s 看别人强调 wait可以释放锁,以为只有wait才能释放锁
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 对,下次提问记得详细描述自己不懂得地方,因为这个问题一般都会直接略过
11 个月之前 回复
weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 希望你可以提供一下你认为的应该执行两个wait或self.wait()的原因
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 释放自己是为了让下一个等待资源的线程得以运行,我觉得你所想的释放自己的锁应该指的是释放控制台这个公共资源,因为每一个对象并不是公共资源其实没有加锁的必要,这里用每一个对象加锁是为了保证顺序执行。其实这种逻辑可以设置一个变量order指定应输出的线程,然后各线程竞争order的锁然后执行order=(order+1)%3来结束,但是这种方法效率不高,因为可能唤醒现在不应该输出的线程
11 个月之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 因为它要按顺序输出,也就是下次输出时要确定prev已经释放锁。例如pb类执行完了后要等待a的锁( a.wait ),这样下次pa执行完了,a.notify语句可以唤醒pb在a.wait位置的阻塞,保证按顺序输出
11 个月之前 回复
weixin_41423378
银翼的魔术师s 大佬这么说更蒙蔽了呀 为什么 self执行完自己就释放了 ,perv执行完自己没释放要 wait
11 个月之前 回复

和对象没啥关系 是指你所调用wait的线程进行阻塞

0
weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
11 个月之前 回复

这个代码的逻辑应该是self被prev唤醒(要按顺序输出),而不是被自己唤醒(这样还是乱序输出,而且由于self.notify()执行的时候self.wait()还没有将self放入等待队列,该线程可能会丢失这个notify,运行一次输出就永久阻塞了)

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java 多线程 之 wait等待 线程实例
http://www.verejava.com/?id=16992949250274package com.wait.notify; /* 题目: 人们在火车站的售票窗口排队买火车票 1. 北京西站开门 2. 打开售票窗口 3. 北京西站有10张去长沙的票 4. 打开2个售票窗口, 5 假设每个售票窗口每隔1秒钟买完一张票 1. 根据 名词 找类 人们(Person), 火...
新手 Java 多线程 wait()
.wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。rn那 .wait前面的对象要填什么 。有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的waitrn rn rn![图片说明](https://img-ask.csdn.net/upload/201809/20/1537426309_499477.jpg)rn rn rn rn .wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。rn那 .wait前面的对象要填什么 。有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait
[Java 多线程技术](七)使用wait/notify实现线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体。线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更加强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控和监督。 1. 等待通知机制 1.1 不使用等待/通知机制实现线程间通信   创建新项目,在实验中使用sleep()结合whi...
关于Java多线程中的wait()、sleep()、notify()和notifyAll()的简单介绍和使用
Java多线程的开启使用Thread开启多线程Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println("线程开启"); } }); t.start
深入理解Java多线程中的wait(),notify()和sleep()
大家在学习Java的过程中,势必要进行多线程的系统学习,这部分内容知识对于你在工作中的影响是极大的,并且在面试的过程中,这部分知识也是必然会被问到的。既然多线程的知识如此重要,那么我们就不能浅尝辄止。在这篇文章中,我想通过阅读源码的方式给大家分享一下我自己对于Java中wait(),notify()和sleep()的理解,并且在后面我也做一些内容上的扩展,与大家共同思考。如果在文章中有描述不妥或者
Java多线程wait()方法注意事项
注意事项一: 当前线程调用共享对象的wait()方法时,当前线程只会释放当前共享对象的锁,当前线程持有的其他共享对象的监视器锁并不会被释放。 下面举个栗子: private static volatile Object resourceA = new Object(); private static volatile Object resourceB = new Object()...
Java多线程之 wait 和 join 的区别
本文不是介绍wait和join方法是什么或怎么用,而只是介绍两者的区别,具体两个函数的用法请参考相关文档。 为了说明问题,编写了以下几行代码。 package aust.hao.thread; import java.text.SimpleDateFormat; import java.util.Date; public class Demo extends Thread { publi...
Java多线程之sleep() 和 wait(n) 、 wait() 有什么区别?
sleep() 和 wait(n) 、 wait() 的区别 答: sleep 方法:是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会接触阻塞,进入可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话) wait 方法:是 Object 的方法,必须与 synchronized 关键字一起使用,线程进入阻塞状态,当 notify 或者 noti...
JAVA多线程wait与notify详细解析(由生产者和消费者案例引出)
生产者和消费者这个关系是个经典的多线程案例。现在我们编写一个Demo来模拟生产者和消费者之间的关系。 假如有两个类,一个是数据生产者类DataProvider,另一个是数据消费者类DataConsumer,这两个类同时对数据类Data进行操作,生产者类负责生产数据,消费者类负责消费数据,下面是对这个过程的描述。 class DataProvider implements Runnable{ ...
java多线程中锁(lock)、wait、notify()的使用
package com.kai.多线程间的通信; import java.util.ArrayList; import java.util.List; [color=red]/** * 重点说明: * 1.实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用 * 2.lock.wait(); 等待,并且释放锁 * 3.lo...
java多线程:结合多线程交替打印10次abc实例,对wait/notify使用的彻底理解
接上篇:http://blog.csdn.net/wabiaozia/article/details/79429585 有个朋友看点击打开链接 里的三个线程“A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。” 这个问题的代码,有点不太理解,让我给看下。不理解的原因也很简单,就是对wait和notify理解不深,遇到复杂点的场景会迷糊。对于并发相...
Java多线程之sleep,wait,join和yield关键字,以及线程的关闭
在java或者android中,使用Thread和Runnable就可以玩多线程了,这个成本比较低,也没什么好说的,今天主要是针对多线程中主要的关键字wait,sleep,join和yield做个笔记,加强一下印象。wait  wait方法一般都是和notity()或者notifyAll()成对出现的。当某个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的锁功能,
Java多线程中wait语句的具体使用技巧
Java多线程在使用的时候会有很多语句需要我们具体的学习,在这其中wait()就是其中的一个。当然我们需要不断的努力学习才能掌握这一个语句的应用,下面的代码会对你学习Java 多线程有所帮助。   1.class ThreadA   2.{   3.public static void main(String[] args)   4.{   5.ThreadB b=n...
java多线程 wait和notify方法
public class ProductTest { public static void main(String[] args) { Clerk clerk = new Clerk(); Producter producter = new Producter(clerk); Consumer consumer = new Consume...
java线程之间的通信(wait/notify)
    在多线程开发过程中,每一个线程拥有自己的栈空间,就如同运行脚本程序一样,一行一行的运行直到最后结束。但是在线程运行过程中只是孤立的运行显得太单调,如果多线程之间可以相互协调工作才显得跟丰富。    线程之间怎么通信呢?本文主要讲述通过Object类提供的wait和notify两个函数,并结合synchronized关键字来实现线程之间的通信,文章最后通过一道面试题来进行总结。    在Ob...
多线程中 wait和sleep的区别
多线程中 wait和sleep的区别
JAVA-多线程同步的两大方式+对象锁和全局锁+wait()&notify()
1、synchronize:同步代码块,同步方法    同步代码块:必须设置锁定的对象,一般使用this    如synchronized(this){...} //表示为该程序的逻辑上锁。    同步方法:public synchronized void sale(){...}    由于必须同步进行,所以执行速度回很慢    P.S:synchronized (this)和非static 的s...
多线程wait 和 notify的判断条件(if 和 while)和假死
多线程通信;notify和wait
java多线程总结一(wait和notify的线程调度)
线程和对象锁,休眠和唤醒
多线程之线程通信wait和notify的使用
线程通信
多线程同步中sleep与wait区别
1、函数 wait是Object的一个函数,指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(这两个也是Object的函数)。 sleep则是Thread的一个函数,指线程被调用时,占着CPU不工作.此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。 所以 sleep(100L)意思
Java 同步锁 wait notify 学习心得
java多线程下wait和notify的作用
java多线程之等待(wait)和通知(notify)
多线程等待(wait)和通知(notify) wait()用于释放锁,所以在释放之前要必须要持有对象锁,所以必须在 synchronized(obj){}内部使用wait() notify()用于唤醒等待线程,并且不会立刻释放锁资源,因为要释放锁资源,所以必须 在synchronized(obj){}内部使用notify(),在加锁代码块执行完毕后才会去释放锁住资源,并运行wait...
Java多线程——使用wait/notify实现生产者/消费者模式
场景描述: 生产者/消费者模式是进程与线程学习中相当经典的问题,在本文中场景设置如下: 有一个仓库(Repository),有若干个生产者(Producer)和若干个消费者(Consumer),生产者可以生产产品(Procuct)并存入(push)仓库,消费者可以从仓库取出(pop)并消费产品。 我希望通过使用synchronize锁机制与wait()/notifyAll()或notify(
java多线程-使用notify和wait完成多线程的顺序执行
总结一个关于多线程顺序执行的万能方法。 之前也参考了http://blog.csdn.net/zyplus的博客,觉得写得挺好,但是运行时或多或少又存在着一些小小的问题,算作为对于之前作者文章的一个补充吧! public class QueueThread implements Runnable{ private Object current; private Object next;
Java并发编程实战————wait、notify、CountDownLatch
引言 前面的学习中已经解除了关于加锁,共享变量可见性,原子性,synchronized,volatile等知识。在多线程中,还有很多需要掌握的小知识点。 避免字符串常量作为锁对象 在下面的例子中,m1和m2其实锁定的是同一个对象这种情况下还会发生比较诡异的现象,比如你用到一个类库,在该类库中代码锁定了字符串"Hello",但是你读不到源码,所以你在自己的代码中也锁定了"Hello",这时候就...
Java 内部类,多线程中Synchronized与wait,notify的使用
工作内容: 1.成员内部类    与成员方法,属性的访问权限一致 2.静态内部类    修饰符 stactic 类名{...} 3.匿名内部类    new 类名()/接口名(重写接口方法) 4.局部内部类    代码块中 5.线程Thread wait,notify 学习分享: 谁去调用notify(),就解开谁,如果有多线程正在等待这个Object,则随机执行一个线程
Java多线程为什么使用while循环来调用wait方法
Java多线程为什么使用while循环来调用wait方法 当条件不满足时,当前线程调用wait等待条件成立。 wait方法是当前线程进入等待状态,等待被唤醒。 当其他获取到该对象锁的线程释放锁时,上面的线程有可能被意外唤醒(就是重新获取锁),但是此时上面线程是不满足条件的,导致它破坏了被锁保护的约束关系,引起意外后果。
JAVA多线程-线程间通信(一)-等待/通知机制(wait/notify)
线程间通信     线程与线程之间不是独立的个体,它们彼此之间可以相互通信与协作。     线程间通信后,系统之间的交互性会更强大,在大大提交CPU利用率的同时,还会使程序要对各线程任务在处理的过程中进行有效的把控和监督。     学习目录:     一、使用wait/notify实现线程间的通信     二、生产者/消费者模式的实现     三、方法join的使用     四、
java使用轮询和wait()/notify()实现多线程之间的通信
使用轮询方式实现通信: public class MyList { private static int i = 0; public int getI() { return i; } public void setI(int i) { MyList.i = i; } private volatile List
java多线程sleep、wait、yield方法区别总结
sleep() 方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。 sleep方法有两个重载版本: sleep(long millis)     //参数为毫秒 sleep(long millis,int nanoseconds)    //第一参数为毫秒,第二个参数为纳秒 sl...
Java 多线程(五)——线程通信(共享内存、管道流、wait()、notify()等)
线程间通信方式 1 共享内存 2 管道流 Java中实现线程通信的方法 1 waitnotifynotifyAll 2 使用Condeition控制 3 使用阻塞队列BlockingQueue
java多线程wait()报中断异常问题
java多线程wait()报中断异常问题: java.lang.InterruptedException: at java.lang.Object.wait(Native Method) 解决方法: 将wait()用try{}catch(InterruptedException e){}
java多线程notify()无法唤醒wait()问题
创建两个Runnable,其中一个的run()方法启动并调用wait(),第二个Runnable中run()方法在一定的几秒之后,为第一个任务调用notify(),从而使得第一个Runnable能显示一条信息,用Executor来测试。public class RunnableWait implements Runnable{ public static Object obj=new Obje
多线程等待唤醒机制:从wait()和sleep()的差别说起
1. wait():释放资源,释放锁 sleep():释放资源,不释放锁 wait():Object的方法,用在同步当中,是同步锁的方法,以锁控制线程 sleep():线程类Thread本身的静态方法 例子: class Person { String name; String gender; boolean flag=false;//标记,默认不输出 } cla
多线程(二):详细描述wait、notify/notifyAll、join及底层实现
join:1、join的作用:这句代码执行后会阻塞代码所在的线程。意思是谁执行这句代码,谁被阻塞。2、举一个例子讲述join阻塞和结束阻塞过程:
Java多线程wait,notify实例
[code="java"]package com.lj.thread2; public class Sample { private int number; // 实现number加1 public synchronized void increase() { while (0 != number) { try { wait()...
Java中wait与notify的正确使用
今天编程时遇到一个wait方法调用时抛出IIIegalMonitorStateException异常,所以再把wait和notify的用法整理一遍。        首先,多线程同步问题既有多线程对资源的竞争问题,也有多线程之间的协同问题。在这里我们仅讨论多线程的协同问题。 1、wait()与notifyAll()        wait()在Java doc中的描述为: Causes th
一个简单的例子理解线程的join、wait及 notify方法
例子:现假设有一块钟表对象,钟表有两个线程,一个是查询当前时间,另一个是将时间显示出来。需要显示出正确的时间。 分析:这个题目看起来只是需要简单的实例化一个钟表,然后定义两个线程,并且执行就可以了。于是使用下面的代码: import java.text.SimpleDateFormat; public class Clock { private String currentTime;...
java synchronized wait notify的使用场景及解决的问题
首先请考虑这样的场景:   你用饿了么点了份外卖,然后你是希望外卖到了的时候外卖小哥主动打电话给你,还是你不停的打电话问外卖小哥有没有送到呢? 分析一下这两种情况: 一:外卖小哥主动打电话通知你外卖到了 你的体验:自己下了订单后就啥都不管了,只要电话一响就下楼拿外卖就好; 外卖小哥的体验:接到送外卖的订单后就商家拿外卖,然后到客户的楼下打个电话,仅此而已; 总结:两方的体验都很好 二...