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

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


@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个线程都是1。递增的线程不可用于下一个线程。this.rowCountrowCount


试用版 1:


我使用了行数的关键字。这也行不通。volatile


试用版 2:


我尝试将行Num更改为,并在其上添加了一个同步块。这也行不通。Integer(Wrapper class)


synchronized(this.rowNum) // I changed rowNum from int to Integer.

{

  // Some logic here

}

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


BIG阳
浏览 70回答 1
1回答

偶然的你

正确的方法通常是创建一个变量。但是,这听起来像是你在犯一个不同的错误,你实际上有10个“我的职业作家”的实例。AtomicInteger请注意,您的同步技巧不会做任何事情;整数是不可变的:每次递增它时,它都是一个不同的实例,并且“synced(X)”与任何其他已同步(Y)没有任何交互,除非X和Y都是对同一对象的引用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java