我使用单例来记录系统中同时发生的所有事件。
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()代码并解锁吗?
答案 0 :(得分:1)
更有可能的是,是的,可能会出现死锁。如果在database.getFile
或sendViaHTTP
期间发生错误会怎样?没有try/finally
模式可以确保调用Lock.unlock
。
答案 1 :(得分:0)
当您获得不同订单的锁时会出现死锁。由于这里只有一个实际锁定,因此不会出现问题。
您的案例看起来更像是对我的读写锁的候选者:使用读锁来允许DBMS操作的最大并发性,并在您希望它们停止并发送文件时使用写锁。