如果我需要调用从多个线程创建xls文件的方法-我可以将XLSTransformer用作类的synchronized(甚至不使用)字段吗?如果XLSTransformer.transformXLS()方法真的很昂贵,还是可以在需要创建xls的任何时候创建一个新实例?

我就是这个意思:

private synchronized XLSTransformer transformer = new XLSTransformer();

public void createXls() {
    //...
    transformer.transformXLS("template.xls", beans, "result.xls");
}


如果我从多个线程调用createXls(),它不会中断吗?

最佳答案

没有一个单独的说明,即XLSTransformer是线程安全的,因此您可以假定它不是,或分析jXLS源代码(link)。但是,请注意,每个lib版本中它可能有所不同,因此您应在每次更新后再次检查。

如果是关于您的示例的,则synchronized关键字是字段的非法修饰符。您可以将其与锁定this对象的方法一起使用:

public synchronized void createXls() {
    //...
}


或使用块时,可以选择将对象视为锁:

public void createXls() {
    //...
    synchronized( transformer ) {
        //...
    }
    //...
}


Java教程中的更多信息:


Synchronized Methods
Intrinsic Locks and Synchronization

09-25 23:03