当前位置: 代码迷 >> 综合 >> java死锁,避免死锁
  详细解决方案

java死锁,避免死锁

热度:85   发布时间:2023-09-23 12:04:41.0

这段代码只是演示死锁的场景,现实中可能不会遇到

但是在更为复杂的场景中可能会遇到,t1拿到锁后,因为一些异常情况没有释放锁,又或者释放锁的时候跑出了异常,没有释放掉

package myTestDeadlock;public class DeadLockDemo {/** * @Title: main * @Description: TODO(死锁) * @param @param args 设定文件 * @return void 返回类型 * @throws */private static String A = "A";private static String B = "B";public static void main(String[] args) {new DeadLockDemo().deadLock();}private void deadLock(){Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (A) {try{Thread.currentThread().sleep(2000);}catch(Exception e){e.printStackTrace();}synchronized (B) {System.out.println("1"); }}}}); Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (B) {synchronized (A) {System.out.println("2");}}}});t1.start();t2.start();}} 

运行该线程将不会打印任何数据,一旦出现死锁,业务是可感知的,因为不能再继续提供服务。此时需要查看到底哪个线程出现了问题

避免死锁的常见办法

1、避免一个线程同时获取多个锁

2、避免一个线程在锁内同时占用多个资源,尽量保证一个锁只占用一个资源

3、尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制

4、对于数据库锁,加锁和解锁必须在一个数据库链接里,否则会出现解锁失败的情况