java - 我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?

标签 java multithreading

 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 作为局部变量。

最佳答案

如果你只有一个线程,这会工作,但是如果你有多个线程调用它,你有一些线程安全的操作。如果每个线程都在不同的 liststatus 对象上运行,这将很好。

由于 status 是一个线程安全的集合,您可以锁定它,并且如果 list 在另一个线程中未更改,则可以。

一般来说,以线程安全的方式将字符串作为数字使用是非常棘手的。你最好制作你的值(value)线程,即一个 AtomicInteger 而不是其他任何东西。

关于java - 我们可以在方法中使用 AtomicInteger 作为局部变量并实现线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36005048/

相关文章:

multithreading - 什么时候多线程不是一个好主意?

multithreading - Spark : driver logs showing “thread spilling sort data to disk”

java - 即使使用正确的凭据,LDAP 错误代码 49 AcceptSecurityContext 错误数据 52e v2580

java - 写 cucumber 故事时有哪些准则?

java - 构造函数中的 this 引用

c - 多个进程,一个互斥锁

java - 从线程中的不同类运行 GUI

java - 如何使用正则表达式替换电子邮件地址的一部分?

java - LibGDX v3.0.0 (connection error) 设置过程中,不出现第三方库

ruby - 在 Ruby 哈希中并行创建键值对的问题