首页 > 解决方案 > 增量实例变量不可用于下一个线程

问题描述

我对线程很陌生。因此,如果这是一个非常基本的问题,请原谅我的无知。基本上,我正在尝试将员工列表写入 Excel 工作簿。所以在下面的类中,startUp方法只被调用一次。而从 10 个不同的线程多次调用 write 方法。

@Component
class MyEmployeeWriter{
priavte int rowNum; // To start with, the rowNum is 0 here

public void startUp(Employees employee)
{
    // some logic ...
    this.rowNum++; //now rowNum is 1
}


public void write(Employees employees)
{
    Sheet sheet = workbook.getSheetAt(0);
    Row row = sheet.createRow(this.rowCount); //here for all the 10 threads the, rowNum is 1
    // Some more logic here...

    this.rowCount++;
}

}

我面临的问题是,所有 10 个线程this.rowCount都是 1。增量rowCount不适用于下一个线程。

试验一:

我使用volatile关键字rowNum。那也没有用。

试验二:

我尝试将 rowNum 更改为Integer(Wrapper class)并在其上添加了一个同步块。那也没有用。

synchronized(this.rowNum) // I changed rowNum from int to Integer.
{
  // Some logic here
}

任何帮助将不胜感激。谢谢。

标签: javamultithreadingthread-safety

解决方案


这样做的正确方法通常是创建一个AtomicInteger变量。但是,听起来您犯了一个不同的错误,实际上您有 10 个 MyEmployeeWriter 实例。

请注意,您的同步技巧什么都不做;Integer 是不可变的:每次递增它时,它都是一个不同的实例,并且 'synchronized(X)' 与任何其他 synchronized(Y) 没有任何交互,除非 X 和 Y 都是对同一对象的引用。


推荐阅读