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

  1. 여기서 t1,t2… t6은 스레드 이름입니다.t1.method1()은 Manager 클래스의 클래스 수준 잠금을 획득하면서 실행을 시작합니다.
  2. t2.method2()는 실행 시작 시간을 기다립니다. 정적 동기화 메서드이므로 t1이 이미 클래스 수준 잠금을 획득했기 때문에 클래스 수준 잠금이 필요합니다. t2는 t1이 실행될 때까지 기다려야 합니다.
  3. t3.method2()는 클래스 수준 잠금이 필요하므로 대기하므로 t1이 잠금을 해제할 때까지 기다려야 합니다.
  4. t4.method3()은 잠금이 필요 없는 정적 메서드이므로 실행을 시작합니다.
  5. t5.method4()는 인스턴스 또는(일반) 수준의 동기화 메서드로 실행을 시작하고 개체 수준 잠금이 필요하므로 개체 수준 잠금을 얻습니다.
  6. t6.method5()는 인스턴스 메서드 또는 일반 메서드이므로 실행을 시작합니다.

 

Difference between Synchronized and Static Synchronized in Java

object-level lock. class-level lock.
메서드를 정적으로 선언할 필요는 없습니다.
해당 메서드는 정적으로 선언해야 합니다.
필요시 자주 사용됨 자주 사용 X
각 개체에 대해 다른 인스턴스가 생성됩니다.
전체 프로그램에 대해 단 하나의 인스턴스입니다.

+ Recent posts