带锁的单身人士 - 可能死锁?在java中

时间:2012-10-05 23:25:23

标签: java singleton deadlock database-deadlocks

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

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();
  }
}

我想每隔几个小时锁定录制事件,通过互联网发送数据库。

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

是否有任何可能的死锁?它是线程安全吗?

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

2 个答案:

答案 0 :(得分:1)

更有可能的是,是的,可能会出现死锁。如果在database.getFilesendViaHTTP期间发生错误会怎样?没有try/finally模式可以确保调用Lock.unlock

答案 1 :(得分:0)

当您获得不同订单的锁时会出现死锁。由于这里只有一个实际锁定,因此不会出现问题。

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