目录
死锁
如何解决死锁问题?
线程生命周期
Thread.sleep()方法
Thread.yield()方法
thread.join()方法
死锁
在线程同步过程中,因为多线程争抢锁资源,所以有些线程会执行,有些线程会等待。
如果线程A和线程B分别需要 X和Y两个锁资源
恰好A获得了X资源,准备争抢Y , 而B获得了Y资源,准备争抢X
此时A和B就进入了一中死锁状态。
此时程序就会卡住
如何解决死锁问题?
-
从业务逻辑层面解决
-
从技术层面解决
-
可以使用lock锁 的 tryLock()方法
-
线程生命周期
在上图中可以看到,有一个中断线程的过程,中断线程的方式有很多
Thread.sleep()方法
-
Thread类的一个静态方法
-
让当前正在执行的线程处于睡眠状态
-
指定睡眠时间,时间过后,自动唤醒,唤醒后,线程进入就绪状态,准备争抢CPU
-
睡眠期间,一旦被其他线程调用了当前线程的interrupt方法中断,会抛出异常
-
如果线程抢占了一个对象锁,睡眠期间不会释放对象锁。
Thread.yield()方法
-
让步,当前线程让出CPU,与其他线程重新争抢CPU
-
当前让出cpu的线程也会参入争抢
thread.join()方法
-
插队,当前线程调用指定线程对象的join方法,将指定线程加入当前线程的执行序列
-
当指定线程执行完毕后,当前线程才会继续执行。(此时直接处于运行状态)
通过底层原码可知,join方法会不挺的检测线程的存活状态
当目标线程执行完毕后,自动销毁,不再存货
当前线程一旦发现目标线程销毁,则继续执行自己的操作。在判断时一定已经获得cpu了
-
最常用的就是通过join方法,实现确保所有的其他线程都执行完毕,当前线程再继续执行。