public class TestLock {
private static Lock initLock = new ReentrantLock();
private static Map<String, String> beanCopierMap;
public static void initCopier(String key) {
initLock.lock();
beanCopierMap.put(key, "test"); ---抛异常导致锁未释放
initLock.unlock();
}
public static void main(String[] args) {
int count = 1000;
CountDownLatch countDownLatch = new CountDownLatch(count);
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < count; i++) {
final int index = i + 1;
executorService.submit(new Runnable() {
@Override
public void run() {
try {
initCopier("test");
} catch (Exception e) {
System.out.println(index + "error:" + e.getMessage());
} finally {
countDownLatch.countDown();
}
}
});
}
try {
countDownLatch.await();
System.out.println("can run");
} catch (Exception e) {}
}
}
执行到beanCopierMap.put(key, "test"); 时,beanCopierMap=null故抛出异常,initLock没有释放,并发跑的情况下就hang死了,看不到执行can run结束程序,应用处于假死状态。
导致tomcat应该假死的几个可能原因:
1.redis连接池没有释放(tcp没有释放掉,状态为close_wait)
2.数据库没有释放(tcp没有释放掉,状态为close_wait)
3.上传文件资源没有关闭(tcp没有释放掉,状态为close_wait)
4.httpclient请求没有关闭(tcp没有释放掉,状态为close_wait)
5.线程死锁
6.线程被阻塞,没有继续执行。