DB 테이블을 업데이트하는 여러 가지 방법이있는 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()
. 3 개의 테이블 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 클래스의 각 메소드에 넣으면 다른 쓰레드를 넣을 수 있지 않을까요?
더 좋은 해결책이 있습니까?
A와 B를 원자 적으로 업데이트하는'synchronized updateAandB()'메소드를 추가 할 수 있습니까?또는 호출 사이트 (아마도 클래스 인스턴스 자체)에서 동기화가 수행되도록 정책을 변경 하시겠습니까? – assylias