java 병렬 프로그래밍 실전-제2장-선정 안전성

java 병렬 프로그래밍 실전-제2장-선정 안전성
2. 스레드 보안
2.1 스레드 보안이란?
루틴 보안 클래스: 한 클래스가 여러 개의 루틴에 접근할 때 운행 환경에서 어떻게 스케줄링을 하든지 간에 이 루틴들이 어떻게 번갈아 집행되고 호출된 코드 부분에서 동기화나 협동이 필요하지 않습니다.이 클래스는 라인 보안 클래스입니다
 
    Thread-safe classes encapsulate any needed synchronization so that clients need not provide their own.
2.1.1. Example: A Stateless Servlet
    Stateless objects are always thread-safe.
       
    
2.2 원자성
상태가 있는 servlet에서 상태 변수count에 대해 다중 스레드 조건에서++count 이것은 원자성 조작이어야 한다
    The possibility of incorrect results in the presence of unlucky timing is so important in concurrent programming that it has a name: a race condition.
    
    
2.2.1 경쟁 조건
어떻게 발생합니까: 어떤 정확한 결과가 여러 라인의 교체 집행 시퀀스에 달려 있을 때 경쟁 조건이 발생합니다
본질: 효력을 잃을 수 있는 관찰 결과를 바탕으로 어떤 계산을 판단하거나 집행한다
가장 흔한 유형: 선검측 후 실행(check-then-act)(스타벅스 AB에서 친구를 만나는 예)
    
2.2.2 예: 초기화 지연 경쟁 조건
LazyInitRace가 응용 프로그램의 레지스트리에 적용되면 등록 정보를 잃어버리거나 같은 그룹의 등록 대상에 대해 일치하지 않는 보기를 보일 수 있습니다
 @NotThreadSafe
public class LazyInitRace {
   private ExpensiveObject instance = null;
 
   public ExpensiveObject getInstance() {
       if (instance == null)
           instance = new ExpensiveObject();
       return instance;
   }
}

잘못된 단례 (잘못된 디자인 모드)
 
위 경쟁 조건과 같이 A와 B 두 라인은 instance가 모두null인 것을 동시에 볼 수 있고 두 번의 방문은 서로 다른 instance 실례를 얻을 수 있습니다
 
 
UnsafeSequence가 영구화된 데이터에 적용되면 서로 다른 대상이 같은 id를 가지고 표지의 완전성 제약을 위반할 수 있습니다
@NotThreadSafe
public class UnsafeSequence {
   private int value;
 
   /** Returns a unique value. */
   public int getNext() {
       return value++;
   }
}
 
 
2.2.3 복합 작업
++count와 같이 이런'읽기-수정-쓰기'의 조작을 통칭하여 복합조작이라고 하는데 복합조작은 원자적이어야 한다.
1. 2.3의 잠금 메커니즘을 통해
2, 기존 스레드 보안 클래스 AtomicLong 사용
       Listing 2.4. Servlet that Counts Requests Using AtomicLong.
@ThreadSafe
public class CountingFactorizer implements Servlet {
   private final AtomicLong count = new AtomicLong(0);
 
   public long getCount() { return count.get(); }
 
   public void service(ServletRequest req, ServletResponse resp) {
       BigInteger i = extractFromRequest(req);
       BigInteger[] factors = factor(i);
       count.incrementAndGet();
       encodeIntoResponse(resp, factors);
   }
}
   
   
   Where practical, use existing thread-safe objects, like AtomicLong, to manage your class's state. It is simpler to reason about the possible states and state transitions for existing thread-safe objects than it is for arbitrary state variables, and this makes it easier to maintain and verify thread safety.
실제에서 가능한 한 기존의 라인 안전 클래스를 사용하여 클래스의 상태를 관리한다
   
 
2.3 잠금 메커니즘
    
예: UnsafeCachingFactorizer
    To preserve state consistency, update related state variables in a single atomic operation
상태의 일치성을 유지하기 위해서는 원자 작업에서 모든 관련 상태 변수를 업데이트해야 한다
    
2.3.1 내부 잠금 장치
java 내장 잠금 메커니즘 지원 원자성: the synchronized block
    these built-in locks are called intrinsic locks or monitor locks
    
2.3.2 리셋
어떤 라인에서 이미 가지고 있는 자물쇠를 얻을 수 있습니다
     
2.4 자물쇠로 상태 보호
모든 가변 상태는 같은 자물쇠로 보호해야 한다
모든 방법이 동기화되면 활성 문제와 성능 문제가 발생할 수 있다
2.5 활성 및 성능
network or console I/O, 자물쇠 갖지 마세요.
     
3. 대상의 공유
  
 
 
  
  

좋은 웹페이지 즐겨찾기