[Java] 고유 락(Intrinsic Lock)

[Java] 고유 락(Intrinsic Lock)

Intrinsic Lock / Synchronized Block / Reentrancy

자바의 모든 객체는 lock을 가지고 있다.

Synchronized 블록은 Intrinsic Lock을 이용하여 Thread의 접근을 제어한다. 별도로 lock 객체 생성 없이 구현 가능하다.

Reentrancy

재진입: Lock을 획득한 Thread가 같은 Lock을 얻기 위해 대기할 필요가 없는 것

ex> a 함수와 b 함수가 synchronized 함수일 경우, a 함수에 의해 lock을 획득했을 경우 바로 b를 호출 가능

=> Lock의 획득은 '호출 단위'가 아니라 'Thread 단위'로 일어난다.

Structured Lock vs. Reentrant Lock

Structured Lock (구조적 Lock): 고유 lock을 이용한 동기화

=> Synchronized 블록 단위로 lock의 획득/ 해제가 일어난다.

public class Reentrancy { // b가 Synchronized로 선언되어 있더라도, a 진입시 lock을 획득하였음. // b를 호출할 수 있게 됨. public synchronized void a() { System.out.println("a"); b(); } public synchronized void b() { System.out.println("b"); } public static void main (String[] args) { new Reentrancy().a(); } }

위와 같은 코드에서

A획득 -> B획득 -> B해제 -> A해제는 가능하지만,

A획득 -> B획득 -> A해제 -> B해제는 불가능하다.

이것을 가능하게 하기 위해서는 Reentrant Lock (명시적 Lock)을 사용해야 한다.

Visibility(가시성) & Atomicity(원자성)

Visibility : 메모리 가시성. Thread는 동작하는 시점에 하나의 CPU core를 점유하고 동작하는데, 공유하는 변수의 CPU cache값이 memory에 제때 쓰이지 않아 발생하는 문제를 해결하는 것.

=> Volatile로 변수를 선언하면, CPU에서 연산을 하면 바로 메모리에 write한다.

Structured Lock과 Reentrant Lock은 Visibility를 보장한다.

: 메모리 가시성. Thread는 동작하는 시점에 하나의 CPU core를 점유하고 동작하는데, 공유하는 변수의 CPU cache값이 memory에 제때 쓰이지 않아 발생하는 문제를 해결하는 것. => Volatile로 변수를 선언하면, CPU에서 연산을 하면 바로 메모리에 write한다. Structured Lock과 Reentrant Lock은 Visibility를 보장한다. Atomicity: 연산의 원자성. 공유되는 변수를 변경(read->modify->write)할 때, 기존의 값을 기반으로 하여 새로운 값이 결정되는 경우 여러 Thread가 이를 동시에 수행할 때 생기는 이슈

(https://velog.io/@syleemk/Java-Concurrent-Programming-%EA%B0%80%EC%8B%9C%EC%84%B1%EA%B3%BC-%EC%9B%90%EC%9E%90%EC%84%B1)

출처: https://gyoogle.dev/blog/computer-language/Java/Intrinsic%20Lock.html

from http://gokong.tistory.com/32 by ccl(A) rewrite - 2021-10-11 15:01:27