자바의 멀티스레드 환경과 동시성 이슈를 알아보기 위하여 몇 가지 개념을 정리해보고자 한다.
동시성 이슈
어떤 두 사건이 같은 시간에 일어날 때 동일한 데이터를 조작하기 때문에 예상했던 결과가 달라질 수 있는 상황이다. 개발에서 주의해야 흔하게 발생할 수 있는 이슈 중 하나가 바로 동시성 이슈다.
동시성(Cocurrency)
여러 작업이 동시에 발생하는 것처럼 보이기 위해 번갈아 가면서(Context Switching) 작업을 수행하는 것이 동시성이다. 겉에서 보기엔 여러 작업이 동시에 실행되고 있는 것처럼 보이지만 실제로는 빠른 시간에 하나씩 번갈아가면서 처리하고 있다. 따라서 동시성은 구현도, 디버깅도 어렵다.
동시성의 목적은 자원의 유휴 시간을 최소화하는 것이다. 컴퓨터가 작동 가능한 상황에서도 아무 작업도 수행하지 않는 상황을 유휴 시간이라 한다.
흔히 동시성은 싱글 코어 환경에서 발생하는 특징으로 오해할 수 있지만 이는 정확한 동시성의 특징이 아니다. 동시성은 싱글 코어뿐 아니라 멀티 코어에서도 발견되는 특징이며 핵심은 작업을 번갈아 가면서 수행하며 동시에 수행되는 것처럼 보이는 것이다.
병렬성(Parallelism)
실제로 독립적으로 동시에 작업을 수행하는 것이 병렬성이다. 동시성과 다르게 여러 작업을 다른 코어, 다른 프로세스, 또는 별도의 컴퓨터에서 동시에 실행할 때 나타나는 특징이다. 하드웨어의 성능향상을 위해 가져야 하는 필수적인 처리이다.
동시성과 병렬성이 자바에서 미치는 영향
멀티 스레드 환경을 지원하는 자바에서는 공유 자원에 동시에 여러 스레드가 접근할 때, 공유 자원이 변경되어 다른 스레드 작업에 영향을 미치고 원하는 결과를 만들어내지 못한다는 문제가 있다. 이것이 위에서 언급한 동시성 이슈이다.
동시성은 여러 Task가 번갈아 가면서 실행된다. 만약 Core1에서 Task 1이 사용하던 자원을 Task 1이 끝나기 전에 Task 2가 접근한다면 자원의 값이 변경되면서 원하는 결과를 만들어내지 못할 수 있다.
따라서 자바에서는 다양한 방식으로 동시성 이슈 해결을 노리고 있다. 그중 가장 대표적인 것이 ConcurrentHashMap이다.
/**
* A hash table supporting full concurrency of retrievals and
* high expected concurrency for updates. This class obeys the
* same functional specification as {@link java.util.Hashtable}, and
* includes versions of methods corresponding to each method of
* {@code Hashtable}. However, even though all operations are
* thread-safe, retrieval operations do <em>not</em> entail locking,
* and there is <em>not</em> any support for locking the entire table
* in a way that prevents all access. This class is fully
* interoperable with {@code Hashtable} in programs that rely on its
* thread safety but not on its synchronization details.
* ...
*/
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable {
...
}
주석문 일부를 번역해보면 다음과 같다.
💡 ConcurrentHashMap은 검색의 완전한 동시성과 업데이트에 대해 예상되는 높은 동시성을 지원하는 ‘해시 테이블’입니다. HashTable과 동일한 기능을 가지고 있습니다. 그러나 모든 작업이 Thread-safe하지는 않습니다. 검색 작업에서는 전체적인 락을 수행하지 않고 모든 액세스를 방지하는 방식으로 전체 테이블에 락을 거는 기능은 제공하지 않습니다.
'백엔드 개발자라면 대답해야 할 100가지 질문' 카테고리의 다른 글
16.데몬 스레드는 무엇인가요? (0) | 2023.09.01 |
---|---|
15. 스레드와 프로세스 (0) | 2023.08.31 |
13. Iterator의 자매품? Enumeration, ListIterator (0) | 2023.08.10 |
12. Iterator란 무엇인가? (0) | 2023.08.08 |
11. Queue에서 Poll()과 remove()의 차이점은 무엇인가요? (0) | 2023.08.07 |
댓글