那么这种情况如何解决呢?
那就是该线程发现条件还没有成熟(也就是发现ATM机没钱的时候),就应该释放锁,并且等待,知道其他线程通知说条件已经成熟了,然后把该线程唤醒(也就是运钞扯来了,并且把钱放进ATM机了,或者是后面的人进去存钱,存好了之后跟他说我刚刚存钱了,你可以进去取钱了)
关键在于需要根据实际情况来手动控制线程之间的先后顺序。(虽然线程的执行顺序是由调度器实现的,但是有时候要控制先后顺序的hi后就需要手动实现)——这就引出了等待集
等待集的核心操作主要有两个
1.等待(wait方法)
2.通知(notify方法)
如
notify用法
import java.util.Scanner;
public class ThreadDemo12 {
private static Object object = new Object();
public static class MyThread extends Thread{
@Override
public void run() {
synchronized (object){
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 10; i < 20; i++) {
System.out.println(i);
}
}
}
public static void main(String[] args){
Thread thread = new MyThread();
thread.start();
Scanner scanner = new Scanner(System.in);
System.out.println("我不输入,Thread线程就不会运行");
scanner.nextInt();
synchronized (object){
object.notify();
}
}
}
注意
调用wait的前提是发现当前操作的条件不满足,要想知道条件满不满足,就需要先能够访问到资源(先获取到锁)
wait必须在同步代码块中才能使用,否则就会出现异常
wait方式做了三件事:
1.先释放锁(前提是已经获取到锁)
2.等待通知(等待其他线程调用notify方法,把它唤醒)
3.收到通知后会重新尝试获取锁
从内核角度分析
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
重要的事说三遍,关注+关注+关注!
更多笔记分享
**
重要的事说三遍,关注+关注+关注!
[外链图片转存中…(img-v6obPloi-1631087754381)]
[外链图片转存中…(img-oeK7Ys9H-1631087754382)]
更多笔记分享