본문 바로가기
JAVA

Intrinsic Lock

by orioncsy 2023. 4. 6.

고유락

개념

고유 락

  • Java의 모든 객체는 각자 고유한 lock을 가지고 있다.
  • synchronized 블록은 고유 락을 통해 스레드 접근 제한

Synchronized 블록

  • synchronized(객체){ … } 를 통해 블록 생성 가능
  • public synchronized int 처럼 접근제어자 뒤에 붙여 객체를 생성할 필요 없이 블록 생성 가능

재진입 가능성(Reentrancy)

  • lock을 획득한 thread가 lock을 얻기 위해 대기할 필요가 없는 상태
  • lock을 획득하는 것은 호출 단위가 아니라 스레드 단위이다.
  • 하나의 스레드가 synchronized로 선언된 메서드에 접근하고 그 안에 또 다른 synchronized로 선언된 메서드를 호출하는 상황에서 스레드가 lock을 가지고 있기 때문에 호출이 가능

종류

Structured Lock

  • 고유 lock을 통한 동기화를 구조적인 lock이라고 한다.
  • synchronized 블록으로 구현

Reentrant Lock

  • 명시적인 lock으로 Reentrant lock 객체를 생성하여 lock을 직접적으로 지정할 수 있다.

가시성

개념

  • 동시성 프로그램 이슈 중의 하나로 가시성 문제가 존재
  • 하나의 스레드가 쓴 값을 다른 스레드가 볼 수도 있고 아닐 수도 있다면 가시성 문제가 발생
    • 하나의 스레드가 값을 쓸 때 원자적 연산이 아닌 경우에는 다른 스레드가 도중에 값을 가져오면 dirty read가 되기 때문에 문제 발생
    • 원자적 연산이란 하나의 작업으로 이루어지는 경우를 의미
    • count++ 처럼 값을 읽고 수정하고 다시 값을 저장하는 3가지 작업이 이루어져 여러 thread가 공유 자원으로 접근하는 경우는 원자적 연산이 아니다.
  • lock을 사용하면 동시성 문제를 해결할 수 있다.

Reference

http://happinessoncode.com/2017/10/04/java-intrinsic-lock/

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

'JAVA' 카테고리의 다른 글

String  (0) 2023.04.17
Call by value & reference  (0) 2023.04.07
Casting  (0) 2023.04.04
Wrapper Class  (0) 2023.04.02
Stream  (0) 2023.03.30