Java/Effective Java
-
[Effective Java] Item 81. wait와 notify보다는 동시성 유틸리티를 애용하라Java/Effective Java 2020. 11. 19. 00:02
동시성 컬렉션 (concurrent collection) 동시성 컬렉션은 List, Queue, Map 같은 표준 컬렉션 인터페이스에 동시성을 고려하여 구현한 고성능 컬렉션입니다. 높은 동시성에 도달하기 위해 동기화를 각자의 내부에서 수행합니다. 따라서 동시성 컬렉션에서 동시성을 무력화하는 건 불가능하며, 외부에서 락을 추가로 사용하면 오히려 속도가 느려집니다. 동시성 컬렉션에서 동시성을 무력화하지 못하므로 여러 메서드를 원자적으로 묶어 호출하는 일은 불가능합니다. 그래서 여러 기본 동작을 하나의 원자적 동작으로 묶는 '상태 의존적 수정' 메서드들이 추가되었습니다. 예를 들어 Map의 putIfAbsent(key, value) 메서드는 주어진 키에 매핑된 값이 아직 없을 때만 새 값을 넣고 null을 반..
-
[Effective Java] Item 80. 스레드보다는 실행자, 태스크, 스트림을 애용하라Java/Effective Java 2020. 11. 17. 00:07
java.util.concurrent 패키지 java.util.concurrent 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있습니다. 이를 이용하면 아래와 같이 간단하게 스레드 풀을 이용할 수 있습니다. import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(() -> System.out.prin..
-
[Effective Java] Item 79. 과도한 동기화는 피하라Java/Effective Java 2020. 11. 6. 00:24
과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 심지어 예측할 수 없는 동작을 낳기도 합니다. 응답 불가와 한전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에게 양도하면 안 됩니다. 예를 들어 동기화된 영역 안에서는 재정의할 수 있는 메서드를 호출하면 안 되며, 클라이언트가 넘겨준 함수 객체를 호출해서도 안됩니다. 동기화 블록 안에서 외부 메서드를 호출하는 잘못된 코드 import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; public class ObservableSet extends ForwardingSet { public Observ..
-
[Effective Java] Item 78. 공유중인 가변 데이터는 동기화해 사용하라Java/Effective Java 2020. 11. 4. 00:08
synchronized 키워드는 해당 메서드나 블록을 한 번에 한 스레드씩 수행하도록 동기화를 보장합니다. 동기화는 일관된 상태를 가진 객체에 접근하는 메서드가 그 객체에 락(lock)을 걸도록 하고, 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정하여 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시는 것입니다. 즉, 동기화를 이용하면 다른 스레드가 객체의 일관성이 깨진 상태를 볼 수 없게합니다. 적절히 동기화한 예제 코드 import java.util.concurrent.TimeUnit; public class StopThread { private static boolean stopRequested; private static synchronized void requestStop() {..