만약 코드가 여러 스레드가 동시에 실행되는 프로세스에 있다면, 동시에 코드를 실행하고 있을 수 있습니다. 각 실행 결과가 단일 스레드와 같고, 다른 변수들의 값이 예상과 같으면 스레드 안전입니다. 즉, 클래스나 프로그램이 제공하는 인터페이스는 스레드에 대해 원자적이며, 여러 스레드 간 전환이 인터페이스 실행 결과에 모호함을 발생시키지 않으므로 동기화를 고려할 필요가 없다는 뜻입니다. 스레드 안전 문제는 전역 변수와 정적 변수 모두에서 발생합니다. 각 스레드가 전역 변수와 정적 변수에 대한 읽기 연산만 있고 쓰기 연산이 없다면, 일반적으로 이 전역 변수는 스레드 안전합니다; 여러 스레드가 동시에 변수에 대해 읽기와 쓰기 작업을 수행할 경우, 일반적으로 스레드 동기화가 필요하며, 그렇지 않으면 스레드 보안에 영향을 줄 수 있습니다.
락의 목적은 다중 스레드 실행 시 동시 작업을 방지하는 것이며, 참조 유형의 잠금 객체는 잠긴 영역 내에서 한 번에 하나의 스레드만 작동할 수 있도록 허용합니다.
LOCK은 참조 타입 변수 하나만 잠글 수 있는데, 즉 주소 하나를 잠그는 것입니다
잠금 상태와 그렇지 않은 실행 결과는 다음과 같습니다:
잠금 후에는 i의 값이 하나씩 줄어들고, 점프나 반복 출력이 없으며, 0이 될 때까지 반복되지 않습니다;
잠금이 없다: i의 값 출력은 점프하며 불연속적으로 감소하며, -1 값 출력도 가질 수 있습니다;
이유: 락을 추가한 후에는 잠긴 영역에서 한 번에 한 스레드만 코드를 실행할 수 있고, 두 스레드가 순서대로 실행되므로 중단된 출력이 없습니다. |