java - 线程同步为什么不一样
ringa_lee
ringa_lee 2017-04-18 10:54:18
0
1
469

package com.dome;

public class Thread01 {

private volatile  static int a =10;
Thread td1 = new Thread(){
    
    public void run(){
        
        for(int i=0;i<3;i++){
            
                a = a+1;
            
            System.out.println(i+"td1:="+a);
        }
        
    }
    
};

Thread td2 = new Thread(){
    public void run(){
        
        for(int i=0;i<3;i++){
            a -=1;
            System.out.println(i+"td2:="+a);
        }
    }
    
};


public static void main(String[] args) {
    Thread01 th = new Thread01();
    th.td1.start();
    
    th.td2.start();
    
}

}

0td1:=9
0td2:=9
1td1:=10
1td2:=9
2td1:=10
2td2:=9

ringa_lee
ringa_lee

ringa_lee

모든 응답(1)
迷茫

a = a + 1a = a - 1과 같은 문에는 실제로 세 가지 작업이 포함됩니다. 읽기-수정-쓰기:

  1. 스택의 특정 위치로 변수 읽기

  2. 스택의 이 위치에 있는 값에 1을 더(빼기)

  3. 증분된 값을 변수에 해당하는 저장 위치에 다시 씁니다

따라서 변수 a가 volatile으로 수정되더라도 위의 세 가지 작업에 관련된 a = a + 1a = a - 1이 원자적으로 만들어지지는 않습니다. 동기화를 보장하려면 synchronized:

을 사용해야 합니다. 으아아아

특정 작업의 결과:

(td1이 나타나는 경우 a는 +1이고, td2가 나타나는 경우 a는 -1입니다.)

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!