在Java中同步对象

时间:2015-01-14 21:38:36

标签: java thread-synchronization java-collections-api

我正在寻找类似于这种语法的东西,即使它不存在。

我想让一个方法对集合起作用,并且在方法的生命周期中,确保集合不会被搞乱。

所以这看起来像:

private void synchronized(collectionX) doSomethingWithCollectionX() {
    // do something with collection x here, method acquires and releases lock on
    // collectionX automatically before and after the method is called
}

但相反,我担心唯一的方法是:

private void doSomethingWithTheCollectionX(List<?> collectionX) {
    synchronized(collectionX) {
        // do something with collection x here
    }
}

这是最好的方法吗?

2 个答案:

答案 0 :(得分:4)

是的,这是唯一方式。

private synchronized myMethod() {
    // do work
}

相当于:

private myMethod() {
    synchronized(this) {
         // do work
    }
}

因此,如果要在this以外的其他实例上进行同步,除了在方法中声明synchronized块之外别无选择。

答案 1 :(得分:4)

在这种情况下使用同步列表会更好:

List<X> list = Collections.synchronizedList(new ArrayList<X>());

集合API为线程安全提供了synchronized wrapper collections

在方法体中的列表上进行同步将阻止需要在方法的整个生命周期内访问列表的其他线程。

备选方案是手动同步对列表的所有访问:

private void doSomethingWithTheCollectionX(List<?> collectionX){
    ...
    synchronized(collectionX) {
       ... e.g. adding to the list
    }

    ...

    synchronized(collectionX) {
       ... e.g. updating an element
    }

 }