gpt4 book ai didi

java - 业务逻辑的同步实现

转载 作者:行者123 更新时间:2023-11-30 09:50:53 24 4
gpt4 key购买 nike

使用现有的同步 Java 类(Hashtable、StringBuffer、Vector)实现

在我们实现非同步 Java 类(HashMap、StringBuilder、ArrayList)时同步块(synchronized block)

从 Collections.synchronizedXXX() 方法创建一个同步集合对象,然后使用它(当然,我不能像这样同步 StringBuilder。!!)

在多线程场景中,以上哪项是在不影响性能的情况下实现同步的最佳方式?

提前致谢。!!!

最佳答案

最佳方法取决于您的代码试图做什么以及您需要的原子性级别。有时 Collections.synchronizedWhatever 没问题;有时您需要自己进行同步。

就性能而言,您只需要确保将输入的同步 block 的数量减到最少。会有一点区别

(example A)
List l = Collections.synchronizedList(originalList);
l.add(something);

(example B)
synchronized (originalList) {
originalList.add(something);
}

因为他们都进入了一个同步块(synchronized block)。然而:

(example C)
List l = Collections.synchronizedList(originalList);
l.add(something);
int index = l.indexOf(something);

将进入两个同步块(synchronized block),而

(example D)
synchronized (originalList) {
originalList.add(something);
int index = originalList.indexOf(something);
}

只会进入一个同步块(synchronized block)。当然,它在该 block 中花费的时间更长,因此可能会增加争用,但 add 和 indexOf 现在的行为就像一个原子操作。这可能是也可能不是您想要的:它完全取决于应用程序。

编辑:回答 Deepak 的问题:

示例 C 中的“synchronizedList”意味着对“l”上的方法的每次调用都将包装在一个同步块(synchronized block)中。你可以认为 C 是这样做的:

synchronized (originalList) {
originalList.add(something);
}
synchronized (originalList) {
int index = originalList.indexOf(something);
}

这里有一些额外的成本,但除非它在代码的性能关键部分,否则它可能不会成为问题。我建议您在考虑优化代码之前更多地考虑确保您的代码行为正确。很难获得正确的线程安全代码,因此在编写代码时要非常小心。例如,在 C 中,'l.add(something)' 和 'l.indexOf(something)' 之间可能存在竞争条件。 D 没有相同的竞争条件,因为两个操作都在一个同步块(synchronized block)内。

Brian Goetz 的书(Java 并发实践)是学习如何编写线程安全代码的绝佳资源。我强烈推荐它。我确定它在亚马逊上。

关于java - 业务逻辑的同步实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905700/

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