SimpleDateFormat 은 java의 대표적인 Thread-unsafe 클래스
int TestAndSet(int *lockPtr) {
int oldLock = *lockPtr;
*lockPtr = 1;
return oldLock;
}
반복 시도
휴식
class Mutex {
// 대기 큐에 넣기 위한 값
// 0 : 락 사용 중 / 1 : 락 미사용 중
int value = 1;
// 대기 큐가 동시성 문제에 걸릴까봐 존재하는 값
int guard = 0;
}
Mutex::lock() {
while (test_and_set(&guard));
if (value == 0) {
현재 스레드 큐에 넣기;
guard = 0;
} else {
value = 0;
guard = 0;
}
}
Mutex:unlock() {
while (test_and_set(&guard));
if (큐에 하나라도 대기중이면) {
그 중 하나 깨움;
} else {
value = 1;
}
guard = 0;
}
class Semaphore {
int value = n;
int guard = 0;
}
Semaphore::wait() {
while (test_and_set(&guard));
if (value == 0) {
현재 스레드를 큐에 넣음
} else {
value -= 1;
guard = 0;
}
}
Semaphore::signal() {
while (test_and_set(&guard));
if (큐에 하나라도 대기중이면) {
그 중 하나 깨워 준비시키기;
} else {
value += 1;
}
guard = 0;
}
스핀락 < 뮤텍스
스핀락 > 뮤텍스
뮤텍스 | 이진 세마포 |
---|---|
락을 건 놈만 해제 가능 | 세마포는 락을 건놈과 해제하는 놈이 다를 수 있음 |
Priority Inheritance 속성 | 해당 속성 없음 |
상호배제만 필요한 경우 유리 | 작업 간 실행 순서 동기화 필요하면 유리 |
우선순위 유전