https://www.geeksforgeeks.org/static-synchronization-in-java/
위 글을 번역한 내용입니다.
동기화는 공유 리소스에 대한 멀티 스레드의 액세스를 컨트롤 할 수 있는 가능성입니다.
Java에서 동기화는 스레드 간의 안정적인 통신에 필수적이며, 이를 위해 Java에선 synchronized 키워드를 사용합니다.
Important Points Regarding Synchronization
- Object level에 있는 메서드에만 해당됩니다.
- 메서드 또는 블록이 동기화된 경우 object-level 잠금이 필요합니다.
- 동기화는 deadlock 상태의 유일한 이유이기 때문에 Java에서 가장 위험한 단어입니다.
-
필요할 땐 동기화된 키워드를 사용하고 동기화된 블록도 한번 사용해 보십시오.
Static Synchronization
동기화된 메서드는 순서가 지정된 출력을 가져오는 동작이 원하는대로 동작하지 않을 수 있습니다.
클래스의 객체가 더 많을 경우 특정 인스턴스의 잠금만 획득합니다.
Synchronized을 유지하려면 정적 동기화로 달성할 수 있는 instance-level lock이 아닌 class-level lock이 필요합니다.
Static Synchronized 메소드는 두 개의 스레드가 synchronized 메소드에 대해 동시에 정적으로 작동할 수 없도록 Java에서 메소드를 동기화하는 메소드이기도 합니다. 유일한 차이점은 Static Synchronized를 사용하는 것입니다. 하나의 스레드만 메서드에서 작동하도록 class-level lock을 달성하고 있습니다. 스레드는 하나의 스레드만 정적 동기화 메서드에서 작동할 수 있도록 Java 클래스의 class level lock 을 획득합니다.
Syntax:
synchronized static return type class name{}
6개의 쓰레드가 있다고 가정하자. 실행 순서는 아래와 같다.
The complete declarations of methods are:
method1: public static synchronized void method1()
method2: public static synchronized void method2()
method3: public static void method3()
method4: public synchronized int method4()
method5: public String method5()
Threads and Classes
- 여기서 t1,t2… t6은 스레드 이름입니다.t1.method1()은 Manager 클래스의 클래스 수준 잠금을 획득하면서 실행을 시작합니다.
- t2.method2()는 실행 시작 시간을 기다립니다. 정적 동기화 메서드이므로 t1이 이미 클래스 수준 잠금을 획득했기 때문에 클래스 수준 잠금이 필요합니다. t2는 t1이 실행될 때까지 기다려야 합니다.
-
t3.method2()는 클래스 수준 잠금이 필요하므로 대기하므로 t1이 잠금을 해제할 때까지 기다려야 합니다.
- t4.method3()은 잠금이 필요 없는 정적 메서드이므로 실행을 시작합니다.
-
t5.method4()는 인스턴스 또는(일반) 수준의 동기화 메서드로 실행을 시작하고 개체 수준 잠금이 필요하므로 개체 수준 잠금을 얻습니다.
- t6.method5()는 인스턴스 메서드 또는 일반 메서드이므로 실행을 시작합니다.
Difference between Synchronized and Static Synchronized in Java
object-level lock. | class-level lock. |
메서드를 정적으로 선언할 필요는 없습니다.
|
해당 메서드는 정적으로 선언해야 합니다.
|
필요시 자주 사용됨 | 자주 사용 X |
각 개체에 대해 다른 인스턴스가 생성됩니다.
|
전체 프로그램에 대해 단 하나의 인스턴스입니다.
|
'자바' 카테고리의 다른 글
자바 / 추상클래스 vs 인터페이스 차이 (1) | 2022.11.08 |
---|---|
HttpServletRequestWrapper - RequestBody에 담긴 내용을 Interceptor에서 로그로 남겨보자. (0) | 2022.06.17 |
MapStruct와 Lombok을 함께 사용해보자. (2) | 2022.03.11 |
JEP draft: Virtual Threads 가상스레드 (0) | 2022.01.03 |
JAVA 설계 원칙 : SOLID 이해 (0) | 2021.09.29 |