7、线程-小结 2022-02-15 19:32 多线程概念中需要注意的点: 1、wait()、await()、sleep(),都有可能被中断唤醒。 2、由于wait()和await()需要锁,所以被唤醒时,并不一定能够立即执行,还需要公平的和其他线程抢占锁,抢到了才能执行。 关于编程时要注意的点: 1、wait()需要锁,且需要的是对应的锁。意思是执行哪个对象的wait(),synchronized就必须持有这个锁对象。 2、尽量使用notifyAll()而不是notify(),除非你深刻理解了当前场景可以使用notify() 3、wait()要写在while而不是if里,除非你深刻理解了当前场景可以使用if。 写一个简单的死锁: thread1和thread2互相等待对方的锁,但是各自又拿着对方等待的锁,形成环路,无限卡死。 ```java package com.example.demo.core.Test; /** * @author: HanXu * on 2022/2/10 * Class description: 死锁案例 */ public class DeadSyncDemo { public static void main(String[] args) { Object monitor1 = new Object(); Object monitor2 = new Object(); Thread thread1 = new Thread(() -> { synchronized (monitor1) { //to do something sleep(50); System.out.println("thread1已经拿到锁1"); synchronized (monitor2) { System.out.println("thread1已经拿到锁2"); } } }); Thread thread2 = new Thread(() -> { synchronized (monitor2) { //to do something sleep(50); System.out.println("thread2已经拿到锁2"); synchronized (monitor1) { System.out.println("thread2已经拿到锁1"); } } }); thread1.start(); thread2.start(); } public static void sleep(int time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 执行结果:输出下面内容后,程序一直卡着 ``` thread1已经拿到锁1 thread2已经拿到锁2 ``` 查看死锁:`jps`查看进程Pid,然后`jstack pid`,查看程序执行信息,可以看到`Found one Java-level deadlock`。 ![](http://minio.riun.xyz/riun1/2022-02-10_24GagdKPR584iqEQhk.jpg) ![](http://minio.riun.xyz/riun1/2022-02-10_24GaZhOtUsspBkIbwA.jpg) --END--
发表评论