Sma*_*y77 4 java vector thread-safety
有没有危险,如果我在我的服务器程序上使用一个Vector(java.util.Vector),当我从多个线程访问它只是为了阅读?(myvector .size().get()...)用于使用synchronized方法编写im.谢谢.
Ale*_*lev 15
如上所述,Vector由于synchronized修饰符,每种方法都是自己的线程安全的.但是,如果您需要一些复杂的操作,例如get()或add()基于与其相关的条件,则vector这不是线程安全的.见下面的例子:
if (vector.size() > 0) {
System.out.println(vector.get(0));
}
Run Code Online (Sandbox Code Playgroud)
该代码具有之间的竞争条件size()和get()-向量的大小可能会被其他线程更改后我们的线程验证向量不为空,因此get()调用可能返回意外的结果.为避免这种情况,上面的示例应该像这样更改:
synchronized (vector) {
if (vector.size() > 0) {
System.out.println(vector.get(0));
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这种"如果不是空"的操作是原子的,并且无竞争条件.
| 归档时间: |
|
| 查看次数: |
14453 次 |
| 最近记录: |