线程(二)
守护线程是用来守护非守护线程的
非守护线程: 非守护线程就是平常写的线程
每个程序都要有至少一个非守护线程
非守护线程一旦结束守护线程无论完成没有完成都要结束
强制结束
守护线程依附非守护线程,如果非守护线程消亡,那么守护线程随之消亡。
main 主函数是非守护线程
真实开发的时候:
后台记录操作日志,监控内存,垃圾回收等 都可以使用守护线程
thread.setDaemon(true);
package com.day_w.a_Daemon;
class MyThread implements Runnable {
2.死锁
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁线程。
你的钥匙丢完了。进不了门?咋办?找开锁公司。
开锁公司说你得给我提供你的身份证原件。我才能给你开锁。
你说你得先开门,我的身份证原件在屋里锁着呢。
结果你们两个僵持不下,导致开门这个事推进不了
开发中禁止使用死锁。
面试会问:
应用场景:并发场景,多线程。线程之间互不相让。得借助锁。
加锁的目的是为了线程安全,但是物极必反。尤其是加了锁以后。
死锁是一种状态,当两个线程互相持有对方的资源的时候,却又不主动释放这个资源的时候。会导致死锁。这两个线程就会僵持住。代码就无法继续执行。
线程1 有锁1
线程2 锁2
线程1会等待锁2 的释放
线程2会等待锁1的释放
面试题:
手写一个死锁!!!
package com.qfedu.b_deadThread;
class DeadLock implements Runnable {
private boolean flag;//标记属性
private Object obj1;//锁住的对象
private Object obj2;//锁住的对象
public DeadLock(boolean flag, Object obj1, Object obj2) {
this.flag = flag;
this.obj1 = obj1;
this.obj2 = obj2;
}