두 개의 스레드가 동일한 메모리 주소를 공유하는 경우 (하나의 스레드가 n 번 증가하고 하나의 스레드가 n 번 감소하는 경우) 0 이외의 최종 결과를 얻을 수 있다는 것을 보여주는 유사한 C# 프로그램이 있습니다. n이 적당히 크면, C#에서 [-n, n] 사이에 0이 아닌 값을 표시하는 것이 매우 쉽습니다. 그러나 스레드 수를 1000 (500 up, 500 down)으로 늘리는 경우에도 Java가 0이 아닌 결과를 생성하도록 할 수는 없습니다. 거기에 일부 메모리 모델 또는 사양 차이 wrt C#을 나는이 프로그램이 항상 스케줄링이나 코어의 수를 인식하지 못하는에도 불구하고 0을 보장한다는 것을 인식하지 못 하겠어? 우리가 실험적으로 증명할 수 없다하더라도이 프로그램이 0이 아닌 가치를 만들어 낼 수 있다는 데 동의합니까? 이 Java 프로그램이 제로 이외의 값을 인쇄 할 수 있습니까?
은 (하지 :, 나는 here 이상이 정확한 질문을 찾았지만, 내가 그 항목의 코드를 실행하면 나는 또한 제로를 얻을.)public class Counter
{
private int _counter = 0;
Counter() throws Exception
{
final int limit = Integer.MAX_VALUE;
Thread add = new Thread()
{
public void run()
{
for(int i = 0; i<limit; i++)
{
_counter++;
}
}
};
Thread sub = new Thread()
{
public void run()
{
for(int i = 0; i<limit; i++)
{
_counter--;
}
}
};
add.run();
sub.run();
add.join();
sub.join();
System.out.println(_counter);
}
public static void main(String[] args) throws Exception
{
new Counter();
}
}
난 당신이()'대신 실행'의 시작'호출 의미 추측()', 그렇지 않으면 당신은 전혀 추가 스레드가 없습니다. – Progman
가끔은 실제로 프로그램이 실행되는 동안 Java VM 내부에서 도대체 무슨 일이 벌어지고 있는지 이해하지 못합니다. JRE는 여러 가지 최적화를 수행하며,이 경우 최종 스레드 '병합'연산을 사용하여 모든 스레드의 정수에 할당 된 값의 일종의 캐싱 (예 : 변수를 '여러 복사본으로 생성') 또는 지옥 ... 아마 스레드는 '기본'스레드가 아닙니다. 플랫폼에 맞는 JRE 코드를 살펴 봐야합니다 :) – gd1
오, 이런 일반적인 시작은 혼란을 야기합니까? – gd1