자바 병발 중의 원자 성과 가시 성 실례 상세 설명

자바 병발 중의 원자 성과 가시 성 실례 상세 설명
병발 은 사실 결합 을 푸 는 전략 으로 우리 가 무엇 을 하 는 지(목표)와 언제 하 는 지(시기)를 분리 하 는 데 도움 을 준다.이렇게 하면 응용 프로그램의 스루풋(더 많은 CPU 스케줄 링 시간 획득)과 구 조 를 뚜렷하게 개선 할 수 있다.자바 웹 개발 을 한 사람 은 자바 웹 의 Servlet 프로그램 이 Servlet 용기 의 지원 하에 단일 인 스 턴 스 다 중 스 레 드 작업 모드 를 사용 하여 Servlet 용기 가 병발 문 제 를 처리 한 것 을 잘 알 고 있 습 니 다.
원자 성
원 자 는 세계 에서 가장 작은 단위 로 불가 분 성 을 가지 고 있다.예 를 들 어 a=0;(a.long 과 double 형식 이 아 닌)이 조작 은 분리 할 수 없습니다.그러면 우 리 는 이 조작 을 할 때 원자 조작 이 라 고 말 합 니 다.예 를 들 어 a++;이 조작 은 실제 a=a+1 입 니 다.분할 이 가능 하기 때문에 그 는 원자 조작 이 아니다.비원 자 조작 은 모두 라인 안전 문제 가 존재 하기 때문에 동기 화 기술(sychronized)을 사용 하여 그것 을 원자 조작 으로 만들어 야 한다.하나의 조작 은 원자 조작 이다.그러면 우 리 는 그것 이 원자 성 을 가지 고 있다 고 부른다.자바 의 concurrent 패키지 아래 원자 류 를 제공 합 니 다.우 리 는 API 를 읽 어서 이러한 원자 류 의 용법 을 알 수 있 습 니 다.예 를 들 어 AtomicInteger,AtomicLong,AtomicReference 등 이다.
가시 성
가시 성 이란 라인 간 의 가시 성 을 가리 키 며,한 라인 이 수 정 된 상 태 는 다른 라인 에 대해 볼 수 있다.스 레 드 수정 결과 입 니 다.다른 스 레 드 는 곧 볼 수 있 습 니 다.예 를 들 어 volatile 로 장 식 된 변 수 는 가시 성 을 가진다.volatile 수식 변 수 는 스 레 드 내부 캐 시 와 정렬 을 허용 하지 않 습 니 다.즉,메모 리 를 직접 수정 하 는 것 입 니 다.그래서 다른 스 레 드 는 볼 수 있 습 니 다.그러나 여기 서 주의해 야 할 문 제 는 volatile 이 그 에 게 수 정 된 내용 만 가시 성 을 가지 게 할 수 있 을 뿐 원자 성 을 가지 고 있다 는 것 을 보장 할 수 없다 는 것 이다.예 를 들 어 volatile int a=0;그 다음 에 a++동작 이 있 습 니 다.이 변수 a 는 가시 성 을 가지 지만 a++는 여전히 비원 자 조작 이 고 이 조작 에 도 라인 안전 문제 가 존재 한다.
그들 사이 의 관계
원자 성 은 하나의 조작 이 분할 가능 한 지 를 말 하 는 것 이다.가시 성 은 조작 결과 의 다른 라인 이 보 이 는 지 여부 다.그 러 고 보 니 그들 은 사실 아무런 관계 가 없다.
실례

package com.chu.test.thread; 
/** 
 *       
 * @author Administrator 
 * 
 *volatile                  。            。volatile       ,       。 
 *         
 */ 
public class Test { 
 
 volatile int a = 1; 
 volatile boolean ready; 
  
 public class PrintA extends Thread{ 
  @Override 
  public void run() { 
   while(!ready){ 
    Thread.yield(); 
   } 
   System.out.println(a); 
  } 
 } 
 public static void main(String[] args) throws InterruptedException { 
  Test t = new Test(); 
  t.new PrintA().start(); 
  //        volatile  ,             。            ,                      。 
  t.a = 48; //        ,             。  volatile        。 
  t.ready = true;//   
 } 
 
} 
위의 프로그램 이 만약 변수 a 가 volatile 수식 을 사용 하지 않 는 다 면 출력 결 과 는 0 일 가능성 이 높다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기