1、死锁的出现有四个必要条件:资源互斥使用,也就是说每个资源一次只能有一个线程使用;占有并请求,所有的线程都持有它们目前请求到的资源并且申请还未得到的资源;不可剥夺,也就是说所有线程请求到的资源都无法被其他线程抢占;循环等待,也就是线程之间互相等待对方释放己方需要的资源

3、执行Windows + R打开运行对话框输入cmd,再命令行中执行jps查看当前系统中的Java进程,找到Deadlock对应的进程ID,执行jstack 进程ID,查看当前的执行线程堆栈,可以看到连个线程都被卡死在所对象上

5、如果资源昂贵,增加资源并不现实,此时可以规定资源的申请顺序,比如所有线程申请资源时必须按照R1->R2顺序申请,只有请求到R1资源才可以申请R2资源,当有一个线程申请到R1,其他线程都不能申请R2,此时第一个线程就能够执行完成,等它执行完成后释放资源,其他线程依然按照R1->R2的顺序申请资源,也就不会有死锁问题了


8、Java中的synchronized锁无法被释放,可以捂执涡扔使用ReentrantLock可重入锁来实现锁机制,这里去掉了那些try..finally代码,两个线程在执行时如果在tryLock新的所对象失败,就释放自己原有的锁对象,并且等待一段时间,接着再重新执行锁请求,执行完成后线程退出循环,运行Demo能够正常执行完成
