문제

Java 튜토리얼은 다음과 같이 말합니다.

이것이 정적 방법의 의미는 무엇입니까? 정적 메소드에는 관련 객체가 없으므로 객체 대신 클래스에서 동기화 된 키워드가 잠겨 있습니까?

도움이 되었습니까?

해결책

정적 방법에는 관련 객체가 없기 때문에 동기화 된 키워드가 객체 대신 클래스에서 잠겨 있습니까?

예. :)

다른 팁

Oscar의 (유쾌한 간결한!) 답변에 약간의 세부 사항을 추가하기 위해 Java 언어 사양의 관련 섹션은 다음과 같습니다. 8.4.3.6, '동기화 된 방법':

동기화 된 메소드는 실행하기 전에 모니터 (§17.1)를 획득합니다. 클래스 (static) 메소드의 경우 메소드 클래스의 클래스 객체와 관련된 모니터가 사용됩니다. 인스턴스 방법의 경우, 이와 관련된 모니터 (메소드가 호출 된 객체)가 사용됩니다.

한 가지 요점에 대해 조심해야 할 사항 (일부 프로그래머는 일반적으로 그 트랩에 속합니다) 동기화 된 정적 메소드와 동기화 된 비 정적 메소드 사이에는 링크가 없다는 것입니다.

class A {
    static synchronized f() {...}
    synchronized g() {...}
}

기본:

A a = new A();

스레드 1 :

A.f();

스레드 2 :

a.g();

F () 및 g ()는 서로 동기화되지 않으므로 완전히 동시에 실행할 수 있습니다.

다음과 같이 g ()를 구현하지 않는 한 :

g() {
    synchronized(getClass()) {
        ...
    }
}

이 패턴은 객체의 다른 인스턴스간에 상호 배제를 구현하고 싶을 때도 유용하다고 생각합니다 (예를 들어 외부 리소스를 악화시킬 때 필요합니다).

Oracle Documentation 페이지를 살펴보십시오 본질적인 잠금 및 동기화

정적 메소드가 객체가 아닌 클래스와 관련되기 때문에 정적 동기화 된 메소드가 호출 될 때 어떤 일이 발생하는지 궁금 할 것입니다. 이 경우 스레드는 클래스와 관련된 클래스 객체의 고유 잠금을 획득합니다.. 따라서 클래스의 정적 필드에 대한 액세스는 클래스의 모든 인스턴스에 대한 잠금 장치와는 별개의 잠금으로 제어됩니다..

정적 방법에는 관련 객체도 있습니다. JDK 툴킷의 class.class 파일에 속합니다. .class 파일이 RAM에로드되면 class.class는 템플릿 개체라는 인스턴스를 만듭니다.

예 :- 기존 고객 클래스에서 객체를 만들려고 할 때

Customer c = new Customer();

고객. 클래스로드 RAM. 그 순간 Class.class의 JDK 툴킷에서 클래스 템플릿 객체라는 객체를 생성하고 해당 템플릿 개체에 클래스를로드합니다.

그래서 정적 메소드 또는 속성에는 객체도 있습니다.

아래 예제는 클래스와 객체 잠금 사이의 명확성을 더 많이 제공합니다. 아래의 희망 아래 예제는 다른 사람들도 도움이 될 것입니다 :)

예를 들어 아래 방법이 있습니다.

public class MultiThread {

    public static synchronized void staticLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public synchronized void objLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

이제 우리는 다음과 같은 시나리오를 가질 수 있습니다.

  1. 스레드가 사용하는 경우 같은 객체 접근하려고합니다 objLock 또는 staticLock 동시에 방법 (즉, 두 스레드가 동일한 메소드에 액세스하려고합니다)

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  2. 스레드가 사용하는 경우 같은 객체 접근하려고합니다 staticLock 그리고 objLock 동시에 방법 (다른 방법에 액세스하려고 시도)

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    
  3. 스레드가 사용하는 경우 다른 대상 접근하려고합니다 staticLock 방법

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  4. 스레드가 사용하는 경우 다른 대상 접근하려고합니다 objLock 방법

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    

친숙하지 않은 정적 동기화 된 메소드가 클래스 객체에 잠겨있는 사람의 경우 문자열 클래스에 대한 객체에 고정 된 문자열 클래스 .class 인스턴스 동기화 된 메소드가 Java의 "this"키워드로 표시된 객체의 현재 인스턴스에 잠겨 있습니다. 이 두 객체가 다르기 때문에 잠금이 다르므로 하나의 스레드가 정적 동기화 된 메소드를 실행하는 동안 Java의 다른 스레드는 해당 스레드가 돌아올 때까지 기다릴 필요가 없습니다. 정적 동기화 된 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top