繁体   English   中英

java synchronized块是否包含1个以上的对象?

[英]java synchronized block for more than 1 objects?

我有两个数组,我需要跨线程同步访问它们。 我将把它们放在同步块中。 问题是,我只能将其中一个传递给'同步'一步到位。

如何确保对两个阵列的访问同步? 我把它们放在一个类中并创建它的对象吗? 或者我只在同步块中访问另一个数组,这需要同步访问它?

谢谢,

无论你做什么都不要这样做:

synchronized (array1) {
  synchronized (array2) {
    // do stuff
  }
}

除非你非常小心,否则这很可能导致死锁 如果你采用这种方法,你必须确保对对象有一个不变的部分顺序 - 谷歌“餐饮哲学家”讨论陷阱。

基本上你要做的是创建一个锁对象,如果你想访问任何一个数组然后使用它来进行所有数组访问,你将使用它。 它粗粒度但安全。 你可以这样做:

public static class TwoArrays {
  private int[] array1 = ...
  private int[] array2 = ...
  private final Object LOCK = new Object();

  public void doUpdate() {
    synchronized (LOCK) {
      ...
    }
  }
}

如果你需要一个更细粒度的方法,你想使用Java 5+并发实用程序,如ReadWriteLock但实现起来会更复杂,容易出错。

在Java 5之前,我已经写过这样的东西:

// pre Java 5 code:
Object lock = new Object();
// ...
synchronized(lock) {
    // do something that requires synchronized access
}

但是从Java 5开始,我会使用java.util.concurrent.locks类(个人而言,我发现这不是更复杂或容易出错):

// Java 5 Code Using Locks
Lock lock = // ...
lock.lock();
try {
    // do something that requires synchronized access
}
finally {
    lock.unlock();
}

如果需要读写锁定,这里是使用Java 5的读写锁实现的示例:

private ReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock rLock = rwl.readLock();
private Lock wLock = rwl.writeLock();

private List<String> data = new ArrayList<String>();

public String getData(int index) { 
    rLock.lock();
    try {
       return data.get(index);
    } finally {
        rLock.unlock();
    }
}

public void addData(int index, String element) {
    wLock.lock();
    try {
        data.add(index, element);
    } finally {
        wLock.unlock();
    }
}

当然,根据您的需求进行调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM