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가 인터리빙하지 않습니까?
이 코드를 실행하면 데이터 유형에 관계없이 인터리빙을 볼 수 있습니다. –
printVal()은 인터프리터가 필요한지 여부를 확신 할 수 없을 정도로 빠르기 때문에 반복 횟수는 50 회입니다. 그것을 훨씬 더 만들고 나서 시도하십시오. – Ankit
System.nanoTime()을 사용하여 스레드가 작업을 수행하는 데 걸리는 시간을 확인합니다. 짧은 시간에 문맥 전환을 의미하는 것은 아닙니다. 스레딩 실험에 유용한 시간은 최소한 1 밀리 초에서 시작됩니다. –