programing

Java에서 클래스의 다른 인스턴스를 실행하는 스레드 간에 정적 변수를 동기화하려면 어떻게 해야 합니까?

sourcetip 2022. 9. 19. 22:51
반응형

Java에서 클래스의 다른 인스턴스를 실행하는 스레드 간에 정적 변수를 동기화하려면 어떻게 해야 합니까?

이 명령어를 사용하여synchronize키워드를 지정합니다.즉, 개체의 동일한 인스턴스를 실행하는 2개의 스레드가 동기화됩니다.

그러나 동기화가 개체 수준이기 때문에 개체의 서로 다른 인스턴스를 실행하는 2개의 스레드는 동기화되지 않습니다.Java 클래스에 메서드에 의해 호출되는 정적 변수가 있는 경우 클래스의 인스턴스 간에 동기화해야 합니다.2개의 인스턴스가 2개의 다른 스레드로 실행되고 있습니다.

다음과 같은 방법으로 동기화를 할 수 있습니까?

public class Test  
{  
   private static int count = 0;  
   private static final Object lock= new Object();    
   public synchronized void foo() 
  {  
      synchronized(lock)
     {  
         count++;  
     }  
  }  
}

우리가 어떤 대상을 정의했기 때문에lock이 키워드를 사용하고 있습니다.synchronized이 잠금의 경우 정적 변수count이제 클래스 인스턴스 간에 동기화됩니다.Test?

정적 변수에 대한 액세스를 동기화하는 방법은 여러 가지가 있습니다.

  1. 동기화된 스태틱 방식을 사용합니다.이것은 클래스 개체와 동기화됩니다.

    public class Test {
        private static int count = 0;
    
        public static synchronized void incrementCount() {
            count++;
        }
    } 
    
  2. 클래스 개체에서 명시적으로 동기화합니다.

    public class Test {
        private static int count = 0;
    
        public void incrementCount() {
            synchronized (Test.class) {
                count++;
            }
        }
    } 
    
  3. 다른 정적 개체로 동기화합니다.

    public class Test {
        private static int count = 0;
        private static final Object countLock = new Object();
    
        public void incrementCount() {
            synchronized (countLock) {
                count++;
            }
        }
    } 
    

방법 3은 잠금 개체가 클래스 외부에 노출되지 않기 때문에 대부분의 경우에 가장 좋습니다.

단순히 카운터를 공유하는 경우 automicInteger 또는 java.util.concurrent.atomic 패키지의 다른 적절한 클래스를 사용하는 것을 고려합니다.

public class Test {

    private final static AtomicInteger count = new AtomicInteger(0); 

    public void foo() {  
        count.incrementAndGet();
    }  
}

네, 사실입니다.

클래스의 인스턴스를 두 개 만드는 경우

Test t1 = new Test();
Test t2 = new Test();

다음으로 t1.foo와 t2.foo는 모두 같은 스태틱오브젝트에서 동기화되기 때문에 서로 차단됩니다.

ReentrantLock을 사용하여 정적 변수 동기화를 수행할 수도 있습니다.

public class Test {

    private static int count = 0;
    private static final ReentrantLock reentrantLock = new ReentrantLock(); 
    public void foo() {  
        reentrantLock.lock();
        count = count + 1;
        reentrantLock.unlock();
    }  
}

클래스 전체에서 코드를 동기화할 수 있습니다.그게 가장 간단할 거야.

   public class Test  
    {  
       private static int count = 0;  
       private static final Object lock= new Object();    
       public synchronized void foo() 
      {  
          synchronized(Test.class)
         {  
             count++;  
         }  
      }  
    }

이 답변이 유용하기를 바랍니다.

언급URL : https://stackoverflow.com/questions/2120248/how-to-synchronize-a-static-variable-among-threads-running-different-instances-o

반응형