온라인 거리 간에 신뢰할 수 있는 통신을 하기 위해서도, 상호 배척 방문을 위해서도 동기화가 필요하다.

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 수식자는 상호 배척 접근을 실행하지 않지만, 이 영역을 읽을 때 최근에 쓴 값을 볼 수 있도록 보장합니다.

좋은 웹페이지 즐겨찾기