Skip to content

Latest commit

 

History

History
33 lines (18 loc) · 1.75 KB

[#33] Java에서 dead lock이란 무엇인가요? .md

File metadata and controls

33 lines (18 loc) · 1.75 KB

Java에서 dead lock이란 무엇인가요?

Java의 교착 상태는 두개 이상의 스레드가 서로를 기다리면서 영원히 차단되는 상태를 의미합니다.

일반적으로 여러 스레드가 동일한 락을 필요로 하지만 다른 순서로 락을 얻을때 발생합니다.

자바에서 지원하는 synchronized 라는 키워드로 인해 자바의 멀티스레드 프로그래밍은 교착 상태에 빠집니다.

synchronized에 의해 실행중인 스레드는 사용하고자 하는 object의 락(혹은 모니터 락)을 기다리는 동안 차단됩니다.

Java에서 발생한 dead lock을 어떻게 피할 수 있을까요?

  1. 불필요한 락을 피해야 합니다.

락을 불필요하게 사용하면 교착 상태가 발생할 확률이 높습니다. 가능하면 락이 없는 데이터 구조를 사용하는 것이 좋습니다. 예를들어 synchronzied ArrayList 대신 ConcurrentLinkedQueue를 사용하는 것이 좋습니다.

  1. Nested Locks 을 피해야 합니다.

교착 상태를 방지하는 또 다른 방법은 이미 하나의 스레드에 락을 제공한 경우 여러 스레드에 락을 제공하지 않는 것입니다.

  1. Thread.join() 메서드를 사용합니다.

스레드가 완료될 때까지 기다려야 하는 경우, 항상 스레드가 완료될 때까지 기다릴 최대 시간을 설정하여 조인(join)을 사용합니다.

  1. lock에 순서를 부여합니다.

락에 숫자 값을 부여하여 더 높은 숫자의 락을 얻기 전에 더 낮은 숫자 값으로 락을 얻게 합니다.

  1. lock에 제한시간(time out) 을 부여합니다.

스레드가 락을 획득할 시간을 지정합니다. 스레드가 락을 획득하지 못하면 특정 시간을 기다리도록 합니다.