初出茅庐的我写了如下的代码:
public class SemaphoreTest01 {
private static Semaphore semaphore = new Semaphore(1);
public static void main(String[] args) throws InterruptedException {
semaphore.acquire();
// do something...
semaphore.release();
}
}
程序测试正常,表面看也没有问题。使用信号量来控制程序对资源的获取。
但是生产上出现自动任务卡死的情况。
坑一:
多个线程访问此方法,某个线程在运行中异常,没有对信号量释放,另一个线程在获取信号量的时候就会一直等待,处于假死状态。模拟的示例如下:
public class SemaphoreTest02 {
private static Semaphore semaphore = new Semaphore(1);
public static void main(String[] args) throws InterruptedException {
// one thread
semaphore.acquire();
// another thread
semaphore.acquire();
// do something...
semaphore.release();
}
}
解决方式:
semaphore.acquire();
try {
System.out.println("I'm in...");
// do something...
Thread.sleep(100000000);
} finally {
semaphore.release();
}
坑二:
如果业务逻辑比较耗时,同样会导致等待很久的情况。
尝试获取信号量:
boolean flag = semaphore.tryAcquire(10, TimeUnit.SECONDS);
if (flag) {
try {
System.out.println("I'm in...");
// do something...
Thread.sleep(100000);
} finally {
semaphore.release();
}
}