锁泄漏导致的应用假死案例

682 阅读2分钟
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.线程被阻塞,没有继续执行。