【发布时间】:2014-08-05 15:22:29
【问题描述】:
如果对一对数据结构的所有访问总是与锁的获取和释放(特别是使用对数据结构进行任何修改的静态同步方法)。例如:
public static synchronized Item doIt() {
// remove something from data structure 1
// add the removed item to data structure 2
// return removed item
}
我知道同步方法一次只会强制一个线程执行更新,但是当一个线程退出该方法时,其他线程是否可以保证看到更新的数据结构,还是我仍然需要专门的并发该保证的数据结构?
编辑:
这是我正在尝试做的一个更好的例子:
private static final List<Item> A;
private static final HashMap<Integer,Item> B;
public static Item doSomething() {
// some stuff ...
Item item = doIt();
// some other stuff ...
return item;
}
private static synchronized Item doIt() {
Item theItem = A.remove( A.size()-1 );
B.put( theItem.getId(), theItem );
return theItem;
}
【问题讨论】:
-
您不应该需要这样的集合,因为您正在手动执行锁定。但为什么要重新发明轮子呢?
-
@LuiggiMendoza 因为你不能在没有锁定的情况下原子地修改两个集合。
-
@WilliamF.Jameson 但是集合框架的这些并发版本已经具有这种锁定处理并允许对它们进行原子操作。再说一遍:为什么要重新发明轮子?
-
@LuiggiMendoza OP 有两个系列。这两个更新作为一个整体不会是原子的。
-
您是否总是从同一类中的
static、synchronized方法访问它们?仅当您始终在同一个对象上同步时,同步才会有所帮助。你知道staticsynchronized方法在哪个对象上同步吗?
标签: java concurrency