java - 增量实例变量不可用于下一个线程
问题描述
我对线程很陌生。因此,如果这是一个非常基本的问题,请原谅我的无知。基本上,我正在尝试将员工列表写入 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
}
任何帮助将不胜感激。谢谢。
解决方案
这样做的正确方法通常是创建一个AtomicInteger
变量。但是,听起来您犯了一个不同的错误,实际上您有 10 个 MyEmployeeWriter 实例。
请注意,您的同步技巧什么都不做;Integer 是不可变的:每次递增它时,它都是一个不同的实例,并且 'synchronized(X)' 与任何其他 synchronized(Y) 没有任何交互,除非 X 和 Y 都是对同一对象的引用。
推荐阅读
- python - Bokeh RuntimeError,如何在绘图中添加工具提示?
- javascript - 如何在反应中将两个函数传递给onClick事件
- csv - Kony Datagrid 导出
- hyperledger-fabric - 如何更改作曲家休息服务器的设置
- spring-mvc - 有没有办法读取 Spring Security 元数据?
- laravel - Laravel 自定义错误
- ios - 从后台检查
- excel - Excel vba PasteSpecial xlAdd循环
- javascript - 如何使此滚动内容高于内容 120 像素?
- c# - 将数据添加到实体框架中的动态表