Java线程避免死锁,使用Timeout避免Java多线程中的死锁

One of the strategy to avoid deadlock situation in Java Multithreading is using timeout.

Suppose, one thread has acquired lock on one resource and now waiting for lock on another resource. After certain time period if it can not acquire lock on resource2 then it should stop waiting for lock on resource2. Also it should release lock on resource1. Thus deadlocks will be avoided.

But how to implement it in Java ? How to explicitly "release" lock ? How to define timeout to wait for lock.

What is exact java commands and syntax. Any hello-worldish example please ?

解决方案

Here is a contrived example with 2 locks and 2 threads that try to acquire them in different orders. Without the timeout, the code would deadlock.

public static void main(String[] args) throws Exception {

final ReentrantLock lock1 = new ReentrantLock();

final ReentrantLock lock2 = new ReentrantLock();

Runnable try1_2 = getRunnable(lock1, "lock 1", lock2, "lock 2");

Runnable try2_1 = getRunnable(lock2, "lock 2", lock1, "lock 1");

new Thread(try1_2).start();

new Thread(try2_1).start();

}

private static Runnable getRunnable(final ReentrantLock lock1, final String lock1Name, final ReentrantLock lock2, final String lock2Name) {

return new Runnable() {

@Override

public void run() {

try {

if (lock1.tryLock(1, TimeUnit.SECONDS)) {

System.out.println(lock1Name + " acquired in thread " + Thread.currentThread());

if (lock2.tryLock(1, TimeUnit.SECONDS)) {

System.out.println(lock2Name + " acquired in thread " + Thread.currentThread());

Thread.sleep(2000);

} else {

System.out.println("Could not acquire "+lock2Name + " in thread " + Thread.currentThread());

lock1.unlock();

System.out.println(lock1Name + " released in thread " + Thread.currentThread());

}

} else {

System.out.println("Could not acquire " + lock1Name + " in thread " + Thread.currentThread());

}

} catch (InterruptedException e) {

//you should not ignore it

} finally {

if (lock1.isHeldByCurrentThread()) lock1.unlock();

if (lock2.isHeldByCurrentThread()) lock2.unlock();

}

}

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值