다시 잠금 및 비재잠금
1. What
다시 들어갈 수 있는 자물쇠, 즉 귀속 자물쇠라고도 부른다. 같은 라인 T가 외부 함수 A에 들어가 자물쇠 L을 얻은 후에 T가 내부 귀속 함수 B에 계속 들어갈 때 이 자물쇠 L을 획득하는 코드가 있고 자물쇠 L을 방출하지 않은 상황에서 이 자물쇠 L을 반복해서 획득할 수 있다.다시 들어갈 수 없는 자물쇠는 자전거 자물쇠라고도 부른다. 위에서 말한 바와 같이 같은 라인 T가 외부 함수 A에 들어가 자물쇠 L을 얻은 후에 T가 내부 귀속 함수 B에 계속 들어갈 때 이 자물쇠 L을 얻은 코드가 있다. 반드시 함수 A에 들어간 자물쇠 L을 먼저 풀어야 함수 B에 들어간 자물쇠 L을 얻을 수 있다.
2. 데모
2.1 잠금 재설정 불가능:
public class UnReentrantLock {
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException {
while (isLocked) {
wait();
}
isLocked = true;
}
public synchronized void unlock() {
isLocked = false;
notify();
}
}
public class Count {
UnReentrantLock lock = new UnReentrantLock();
public void outer() throws InterruptedException {
lock.lock();
inner();
lock.unlock();
}
public void inner() throws InterruptedException {
lock.lock();
System.out.println("call inner");
lock.unlock();
}
}
public class LockTest {
@Test
public void testUnReentrantLock() throws InterruptedException {
Count count = new Count();
// inner() , , ,
count.print();
}
}
2.2 잠금 재입력 가능
public class Lock{
boolean isLocked = false;
Thread lockedBy = null;
int lockedCount = 0;
public synchronized void lock()
throws InterruptedException{
Thread callingThread = Thread.currentThread();
while(isLocked && lockedBy != callingThread){
wait();
}
isLocked = true;
lockedCount++;
lockedBy = callingThread;
}
public synchronized void unlock(){
if(Thread.curentThread() == this.lockedBy){
lockedCount--;
if(lockedCount == 0){
isLocked = false;
notify();
}
}
}
}
리셋 가능한 자물쇠는 자물쇠를 가진 라인 대상과 자물쇠 계수를 사용하여 이루어진 것으로 리셋 가능한 자물쇠가 아닌 것은 판단 조건이 자물쇠 계수에 불과하고 자물쇠 계수<=1에 해당한다.
2.java의 리셋 가능한 자물쇠
ReentrantLock, synchronized 등
3. 왜 이런 물건을 만들었을까
다시 들어갈 수 있는 자물쇠는 자물쇠가 사라지는 것을 방지할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
2.1 잠금 재설정 불가능:
public class UnReentrantLock {
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException {
while (isLocked) {
wait();
}
isLocked = true;
}
public synchronized void unlock() {
isLocked = false;
notify();
}
}
public class Count {
UnReentrantLock lock = new UnReentrantLock();
public void outer() throws InterruptedException {
lock.lock();
inner();
lock.unlock();
}
public void inner() throws InterruptedException {
lock.lock();
System.out.println("call inner");
lock.unlock();
}
}
public class LockTest {
@Test
public void testUnReentrantLock() throws InterruptedException {
Count count = new Count();
// inner() , , ,
count.print();
}
}
2.2 잠금 재입력 가능
public class Lock{
boolean isLocked = false;
Thread lockedBy = null;
int lockedCount = 0;
public synchronized void lock()
throws InterruptedException{
Thread callingThread = Thread.currentThread();
while(isLocked && lockedBy != callingThread){
wait();
}
isLocked = true;
lockedCount++;
lockedBy = callingThread;
}
public synchronized void unlock(){
if(Thread.curentThread() == this.lockedBy){
lockedCount--;
if(lockedCount == 0){
isLocked = false;
notify();
}
}
}
}
리셋 가능한 자물쇠는 자물쇠를 가진 라인 대상과 자물쇠 계수를 사용하여 이루어진 것으로 리셋 가능한 자물쇠가 아닌 것은 판단 조건이 자물쇠 계수에 불과하고 자물쇠 계수<=1에 해당한다.
2.java의 리셋 가능한 자물쇠
ReentrantLock, synchronized 등
3. 왜 이런 물건을 만들었을까
다시 들어갈 수 있는 자물쇠는 자물쇠가 사라지는 것을 방지할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
다시 들어갈 수 있는 자물쇠는 자물쇠가 사라지는 것을 방지할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.