在java中同步对象

r1zk6ea1  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(407)

我正在寻找类似这种语法的东西,即使它不存在。
我想让一个方法作用于一个集合,并且在该方法的生命周期内,确保集合没有被破坏。
所以看起来像:

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
    }
}

这是最好的办法吗?

czq61nw1

czq61nw11#

在这种情况下,最好使用同步列表:

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

collections api为线程安全提供了同步的 Package 器集合。
对方法体中的列表进行同步将阻止在方法的整个生命周期内需要访问该列表的其他线程。
另一种方法是手动同步对列表的所有访问:

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

    ...

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

 }
j8yoct9x

j8yoct9x2#

是的,这是唯一的办法。

private synchronized myMethod() {
    // do work
}

相当于:

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

所以如果你想在其他示例上同步 this ,除了声明 synchronized 方法内部的块。

相关问题