You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
섹션 11. 동시성 컬렉션
1️⃣ 동시성 컬렉션이 필요한 이유1 - 시작
여기서는 멀티스레드를 사용하지 않지만, 스레드1과 스레드2가 동시에 다음 코드를 실행한다고 가정해보자.
컬렉션에 데이터를 추가하는
add()메서드를 생각해보면, 단순히 컬렉션에 데이터를 하나 추가하는 것뿐이다.따라서 이것은 마치 연산이 하나만 있는 원자적인 연산처럼 느껴진다. 원자적인 연산은 쪼갤 수 없기 때문에 멀티스레드 상황에 문제가 되지 않는다.
물론 멀티스레드는 중간에 스레드의 실행 순서가 변경될 수 있으므로
[A, B]또는,[B, A]로 데이터의 저장 순서는 변경될 수 있지만, 결과적으로 데이터는 모두 안전하게 저장될 것 같다.하지만 컬렉션 프레임워크가 제공하는 대부분의 연산은 원자적인 연산이 아니다.
✅ 컬렉션 직접 만들기
가장 간단한 컬렉션의 구현이다. 내부에서는 배열을 사용해서 데이터를 보관한다.
ArrayList 의 최소 구현 버전이라 생각하면 된다.
DEFAULT_CAPACITY : 최대 5의 데이터를 저장할 수 있다.
size : 저장한 데이터의 크기를 나타낸다
add(): 컬렉션에 데이터를 추가한다.sleep(100) : 잠시 대기한다. 이렇게 하면 멀티스레드 상황에 발생하는 문제를 확인하기 쉽다.
SimpleListMainV1
2️⃣ 동시성 컬렉션이 필요한 이유2 -동시성 문제
✅ 과정 1
스레드1, 스레드2가 elementData[size] = e 코드를 동시에 수행한다. 여기서는 스레드1이 약간 빠르게수행했다.
스레드1 수행: elementData[0] = A , elementData[0] 의 값은 A가 된다.
스레드2 수행: elementData[0] = B , elementData[0] 의 값은 A B가 된다.
결과적으로 elementData[0] 의 값은 B가 된다.
✅ 과정 2
스레드1, 스레드2가
sleep()에서 잠시 대기한다. 여기서sleep()을 사용한 이유는 동시성 문제를 쉽게 확인하기 위해서다.이 코드를 제거하면
size++이 너무 빨리 호출되기 때문에, 스레드1이add()메서드를 완전히 수행하고 나서 스레드2가add()메서드를 수행할 가능성이 높다.당연한 이야기지만 sleep() 코드를 제거해도 멀티스레드 동시성 문제는 여전히 발생할 수 있다. (확률의 차이이다.)
예를 들어서 sleep() 코드를 제거해도 다음과 같은 상황이 발생할 수 있다.
✅ 과정 3
➡️ 여기서는 2가지 상황이 발생할 수 있다.
size++코드를 동시에 수행한다. 여기서는 스레드1이 약간 빠르게 수행했다.size++,size의 값은 1이 된다.size++,size의 값은 1 2가 된다.size의 값은 2이 된다.스레드1, 스레드2가
size++코드를 동시에 수행한다. 여기서는 스레드1, 스레드2가 거의 동시에 실행되었다.스레드1 수행:
size = size + 1연산이다.size의 값을 읽는다. 0이다.스레드2 수행:
size = size + 1연산이다.size의 값을 읽는다. 0이다.스레드1 수행:
size = 0 + 1연산을 수행한다.스레드2 수행:
size = 0 + 1연산을 수행한다.스레드1 수행:
size = 1대입을 수행한다.스레드2 수행:
size = 1대입을 수행한다.결과적으로
size의 값은 1이 된다.Beta Was this translation helpful? Give feedback.
All reactions