gpt4 book ai didi

java - 将本地新对象传递给线程,线程安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:23 24 4
gpt4 key购买 nike

我有一个方法(下面的示例)可以创建一个新列表,将一些内容放入其中,然后将其传递给另一个线程进行操作。

这似乎是线程安全的。该列表对于创建它的方法是本地的。该方法对列表进行操作,并且在完成对列表的操作之前不会将其传递给另一个线程。

但这感觉是错误的,因为列表是在两个单独的线程中访问的,但它不是同步的。

这是可接受的线程安全代码吗?

class App
{
public static void main(String[] args)
{
final ArrayList<Integer> list = new ArrayList<Integer>();
list.add(4);
list.add(5);

final ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(new Runnable() {
@Override public void run()
{
for (Integer i : list)
System.out.println(i);
}});
es.shutdown();
}
}

最佳答案

这是安全的,因为一个线程写入列表,然后另一个线程从列表中读取,并且执行器服务保证在您提交任务时发生之前发生的关系。

引自 the documentation :

The methods of all classes in java.util.concurrent and its subpackages extend these guarantees to higher-level synchronization. In particular:

[...]

Actions in a thread prior to the submission of a Runnable to an Executor happen-before its execution begins. Similarly for Callables submitted to an ExecutorService.

关于java - 将本地新对象传递给线程,线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com