2013-04-28 5 views
0

(Java 동기화 문제) 내 제목으로 동기화 된 블록에서 정적 변수에 액세스 할 수 있습니까? 불일치가 발생합니까? 누구나 내게 단점이나 정적 변수 동기화 블록에 액세스하는 장점의 세부 사항을 말할 수 있습니까?동기화 된 블록에서 정적 변수에 액세스

+0

난 동기화 블록에서 정적 변수에 액세스 할 수 *? * .. 그보십시오. * 모순이 생길까요? * 왜 그렇게 생각하니? –

+0

정적 변수가있는 경우 해당 변수를 보유하는 객체의 정적 메소드를 통해 동기화를 수행하거나 해당 변수를 보유하는 객체의 클래스에서 동기화 된 동기화 된 블록을 사용하여 동기화를 실현해야합니다. – Mike

답변

3

동기화 된 블록에서 정적 변수에 액세스 할 수 있습니까?

예, 가능합니다.

불일치가 발생합니까?

정적은 JVM의 해당 클래스의 모든 인스턴스에서 공유됩니다. 공유 리소스는 스레드 안전하지 않음 .Hence 정적 변수는 스레드 안전하지 않습니다. 따라서 여러 스레드가 정적 변수에 액세스하려고하면 불일치가 발생할 수 있습니다.

정적 변수에 대한 액세스를 동기화하는 방법을 알고 있습니다.

  1. 정적 객체에서 동기화.

    public class SomeClass{ 
         private static int sum = 0; 
         private static final Object locker = new Object(); 
    
         public void increaseSum() { 
          synchronized (locker) { 
          sum++; 
         } 
        } 
        } 
    
  2. 동기화 된 정적 방법. 클래스 오브젝트에

    public class SomeClass { 
        private static int sum = 0; 
    
        public static synchronized void increaseSum() { 
        sum++; 
    } 
    } 
    
  3. 동기화는

    public class SomeClass { 
        private static int sum= 0; 
    
        public void increaseSum() { 
         synchronized (SomeClass .class) { 
         sum++; 
        } 
        } 
    } 
    
+0

정적 변수가 동일한 응용 프로그램의 다른 클래스에서 사용되는 공용 변수 인 경우 어떻게됩니까? 불일치가 있습니까? –

+1

물론 공통 변수를 수정/읽으려는 다른 클래스의 코드를 동시에 실행하는 스레드가 여러 개있는 경우 불일치가 발생할 가능성이 있습니다. – NINCOMPOOP

+0

위의 방법 중 하나를 사용하여 스레드 안전을 유지할 수 있습니까? –

관련 문제