中断锁在实际业务开发中有着重要意义
可中断锁使得我们可以在多线程环境中更好地处理中断问题,从而提高程序的健壮性和响应性;减少线程阻塞的可能;
在持有锁的过程中,如果线程被中断,它不能响应中断,直到释放锁。这可能导致一些问题,比如如果一个线程因为某些原因被长时间阻塞,其他线程也可能会被阻塞,这可能会导致整个程序的性能下降,甚至可能导致死锁。
可中断锁解决了这个问题。在持有可中断锁的时候,如果线程接收到中断信号,它会立即释放锁,并抛出InterruptedException异常。这样,其他等待该锁的线程就有机会获取该锁,并继续执行
两个线程,A 获取锁但是没有释放,B获取同一把锁,由于A没有释放,B只能一直等待;
public class InterruptedLock {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Thread thread1 = new Thread(() -> {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + "线程1获取到锁");
} catch (Exception e) {
throw new RuntimeException(e);
}
});
thread1.start();
Thread thread2 = new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "线程2等待获取锁");
Thread.sleep(500);
lock.lock();
} catch (Exception e) {
System.out.println("线程2 被中断");
}
});
thread2.start();
}
}

可以看到程序一直不结束,由于线程1未释放锁,线程2一直等待获取锁
public class InterruptedLock {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Thread thread1 = new Thread(() -> {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + "线程1获取到锁");
} catch (Exception e) {
throw new RuntimeException(e);
}
});
thread1.start();
Thread thread2 = new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "线程2等待获取锁");
Thread.sleep(500);
lock.lock();
} catch (Exception e) {
System.out.println("线程2 被中断");
}
});
thread2.start();
try {
Thread.sleep(2000);
if (thread2.isAlive()) {
System.out.println("线程2执行中断");
thread2.interrupt();
}else {
System.out.println("线程2执行完成");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
可中断获取锁后,当一定时间后,可以判断当前线程是否执行完成,如果未完成可以执行中断,提前退出,防止一直阻塞
在Java中,使用synchronized关键字或ReentrantLock可以实现互斥锁,但在持有锁的过程中,如果线程被中断,它不能响应中断,直到释放锁。这可能导致一些问题,比如如果一个线程因为某些原因被长时间阻塞,其他线程也可能会被阻塞,这可能会导致整个程序的性能下降,甚至可能导致死锁。
可中断锁解决了这个问题。在持有可中断锁的时候,如果线程接收到中断信号,它会立即释放锁,并抛出InterruptedException异常。这样,其他等待该锁的线程就有机会获取该锁,并继续执行。