死锁是指两个或者两个以上的线程,因争夺资源而造成的相互等待的情况,如无外力作用将持续下去。形成死锁有四个必要条件:①互斥条件;②请求并持有条件;③不可剥夺条件;④环路等待条件。死锁简单地描述就是:A有一根筷子,B有一根筷子,但只有一双筷子才能夹他们想吃的食物,这时A想要B的那根筷子,B想要A的那根筷子,他们互相僵持着,这就是死锁现象。
避免死锁只需要破坏四个必要条件中的一个即可,其中请求并持有条件、环路等待条件是可以被破坏的,最简单的就是可以将资源的申请变得有序来避免,还是筷子这个例子,现在让A和B同时竞争第一根筷子,并且只有竞争到第一根筷子的人才可以获取第二根筷子,这就不会造成死锁。
Java中检测死锁可以先使用 jps 查看当前运行程序的进程信息,查看到进程号之后可以使用 jstack+进程号 来获取进程中各个线程的信息,依据线程信息查看死锁情况。
活锁指的是两个线程同时运行,但都互相破坏对方的结束条件,导致两个线程无法结束,一直运行下去,例如 count初始值为15,线程A检测退出的条件是count>10,线程B检测退出的条件是count<20,线程A中对count-1,线程B中对count+1,那么如果两个线程都在运行,就可能会造成停止不了的情况。