增量实例变量不可用于下一个线程

时间:2019-04-04 20:47:59

标签: java multithreading thread-safety

我对线程很陌生。因此,如果这是一个非常基本的问题,请原谅我的无知。 基本上,我正在尝试将员工列表写到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无法用于下一个线程。

  

审判1:

我将volatile关键字用于rowNum。那也不起作用。

  

试用2:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

请注意,您的同步技巧不会执行任何操作;整数是不可变的:每次增加整数时,它都是一个不同的实例,并且“ synchronized(X)”与任何其他synced(Y)都没有任何交互,除非X和Y都引用同一对象。