我有一个DAO类,它有更新数据库表的多个方法。这些方法在代码库中的许多不同位置以许多不同的顺序调用。确保只有一个线程在一个类
public class Dao {
public synchronized updateA()
public synchronized updateB()
public synchronized updateC()
public synchronized getA()
public synchronized getB()
public synchronized getC()
}
我在那里的Class1要调用的问题getA()
,getB()
,并按顺序getC()
。三个表A,B和C是相关的,所以我需要在一个时间点使它们的状态同步。
但是,在Class1调用getA()
之后且在它调用getB()
之前,另一个线程上的Class2跳入并调用updateB()
,这会打破一切。
是否有可能锁定整个DAO类,而任何线程在那里,只有当它完成时解锁它?
我试着在DAO类中放入一个静态ReentrantLock并将它从Class1中锁定,但我不确定如何从那里继续。
我就得到了如下所示:
public class Class1 {
public void check() {
dao.daoLock.lock();
dao.getA();
dao.getB();
dao.getC();
dao.daoLock.unlock();
}
}
public class Dao {
public static final daoLock = new ReentrantLock();
public synchronized updateA() {
daoLock.lock();
// Do stuff...
}
public synchronized updateB() {
daoLock.lock();
// Do stuff...
}
public synchronized updateC() {
daoLock.lock();
// Do stuff...
}
public synchronized getA() {
daoLock.lock();
// Do stuff...
}
public synchronized getB() {
daoLock.lock();
// Do stuff...
}
public synchronized getC() {
daoLock.lock();
// Do stuff...
}
}
我不确定解锁的位置。如果我把它放在每个DAO类的方法中,它会让其他线程进入吗?
这里有更好的解决方案吗?
也许增加一个'synchronized updateAandB()'方法来自动更新A和B?或更改您的策略,以便在呼叫站点完成同步(可能在类实例本身)? – assylias