2022-01-08

1/9 자바 병렬 프로그래밍 2

 - 스레드 안전성 확보 방법

1) 스레드 한정 : 

 -ThreadLocal 이용하기 . 

 - 스택한정(지역변수로만 사용)

2) 변경불가능한 객체로 만든다. 불변객체

- 모든 변수를 final로 선언

- 적절하게 초기화한다 ( 생성자에서 this를 노출하지 않는다. ) 

- 변경할수있는 메서드 제공x


* 값을 읽을때 -> 새로운 불변객체를 만들어 리턴한다

* 값을 변경할때 -> 새로운 불변객체를 만들어 리턴한다


읽을때와 변경할때 둘다 단일연산이 되어야한다

volatile은 변경하는 스레드가 한개일 경우에만 유효하게 된다

3) 동기화 한다.


- 올바르게 초기화해야한다. 쓰레기 혹은 잔여값이 들어있다. 자바의 경우 모든객체가 Object를 상속하므로 여기에 따른 쓰레기값이 들어있을수있다. 

- 어떤 객체의 상태 state 조합. 은 해당 객체가 가지고 있는 변수의 개수 * 그 변수의 상태범위.

- 불변객체의 경우 한번 넣은 변수값이 바뀌지 않으므로 상태범위가 1개이다. 따라서 올바른상태인지 올바르지 않은 상태인지 검증하기 매우쉬워진다

- 상태범위가 좁아질수록 올바르지 않은 상태인지 검증하기 쉽다

- 올바르지 않은 상태를 가질수있다면( 다른 스레드에 의해 값이 변경되거나. ) 반드시 단일연산처럼 동작하도록 동기화해야한다

- 만약 여러개의 변수를 통하여 객체의 상태를 정의한다면 그 여러개의 변수를 변경하는 과정 전체를 단일연산으로 동작하도록 만들어야 한다. 개개의 AtomicInteger는 단일연산을 지원하지만 그 각기 여러개를 변수로 가지고 있는 클래스라면 하나의 변수를 바꾸고 다른 변수를바꾸려는 과정에서 다른 스레드가 끼어들 수 있다는 것이다. 


- 객체의 상태는 해당 객체에 포함되는 모든 객체와 변수가 가질 수 있는 전체 상태의 부분집합이다. 

- 객체 자체의 암묵적인 락을 사용하여 동기화할 수도 있고, 락으로 활용하기 위한 private객체를 준비하여 락으로 사용할 수 있다. 

만약 이 객체를 외부에서 접근할수있는 수단을 제공한다면 함께 동기화 작업에 참여할수도있다. 

- 스레드 안전한 객체 : 복사본을 제공한다.

성능에 문제가 될수있다(매번 새로운 객체 생성) , 요구사항에 따라서는 적합하지 않을 수 있다. 시시각각으로 변하는 데이터를 받기를 원하는 경우. 

- 각각의 변수가 모두 스레드 안전한 클래스라고 할지라도 전체적으로는 스레드 안전성을 잃을 수 있다. 내부 변수간에 의존성을 가지고 있는 경우가 그러하다.

- 기능추가 : 1) 해당 라이브러리 직접수정 2) extends이용. 그러나 해당 라이브러리가 변경될경우 쥐도새도모르게 내 코드의 안전성이 파괴될 위험이 있다. 

3) 도우미 클래스작성 -> composition을 활용한다- 위험!

4) 도우미 클래스 작성, implements를 활용한다

댓글 없음:

댓글 쓰기

0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...