gpt4 book ai didi

java - 在没有加锁机制的情况下,不同线程对List进行读和 "set"操作是否安全

转载 作者:行者123 更新时间:2023-11-30 03:28:17 25 4
gpt4 key购买 nike

迭代 List 是非常不安全的,因为另一个线程正在执行添加/删除操作。

这就是为什么我们需要CopyOnWriteArrayList

public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<>();

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
// java.util.ConcurrentModificationException
for (String s : list) {
System.out.println(s);
}
}
}

});
thread.start();

for (int i=0; i<1000; i++) {
list.add("string" + i);
}

Thread.sleep(Long.MAX_VALUE);
}

但是set操作怎么样。目前,以下代码不会引发任何异常。

public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<>();
list.add("dummy");

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
for (String s : list) {
System.out.println(s);
}
}
}

});
thread.start();

for (int i=0; i<1000; i++) {
list.set(0, "smart");
}

Thread.sleep(Long.MAX_VALUE);
}

虽然没有任何意外的结果,但我想知道,如果线程只对List执行set操作,我们不这样做是一个好习惯吗?没有使用任何锁定机制,或复制n写入机制?

最佳答案

引用ArrayList的javadoc :

Note that this implementation is not synchronized. If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more elements, or explicitly resizes the backing array; merely setting the value of an element is not a structural modification.)

所以不,不需要同步。

关于java - 在没有加锁机制的情况下,不同线程对List进行读和 "set"操作是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664126/

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