gpt4 book ai didi

java - Collections.synchronizedList 中需要客户端锁定

转载 作者:行者123 更新时间:2023-12-01 11:17:24 25 4
gpt4 key购买 nike

在为 Collections.synchronizedList 编写 putIfAbsent 方法时,需要在访问列表期间提供显式锁定。

以下代码片段更详细地解释了它:

class ListHelper <E> {
List<Employee> employeeList = new ArrayList<Employee>();
employeeList.add(new Employee());
//.. add more eomployees like this to the list
public List<E> list = Collections.synchronizedList(employeeList);

public boolean putIfAbsent(Employee x) {
boolean absent = !employeeList.contains(x);
if (absent)
employeeList.add(x);
return absent;
}
}

请解释一下,当我们有 Collections.synchronizedList 锁定 ArrayList 对象时,为什么 put-if-absent 方法中需要同步(employeeList)。

谢谢

最佳答案

让我们看看这种方法的实现:

public boolean putIfAbsent(Employee emp, List employeeList) {
if (!employeeList.contains(emp)) {
employeeList.add(emp);
}
}

这样的实现是线程安全的,即使多个线程同时调用它,列表的内部结构也不会受到损害,并且列表将保持功能。

但它不是线程安全的,因为可能存在竞争条件,导致两个线程将相同的元素添加到列表中两次:

T1: check if the employee is contained in the list: no
T2: check if the employee is contained in the list: no
T1: add the employee to the list
T2: add the employee to the list

因此,您的 putIfAbsent() 方法存在错误。这就是需要同步的原因。

关于java - Collections.synchronizedList 中需要客户端锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31645888/

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