최대 동시성을 촉진하기 위해 , 그들은 disjoint 쓰기 세트가 있습니다. 쓰기 세트가 교차하는 경우 스레드를 대체해야합니다. 따라서 동기화 블록에 doStuff
을 넣을 수는 없습니다. 항상 필요한 것은 아니기 때문입니다.선택적으로 시행 동기화
쓰기 세트의 항목을 잠글 수 있지만 교차하는 쓰기 세트가있는 두 개의 스레드가 같은 잠금에서 대기하는 경우 교착 상태가 발생할 수 있습니다. 예를 들면 : (내가 가지고 올 수까지)
Lock[] locks = new Lock[allAvailableVariables.length];
public void getLocks() {
for(i = 0; i < allAvailableVariables.length; i++)
if(i is in writeSet)
locks[i].lock();
}
가장 쉬운 방법은 그것을 피하기 위해 당신의 쓰기 세트의 잠금의 획득을 동기화하는 것입니다. 그러나 교차 쓰기 세트가있는 두 개의 스레드가 동기화 블록에 들어가기 위해 경쟁하는 경우 다른 두 스레드와 분리 된 쓰기 세트가있는 스레드는 동기화 블록을 나갈 때까지 대기해야합니다.
필자는 스핀 잠금을 사용할 수 있다고 생각하지만 가능하면 쓰기 세트가 비싸지는지 여부를 평가하는 것을 피하고 싶습니다.
전혀 이해가 되나요?
잠금 장치가 필요한 시간을 미리 알 수 없으면 (예 : 'doStuff()'중간에 새 잠금 장치가 있어야 함) 알 수없는 경우에 한 가지 주름이 생길 수 있습니다. 이 경우, 하나의 옵션은'tryLock()'을 통해 잠금을 획득하려고 시도하는 것이다. 그게 성공한다면, 훌륭합니다. 그렇지 않다면 모든 것을 풀고 모든 작업을 취소 한 다음 필요한 잠금 장치로 다시 시도하십시오. – yshavit
@yshavit. 소프트웨어 거래 메모리와 관련하여 문제에 관해 상당한 양의 문헌이 있습니다. –