public void tSafe(List<Foo> list, Properties status) {
if(list == null) return;
String key = "COUNT";
AtomicInteger a = new AtomicInteger(Integer.valueOf(status.getProperty(key,"0")));
list.parallelStream().filter(Foo::check).
forEach(foo -> {status.setProperty(key, String.valueOf(a.incrementAndGet())); }
);
}
private interface Foo {
public boolean check();
}
Description:
在上面的例子中,status 是一个共享属性,它包含一个名为 COUNT 的键。我的目标是增加计数并将其放回属性中以计算执行的检查次数。考虑到 tSafe 方法被多个线程调用,我最后得到的计数是否正确?请注意,我使用 AtomicInteger a 作为局部变量。
最佳答案
如果你只有一个线程,这会工作,但是如果你有多个线程调用它,你有一些线程安全的操作。如果每个线程都在不同的 list
和 status
对象上运行,这将很好。
由于 status
是一个线程安全的集合,您可以锁定它,并且如果 list
在另一个线程中未更改,则可以。
一般来说,以线程安全的方式将字符串作为数字使用是非常棘手的。你最好制作你的值(value)线程,即一个 AtomicInteger 而不是其他任何东西。
关于java - 我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36005048/