일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 리사이클러뷰
- 플로이드워셜
- Android
- DiffUtil
- appcompatacitivity
- flutter
- http 역사
- recyclerview
- 디자인 패턴
- 절대 주소
- NestedScrollView
- http발전과정
- apk 빌드 과정
- GetX
- Kotlin
- 데코레이터 패턴
- 운영체제
- Dispatchers
- appcompatactivity
- 상태관리
- viewModelScope
- 안드로이드
- 리사이클러뷰풀
- AsyncListDiffer
- 물리 메모리
- 뷰홀더
- 내부 단편화
- 프로세스
- 자이고트
- AAC
- Today
- Total
hong's android
[Java] 동시성 문제와 synchronized의 성능 본문
동시성 문제
멀티 스레드 환경에서 같은 자원을 사용할 때 예상했던 값과 다르게 결괏값을 가져오는 경우가 있다. 동시성 문제들의 종류는 가시성 문제와 원자성 문제가 있다.
1) 가시성 문제
캐시와 메모리의 불일치로 생기는 문제이다. 예를들어, 한 스레드가 데이터를 가져오는 캐시가 메모리와 동기화되어있지 않다면 다른 결과 값을 가질 수 있다.
2) 원자성 문제
원자성 문제는 cpu의 instruction을 수행하는 과정에서 다른 cpu의 스레드가 그 사이에 해당 값에 접근을해서 값을 바꾸게 되는것이다.
이렇게 되면 연산을 원자 단위로 나누지 못한다.
위 가시성 문제를 해결한다고 원자성 문제도 해결되지 않는다. 예를 들어 메모리가 동기화되어있다고 가정하고 A 스레드가 공유 자원 int value에 +1을 할 때 B 스레드가 먼저 +1을 한 후 메모리에 적재했다고 생각하자 총 +2가 되어야 하는데 결국 A스레드가 값을 덮어씌워서 value는 +1 밖에 되지 않는다.
동시성 문제를 해결하기위한 방법은 Synchronized, Volatile, Atomic 이 있다.
1.Synchronized
Lock을 이용한 스레드 동기화 방식, 메서드나 블록형태로 Synchronized를 지정을 하게 되면 다른 스레드들이 접근할 때 스레드의 상태가 바뀐다.
Synchronized 블록에 들어가기전 캐시와 메모리를 동기화하면서 원자성 문제를 해결하였다.
*Synchronized의 성능
Synchronized는 스레드를 Blocking(스레드 제어권 소유권을 줌) 하므로 한 스레드만 접근할 수 있다. 그렇기 때문에 멀티 스레드를 사용하는 경우 대기 상태의 스레드가 생기고 Synchronized를 선언한 모든 코드들을 blocking 하게 된다. 그래서 한 부분만 block으로 설정해서 사용할 수 있다. 또한 Synchronized 블록에 들어가기 전 캐시와 메모리를 동기화하는 작업을 하기 때문에 비교적 성능에 영향을 미치게 된다.
2.Volatile
캐시와 메모리를 동기화 시켜준다. 하지만 원자성 문제는 해결하지 못한다.
3.Atomic
non-blocking, cas알고리즘으로 원자성 문제를 해결한다. 캐시와 메모리의 값이 불 일치하면 값을 변경하지 않고 다시 메모리에서 값을 가져와서 값을 변경한다. 그러니까 값을 계산할 때 한번 더 가져온 값을 확인하는 과정을 거친다.
'Develop > Java' 카테고리의 다른 글
[Java] java.lang.Object (0) | 2023.02.11 |
---|---|
[Java] Collection Framework (0) | 2023.02.11 |
[Java] 제네릭, 래퍼 클래스 (0) | 2023.02.11 |
[Java] Synchronized (1) | 2023.02.11 |
[Java] 리플렉션 (0) | 2023.01.16 |