객체 잠금
Lock은 Fiber에 대한 동시 액세스를 제어하는 데 사용할 수 있는 내장 개체입니다. 하나의 Fiber를 통해 잠금을 획득하여 다른 Fiber가 동시에 획득하는 것을 방지할 수 있습니다. 자물쇠는 통과할 수 있습니다coroutine.Lock() 함수 생성
일반적인 상황은 다중 스레드 시나리오에서 여러 스레드가 동일한 데이터를 수정하려고 할 때 데이터 불일치가 발생한다는 것입니다. 예를 들어, 두 스레드가 동일한 데이터에서 동일한 값을 수정하려는 경우 제어가 부적절하면 결과가 일관되지 않을 수 있습니다. 이때 Lock 객체를 사용하면 동일한 데이터에 대해 상호 배타적인 접근이 가능합니다.
다음은 Lock을 사용하여 두 Fiber의 교번 실행을 구현하는 간단한 예이며, 공유 변수 v의 값은 300이 아닙니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var coroutine = require("coroutine")
var l = new coroutine.Lock()
var v = 100
function f() {
l.acquire()
v = 200
coroutine.sleep(1)
v = 300
l.release()
}
coroutine.start(f)
coroutine.sleep(1)
l.acquire()
assert.notEqual(300, v)
assert.equal(200, v)
l.release()
먼저 Lock 객체가 생성되어 파이버 f에 들어가서 잠금을 획득하고 변수 v를 수정한 다음 잠금을 해제합니다. 메인 스레드에서 파이버 f가 완료될 때까지 기다립니다. 파이버 f가 잠금을 해제하면 메인 스레드는 잠금을 획득하기 시작하고 변수 v의 값이 300으로 변경되는지 확인합니다.
상속관계
건설자
Lock
건설자
1new Lock();
멤버 함수
acquire
잠금 소유권 가져오기
1Boolean Lock.acquire(Boolean blocking = true);
호출 매개변수:
- blocking: 부울, 기다릴지 여부를 지정합니다. true인 경우 대기합니다. 기본값은 true입니다.
결과 반환:
- Boolean, 잠금이 성공적으로 획득되었는지 여부를 반환합니다. true는 획득에 성공했음을 나타냅니다.
획득 메소드는 잠금의 소유권을 획득하는데 사용되며, 잠금이 획득 가능한 상태일 때 이 메소드는 즉시 true를 반환합니다.
잠금을 획득할 수 없고 차단이 true인 경우 현재 Fiber는 절전 모드로 전환되고, 다른 Fiber가 잠금을 해제하면 이 메서드는 true를 반환합니다.
잠금을 획득할 수 없고 차단이 false인 경우 메서드는 false를 반환합니다.
release
잠금 소유권 해제
1Lock.release();
이 방법은 잠금 소유권을 해제하거나 현재 파이버가 잠금을 소유하지 않은 경우 오류를 발생시킵니다.
count
현재 대기 중인 작업 수 쿼리
1Integer Lock.count();
결과 반환:
- Integer, 작업 수를 반환합니다.
toString
객체의 문자열 표현을 반환하며 일반적으로 "[Native Object]"를 반환하며 객체 자체의 특성에 따라 다시 구현될 수 있습니다.
1String Lock.toString();
결과 반환:
- String, 객체의 문자열 표현을 반환합니다.
toJSON
객체의 JSON 형식 표현을 반환하며 일반적으로 객체에 의해 정의된 읽을 수 있는 속성 컬렉션을 반환합니다.
1Value Lock.toJSON(String key = "");
호출 매개변수:
- key: 문자열, 사용되지 않음
결과 반환:
- Value, 직렬화 가능한 JSON을 포함하는 값을 반환합니다.