온라인 거리 간에 신뢰할 수 있는 통신을 하기 위해서도, 상호 배척 방문을 위해서도 동기화가 필요하다.
4444 단어 동기
public class ThreadCommunication {
private static boolean stopRequested = false;
public static void main(String[] args) throws Exception
{
Thread backgroundThread = new Thread(new Runnable(){
public void run()
{
int i=0;
while(!stopRequested)
{
i++;
}
}
});
backgroundThread.start();
Thread.sleep(1000);
stopRequested = true;
}
}
이 프로그램이 1초 정도 실행되기를 기대할 수 있습니다. 다음 주 라인은stopRequested를true로 설정하여 백엔드 라인의 순환을 중단시킵니다. 그러나 필자의 기계에서 백엔드 프로그램은 주 라인에서stopRequested를true로 설정한 후에 종료하지 않았습니다. while 순환은 무한히 순환됩니다.문제는 동기화가 없으면 백엔드 라인이 언제 메인 라인이 stopRequested의 값에 대한 변화를 볼 수 있는지 보장할 수 없다는 것이다.동기화되지 않은 VM은 다음을 수행할 수 있습니다.
while(!done)
{
i++
}
최적화:
if(!done)
{
while(true)
{
i++;
}
}
내 기계에는 필자의 기계와 같은 현상이 나타나지 않았지만 인터넷을 검색해 보니 몇몇 학우들이 필자와 일치하는 현상이 나타났다고 한다.나 자신도 나중에 linux 환경에서 실험을 했지만 필자의 현상을 보지 못했다. 잠시 그만두고 이것이 사실이라고 믿었다.
이 문제를 수정하려면 두 가지 방법이 있습니다. 하나는 stopRequested 필드에 동기화하는 것입니다.
public class ThreadCommunication {
private static boolean stopRequested = false;
private static synchronized void requestStop()
{
stopRequested = true;
}
private static synchronized boolean stopRequested()
{
return stopRequested;
}
public static void main(String[] args) throws Exception
{
Thread backgroundThread = new Thread(new Runnable(){
public void run()
{
int i=0;
while(!stopRequested())
{
i++;
}
}
});
backgroundThread.start();
Thread.sleep(10);
requestStop();
}
}
두 번째 방법: stopRequested를volatile로 선언
private static volatile boolean stopRequested = false;
volatile 수식자는 상호 배척 접근을 실행하지 않지만, 이 영역을 읽을 때 최근에 쓴 값을 볼 수 있도록 보장합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
모던 자바스크립트 복습 #3React로 넘어가기 전에 빠르게 JavaScript를 복습해본다. 동기적 처리와 비동기적 처리에 대해 알아보자. 특정 함수가 끝난 다음에 어떤 작업을 처리하고 싶다면 callback함수를 파라미터로 전달해주면 된다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.