자바 Multi-Thread 환경에서의 개발

갱두·2021년 9월 28일
1

📚 Java

목록 보기
8/9

멀티 스레드를 고려하여 프로그래밍 안하면 엄청난 버그가 생길 수도 있음. 그래서 중요한 부분입니다 ~~

Field member

필드(field)란 클래스에 변수를 정의하는 공간을 의미한다.
이곳에 변수를 만들어두면 메소드끼리 변수를 주고 받는 데 있어서 참조하기 쉬우므로 편리한 공간 중에 하나임.

하지만 객체가 여러 스레드가 접근하는 싱글톤 객체라면 field 에서 상태값을 가지고 있으면 안됨. 모든 변수를 파라미터로 넘겨받고 return 하는 방식으로 코드를 구성해야 한다.

동기화(Synchronized)

자바에서는 Synchronized 키워드를 사용하여 스레드 간 race condition을 통제한다.
이 키워드를 기반으로 구현된 collection도 존재하지만 이 collection들은 제공하는 API가 적고 성능도 좋지 않다.
(✔️ List -> Vector / Map -> HashTable)

기본적으로는 Collections라는 util 클래스에서 제공되는 static 메소드를 통해 해결할 수 있음
✔️ Collections.synchronizedList(), Collections.synchronizedSet(), Collections.synchronizedMap() 등이 존재

JDK 1.7부터는 concurrent package를 통해 ConcurrentHashMap 이라는 구현체를 제공함. Collections.util 을 사용하는 것보다 synchronized 키워드가 적용된 범위가 좁아서 보다 좋은 성능을 낼 수 있는 자료구조임.

ThreadLocal

스레드 사이에 간섭이 없어야 하는 데이터에 사용
왜 ? 멀티스레드 환경에서는 클래스의 필드에 멤버를 추가할 수 없고 매개변수로 넘겨받아야 하기 때문이다.
즉, 스레드 내부의 싱글톤을 사용하기 위해 사용함. 주로 사용자 인증, 세션 정보, 트랜잭션 컨텍스트에 사용한다.

스레드 풀 환경에서 ThreadLocal을 사용하는 경우 ThreadLocal 변수에 보관된 데이터의 사용이 끝나면 반드시 해당 데이터를 삭제해 주어야 한다. 그렇지 않을 경우 재사용되는 스레드가 올바르지 않은 데이터를 참조할 수 있다.

ThreadLocal을 사용하는 방법은 간단하다.

  1. ThreadLocal 객체를 생성한다.
  2. ThreadLocal.set() 메소드를 이용해서 현재 스레드의 로컬 변수에 값을 저장한다.
  3. ThreadLocal.get() 메소드를 이용해서 현재 스레드의 로컬 변수 값을 읽어온다.
  4. ThreadLocal.remove() 메소드를 이용해서 현재 스레드의 로컬 변수 값을 삭제한다.

출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner

profile
👩🏻‍💻🔥

0개의 댓글