728x90 반응형 Technology/Effective Java 3E57 Item 80: 스레드보다는 실행자, 태스크, 스트림을 애용하라 java.util.concurrent 패키지 - 실행자 프레임워크(Executor Framework), java.util.concurrent 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html 작업 큐를 단 한 줄로 생성할 수 있다. ExecutorService exec = Executors.newSingleThreadExecutor(); 이 실행자에 실행할 태스크(task; 작업)를 넘기는 방법이다. exec.execute(runnable); 실행자를 우아하게 종료시키는 방법이다.. 2022. 2. 20. Item 79: 과도한 동기화는 피하라 과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 심지어 예측할 수 없는 동작을 낳기도 한다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안 된다. 예를 들어 동기화된 영역 안에서는 재정의할 수 있는 메서드는 호출하면 안 된다. 클라이언트가 넘겨준 함수 객체(아이템 24)를 호출하면 안 된다. 외계인 메서드(alien method), 메서드가 무슨 일을 할지 알지 못하며 통제할 수도 없다는 뜻이다. 외계인 메서드(alien method)가 하는 일에 따라 동기화된 영역은 예외를 일으키거나, 교착상태에 빠지거나, 데이터를 훼손할 수도 있다. 다음은 어떤 집합(Set)을 감싼 래퍼 클래스이고, 이 클래스의 클라이언트는 집합에 원소가 추가.. 2022. 2. 20. Item 78: 공유 중인 가변 데이터는 동기화해 사용하라 synchronized 키워드, 멀티 스레드 환경에서 동기화할 때 사용한다. 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다. 동기화의 2가지 기능: 배타적 실행 스레드 간 통신 배타적 실행, 한 스레드가 객체의 상태를 변경하는 중에는 객체의 상태가 일관되지 않은 순간이다. 이 순간의 객체를 다른 스레드가 보지 못하게 막는다. 한 객체가 일관된 상태를 가지고 생성되고, 객체에 접근하는 메서드는 객체에 락(lock)을 건다. 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정한다.(객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다.) 스레드 간 통신, 동기화 없이는 한 스레드가 만든 변화를 다른 스레드에서 확인하지 못할 수 있다. 동기화된 메서드나 블록에 들어간 스레드가 같은 락.. 2022. 2. 20. 11장 동시성 스레드는 여러 활동을 동시에 수행할 수 있게 해준다. 하지만 동시성 프로그래밍은 단일 스레드 프로그래밍보다 어렵다. 잘못될 수 있는 일이 늘어나고 문제를 재현하기도 어려워지기 때문이다. 그렇다고 동시성 프로그래밍으로부터 언제까지나 도망 다닐 수는 없다. 자바 플랫폼 자체에 내재되어 있을 뿐 아니라, 오늘날 어디서나 쓰이는 멀티코어 프로세서의 힘을 제대로 활용하려면 반드시 내 것으로 만들어야만 하는 기술이기 때문이다. 그래서 이번 장에는 동시성 프로그램을 명확하고 정확하게 만들고 잘 문서화하는 데 도움이 되는 조언들을 담았다. 2022. 2. 20. 이전 1 2 3 4 5 ··· 15 다음 728x90 반응형