2

我使用单例记录系统中同时发生的所有事件。

public class Singleton {
  private static Lock dbLock;
  protected Singleton() {}
  private static class SingletonHolder { 
      private final static Singleton instance = new Singleton();
  }
  public static Singleton getInstance() {
      return SingletonHolder.instance;
  }
  public void recordEvent(Event ev) {
       dbLock.lock();
    try {
          database.insert(ev);
        } finally {
         dbLock.unlock();
    }
  }
  public File lockAndGetDB() {
      dbLock.lock();
      return database.getFile();
  }
  public void unlockDB() {
      dbLock.unlock();
  }
}

每隔几个小时,我想锁定记​​录事件以通过 Internet 发送数据库。

file = Singleton.getInstance().lockAndGetDB();
try {
  sendViaHTTP(file);
}
finally {
   Singleton.getInstance().unlock();
}

有没有可能的死锁?它是线程安全的吗?

已编辑。(尝试/最终添加用于通过HTTP 发送)但这不是主要问题。问题是,是否有线程在等待 dbLock.lock(); 在 recordEvent(Event ev) 是我的 Singleton.getInstance().unlock(); 将能够输入 getInstance() 代码并解锁?

4

2 回答 2

1

很可能,是的,可能会出现死锁。database.getFile如果在or期间发生错误会发生sendViaHTTP什么?没有try/finally模式可以确保Lock.unlock被调用。

于 2012-10-05T23:41:11.823 回答
0

当您以不同的顺序获取锁时,就会出现死锁。由于这里只有一个实际的锁,因此不存在问题。

在我看来,您的情况更像是读写锁的候选者:使用读锁来允许 DBMS 操作的最大并发性,并在您希望它们停止并发送文件时使用写锁。

于 2012-10-05T23:40:27.527 回答