다중 스레드 프로그래밍의 발전으로 인해 여러 스레드가 동일한 데이터에 동시에 접근하는 문제점이 발생하였습니다. 이는 예측할 수 없는 버그와 프로그램 상태의 손상을 초래했습니다.
비주얼베이직 .NET에서 SyncLock 구문을 통해 독점 잠금 메커니즘을 적용하여 특정 코드를 동시에 하나의 스레드만 실행되도록 보장합니다.
해결책은 공유 자원에 접근하는 코드 주위에 SyncLock(또는 Monitor.Enter/Exit)을 사용하여, критическая секция을 실행하는 동안 객체를 잠그는 것입니다.
코드 예시:
Private Shared Counter As Integer = 0 Private Shared ReadOnly CounterLock As New Object() Public Shared Sub IncrementCounter() SyncLock CounterLock Counter += 1 End SyncLock End Sub
주요 특징:
SyncLock 내부에는 오직 하나의 스레드만 있을 수 있습니다.SyncLock은 잠금을 위한 참조 객체(Reference object)를 요구합니다.잠금 토큰으로 Integer, String 또는 Nothing을 사용할 수 있나요?
아니요, SyncLock은 참조(Reference) 객체를 요구합니다. 문자열은 권장되지 않으며, intern이 가능하여 암묵적인 잠금 충돌을 초래할 수 있습니다.
다른 스레드가 동일한 변수를 잠그기 위해 서로 다른 객체를 사용할 경우 어떻게 되나요?
동기화가 이루어지지 않으며, 스레드 경쟁이 발생합니다. 반드시 동일한 객체를 잠가야 합니다.
SyncLock 블록에서 나올 때 잠금을 수동으로 해제해야 하나요?
아닙니다, 블록을 벗어날 때 자동으로 잠금이 해제되며, 예외가 발생하더라도 마찬가지입니다.
SyncLock에 대해 ValueType 또는 String 객체를 사용코드에서 SyncLock에 대해 문자열을 사용하며, 프로그램의 여러 부분이 동일한 문자열 리터럴을 사용합니다. 결과적으로 서로 다른 잠금이 충돌하면서 예상치 못한 교착 상태(deadlock)가 발생합니다.
장점:
단점:
각 критическая секция에 대해 별도의 ReadOnly 객체를 선언합니다. 실제로 필요한 최소한의 코드만 잠급니다.
장점:
단점: