JavaRush /Java Blog /Random-KO /스레드 동기화, 객체 잠금 및 클래스 잠금
CynepHy6
레벨 34
Великий Новгород

스레드 동기화, 객체 잠금 및 클래스 잠금

Random-KO 그룹에 게시되었습니다
스레드 동기화, 객체 잠금 및 클래스 잠금 - 1동기화는 멀티스레딩을 의미합니다. 동기화된 코드 블록은 한 번에 하나의 스레드에서만 실행될 수 있습니다. Java는 실행을 위해 다중 스레드를 지원합니다. 이로 인해 두 개 이상의 스레드가 동일한 필드나 개체에 액세스할 수 있습니다. 동기화는 프로그램의 모든 병렬 스레드가 동기적으로 실행되도록 하는 프로세스입니다. 동기화는 공유 메모리에 대한 일관성 없는 액세스로 인해 발생하는 메모리 일관성 오류를 방지합니다. 메소드가 동기화됨으로 선언되면 스레드는 메소드가 실행 중인 객체에 대한 모니터를 보유합니다. 다른 스레드가 동기화된 메서드를 실행 중인 경우 해당 스레드는 다른 스레드가 모니터를 해제할 때까지 차단됩니다. 동기화는 예약어를 사용하여 Java에서 수행됩니다 synchronized. 동기화된 메서드나 블록을 정의하여 클래스에서 사용할 수 있습니다. synchronized클래스 정의의 변수나 속성에는 사용할 수 없습니다 .

객체 수준 잠금

이는 하나의 스레드만 클래스의 지정된 인스턴스에서 지정된 블록이나 메서드를 실행할 수 있도록 비정적 메서드 또는 비정적 코드 블록을 동기화하는 메커니즘입니다. 인스턴스 수준 데이터 스레드를 안전하게 만들어야 할 때마다 이 작업을 수행해야 합니다. 예:
public class DemoClass{
    public synchronized void demoMethod(){}
}
또는
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
또는
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

클래스 수준 잠금

클래스의 사용 가능한 인스턴스에서 실행하는 동안 여러 스레드가 동기화된 블록에 진입하는 것을 방지합니다. 즉, 프로그램을 실행하는 동안 클래스의 인스턴스가 100개라면 어떤 DemoClass경우든 해당 시점에 단 하나의 스레드만 실행할 수 demoMethod()있으며 다른 모든 경우는 다른 스레드에 대해 차단됩니다. 이는 정적 데이터 스레드를 안전하게 만들어야 할 때 필요합니다.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
또는
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
또는
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

몇 가지 중요한 참고 사항

  1. Java의 동기화는 두 스레드가 동시에 또는 병렬로 동기화된 메소드를 실행할 수 없도록 보장합니다.

  2. synchronized메소드 및 코드 블록에만 사용할 수 있습니다. 이러한 메서드나 블록은 정적이거나 비정적일 수 있습니다.

  3. 스레드가 동기화된 메서드나 블록에 들어갈 때마다 잠금을 획득하고 스레드가 동기화된 메서드나 블록을 종료할 때마다 JVM이 잠금을 해제합니다. 오류나 예외로 인해 스레드가 완료 후 동기화된 메서드를 벗어나더라도 잠금이 해제됩니다.

  4. synchronizedJava에서 이는 동기화된 메서드가 동일한 잠금이 필요한 다른 동기화된 메서드를 호출하는 경우 잠금을 보유하는 현재 스레드가 잠금을 획득하지 않고도 해당 메서드에 들어갈 수 있음을 의미합니다.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION