2017-03-22 3 views
-3

다음 코드를 실행하여 20000으로 계산할 것으로 예상합니다. 휘발성으로 계산했지만 예상 한 결과가 항상 올바르지 않습니다.휘발성과 동기화의 차이점

package threading; 

public class Demo5 { 
    private volatile int count =0; 
    public static void main(String[] args){ 
     Demo5 d = new Demo5(); 
     d.doWork(); 
    } 

    public void doWork(){ 
     Thread t1 = new Thread(new Runnable() { 
      public void run() { 
       for(int i=0; i<10000; i++){ 
        count++; 
       } 

      } 
     }); 
     Thread t2 = new Thread(new Runnable() { 
      public void run() { 
       for(int i=0; i<10000; i++){ 
        count++; 
       } 

      } 
     }); 
     t1.start(); 
     t2.start(); 

     try{ 
      t1.join(); 
      t2.join(); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(count+" is count"); 
    } 
} 

나중에 동기화 된 방법으로 동기화하여 카운트를 시도하고 올바르게 작동하고 있습니다.

public synchronized void increment(){ 
     count++; 
    } 

누군가가 우리가 휘발성이 될 때와 동기화해야 할 때를 말해 줄 수 있습니까?

+0

'count()'메서드는 무엇을합니까? –

+0

그건 오타입니다. 수정 됨. –

답변

1

synchronized을 사용하면 동일한 중요 섹션에 증가 및 설정 작업을 포함 시켰습니다. volatile을 사용하면 증가분과 세트가 별도로 보호됩니다. 즉, 한 스레드가 증가 할 수 있고 다른 스레드가 증가 할 수 있고, 다른 스레드가 설정 될 수 있으며 반드시 증가하는 동일한 순서가 아닌 다른 스레드가 설정 될 수 있음을 의미합니다. volatile은 단일 작업 만 조정할 수 있습니다. synchronized은 일련의 동작을 조정할 수 있습니다.

관련 문제