关于目录创建的一个代码Bug

July 8, 2013 · One minute read

最近在项目中发现一个bug。原本单线程运行的一段代码,为了提高吞吐量,改成了多线程运行,结果报出文件目录无法创建的异常。问题出在下面这段代码:

根本原因在于多线程下,只有创建成功的那个线程会在mkdirs()的时候返回true,其他都返回了false。这个问题也出现在Lucene的文件锁里面。有两种解决方法,一种是把判断改成:

另一种方法是在物理上分离Lucene索引的存放位置,不要出现父子目录,因为在多线程调度的情况下,子索引可能会先被创建,这个时候就和父索引中的锁产生冲突。当然这种冲突时很少见的,我遇到的情况是在10线程的时候才陆陆续续遇到。