【问题标题】:Synchronizing on an object in Java在 Java 中同步对象
【发布时间】:2015-03-13 05:25:10
【问题描述】:

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

我想让一个方法作用于一个集合,并且在该方法的生命周期内,确保集合不会被弄乱。

所以它可能看起来像:

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

这是最好的方法吗?

【问题讨论】:

  • 除非我误解了这个问题,否则这里唯一的区别是缩进级别。

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


【解决方案1】:

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

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
    }

 }

【讨论】:

    【解决方案2】:

    是的,这是唯一的方式。

    private synchronized myMethod() {
        // do work
    }
    

    相当于:

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

    因此,如果您想在 this 之外的其他实例上进行同步,您别无选择,只能在方法中声明 synchronized 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2016-11-24
      • 2012-07-09
      • 1970-01-01
      • 2013-04-25
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多