gpt4 book ai didi

Java 并发实践 : 3. 5.4 Effectively immutable objects: Do we need Thread-Safe Collection containers for effectively immutable objects

转载 作者:行者123 更新时间:2023-11-30 06:11:45 31 4
gpt4 key购买 nike

第 3.5.4 节讨论了有效不可变对象(immutable对象),也就是说,一旦一个对象被安全且完整地构建,它的状态就不会被任何代码路径的任何代码改变。

Goetz 爵士举了一个例子:

For example, Date is mutable, but if you use it as if it were immutable you may be able to eliminate the locking that would otherwise be required when shared[sharing] a Date across threads. Suppose you want to maintain a Map storing the last login time of each user:

public Map<String, Date> lastLogin = 
Collections.synchronizedMap(new HashMap<String, Date>());

If the Date values are not modified after they are placed in the Map, then the synchronization in the synchronizedMap implementation is sufficient to publish the Date values safely, and no additional synchronization is needed when accessing them.

我无法理解的一点是,为什么我们要使用 synchronizedMap当我们可以简单地使用 unsafe Map 时,承担其内部锁定的额外开销,因为毕竟我们会放置有效不可变的 Date其中的对象——这意味着,一旦正确、完整地构建和发布,它就不会再发生变化。所以即使 Map本身是不安全的,任何代码路径中都没有代码可以同时改变任何 Date实例,而其他线程已从 Unsafe Map 中检索到它.

总而言之,有效不可变对象(immutable对象)的前提不需要任何线程安全容器,因为我们不应该在任何代码路径中为有效不可变对象(immutable对象)添加任何更改器代码。

最佳答案

如果您使用 un-synchronized mutable map并分享给 threads那么你将有两个 thread-safety问题:visibilityatomicity . Thread-1不知道是否Thread-2删除了 Map-Entry或者它用新的 Date 替换了它的值对象。

// not atmoic and doesn't guarantee visiblity
if(map.contains(key)){
map.put(key,newDate);
}

关于Java 并发实践 : 3. 5.4 Effectively immutable objects: Do we need Thread-Safe Collection containers for effectively immutable objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33711237/

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