>source

동기화된 방법이나 잠긴 방법에서 'i++'를 수행하는 동안 무작위 결과를 얻는 이유가 너무 혼란스럽습니까?

public class aaa implements Runnable {
    static int count= 0;
    public static void main(String[] args) {
        aaa aaa= new aaa();
        aaa.create();
    }
    public void create() {
        ExecutorService executor= Executors.newFixedThreadPool(100);
        for (int i= 0; i < 1000; i++) {
            aaa thread= new aaa();
            executor.execute(thread);
        }
        executor.shutdown();
        while (true){
            if(executor.isTerminated()){
                System.out.println("a " + count);
           break;
            }
        }
    }
    @Override
    public void run() {
        this.test();
    }
    public void test() {
        Lock lock= new ReentrantLock();
        try {
            lock.lock();
            count++;
            System.out.println(count);
        } finally {
            lock.unlock();
        }
    }
}

또는:

public  synchronized void test() {
            count++;
            System.out.println(count);
        }

결과는 때때로 1000, 때로는 998, 999 ...등의 난수이며 'test' 메소드 내부의 인쇄는 순서가 아닙니다. 다음과 같습니다.

867
836
825
824
821
820
819
817
816
a 999

그러나 동기화된 블록에 있으면 모든 것이 좋아 보입니다.

public void test() {
        synchronized (aaa.class) {
            count++;
            System.out.println(count);
        }
    }

결과:

993
994
995
996
997
998
999
1000
a 1000

위의 모든 방법은 동일한 결과 1000을 제공해야 하고 자체 증분은 순서대로 이루어져야 하지만 마지막 방법만 작동해야 한다고 생각합니다. code에 무엇이 문제입니까? 도와주세요!!!

  • 이전 c++ : 다음 codeforces 솔루션이 다음 테스트 사례에서 오류를 표시하는 이유
  • 다음 python : 다중 곡선을 정량화하는 방법은 무엇입니까?