2013-04-23 3 views
2
public class Mutex { 

private int val; 
public Mutex(int val) { 

    this.val=val; 
} 

public int getVal() { 
    return val; 
} 

public void printVal() 
{ 
    int i=0; 
    while (true) 
    { 

     System.out.println(Thread.currentThread().getName()+" "+this.getVal()); 
     if(i==50) 
      break; 
     else 
      i++; 
    } 
} 

public static void main(String args[]) 
{ 
    final Mutex m1=new Mutex(1); 
    final Mutex m2 = new Mutex(2); 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() { 

      m1.printVal(); 

     } 
    },"THREAD-1").start(); 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() { 

      m2.printVal(); 

     } 
    },"THREAD-2").start(); 
} 


    } 

"val"유형이 "int"인 경우 THREAD-1과 THREAD-2는 인터리브하지 않지만 유형을 double로 변경하면 스레드가 인터리브됩니다. 프리미티브는 스레드로부터 안전하다는 것을 이해합니다 (long 및 double 제외). 위의 코드 샘플을 고려할 때 이것이 정확히 어떻게 작동합니까?왜 THREAD-1과 THREAD-2가 인터리빙하지 않습니까?

+1

이 코드를 실행하면 데이터 유형에 관계없이 인터리빙을 볼 수 있습니다. –

+0

printVal()은 인터프리터가 필요한지 여부를 확신 할 수 없을 정도로 빠르기 때문에 반복 횟수는 50 회입니다. 그것을 훨씬 더 만들고 나서 시도하십시오. – Ankit

+0

System.nanoTime()을 사용하여 스레드가 작업을 수행하는 데 걸리는 시간을 확인합니다. 짧은 시간에 문맥 전환을 의미하는 것은 아닙니다. 스레딩 실험에 유용한 시간은 최소한 1 밀리 초에서 시작됩니다. –

답변

4

50에서 1000000, 어쩌면으로 증가 시키시겠습니까?
스레드 1은 타임 슬롯이 끝나기 전에 실행이 완료되었으므로 컨텍스트 스위치가 없습니다.

또는 ... 반복 할 때마다 Thread.sleep을 추가하면 인터리브하는 것으로 나타납니다.

0

스레드는 가능한 한 독립적으로 실행되도록 설계되었습니다. 인터리브되도록 호출을 원하면 각 스레드를 하나의 스레드로 호출하는 루프를 사용합니다.

스레드를 제어 할 수 없다면 언제든지 스레드를 시작하고 중지 할 수 있다고 가정해야합니다. 성능상의 이유로 가장 작은 컨트롤 만 배치하는 것이 가장 좋으며 그렇지 않으면 스레드를 사용하는 지점 인 더 복잡하고 느리고 빠르지 않은 솔루션이 될 수 있습니다.

관련 문제