-1

这是一个被问过很多次的问题,但并非总是如此,Java 初学者(像我一样)可以深入理解给出的答案。

我一直在阅读一些 Java 书籍,在其中一本中我读到 Vector 和 ArrayList 之间的区别在于前者是同步的,而后者不是(与 StringBuffer 与 StringBuilder 相同)。

这本书解释了«如果我们需要它,我们可以将同步“添加”到未同步的代码中»。

这篇文章中,Brian Roach 解释了 « StringBuffer 和 Vector 的线程同步会增加开销(除非您需要它,但即便如此,也有办法将其添加到较新的类中) »。

所以,我有三个问题:

1)如果同步增加了开销,但如果我们需要它可以添加到更新的类,为什么不使用 StringBuffer 和 Vector 而不是向 StringBuilder 和 ArrayList 添加同步?

2)我们如何向类添加同步?

3)同步的目的是什么?

对不起我的新手问题(我知道我必须阅读更多的书),但这些概念不是很容易掌握。

4

4 回答 4

4

同步有与之相关的开销,并且会不必要地降低性能。考虑以下代码片段:

synchronized(this) {
   doSomething();
}

每当一个线程进入一个同步块时,它必须获得一个锁。当它离开块时,它放弃了锁。这就是防止多个线程同时进入代码块的原因。

如果代码不需要同步(因为一次只能由一个线程访问),那么您可以将代码编写为

doSomething();

总而言之 - 您通常不应该使用同步版本,除非您需要它,因为它会增加开销。但是您始终可以使用同步块(和/或锁)添加同步。

于 2012-12-29T17:26:15.057 回答
0

1)如果同步增加了开销,但如果我们需要它可以添加到更新的类,为什么不使用 StringBuffer 和 Vector 而不是向 StringBuilder 和 ArrayList 添加同步?

恕我直言,从来没有一个很好的理由来拥有一个同步的 StringBuffer。我认为这样做只是为了与其他系列保持一致。现在使用它的唯一原因是当你有一个坚持使用它的 API 时。

Vector 更有用,虽然您可以使用 Collection.synchronizedList() 一些 API 需要它。从 Java 5.0 开始,一些并发集合是更好的选择。

2)我们如何向类添加同步?

synchronized关键字添加到所有方法(还有更多,但在最简单的情况下,这就是所有需要的)您还可以创建一个同步包装,如 synchronizedList

3)同步的目的是什么?

线程安全。

于 2012-12-29T22:56:21.017 回答
0

1)因为Vector之前引入了java API ArrayList。几乎没有充分的理由再使用Vector了。StringBuffer对于vs也是如此。StringBuilder

2)如果需要同步,可以同步访问/修改实例所在的方法(或块)

于 2012-12-29T17:24:38.350 回答
0

兼容性。他们不想改变已经存在的课程。所以他们添加了一个不会自动同步的变体。您可以ArrayList通过将其包装List<String> list = Collections.synchronizedList(new ArrayList<String>());到同步列表中来进行同步。

同步在 Wikipedia 中有解释。从那里开始阅读。

简单的同步 ArrayList 示例:

 // Class definition
 ArrayList<String> foo;

 void doSomething() {
     synchronized(foo) {
         foo.add("Foobar");
     }
 }

该方法doSomething是线程安全的。

于 2012-12-29T17:27:07.400 回答