자바 128

규칙 69 - wait나 notify 대신 병행성 유틸리티를 이용하라.

멀티 쓰레드 환경에서 wait와 notify를 사용할 경우에 주의가 필요하다. 하지만 그것을 효율적으로 사용하기에는 많은 어려움이 따른다. 그렇기 위해서 wait와 notify를 정확하게 사용하기 위해서는 high-level util(고수준 유틸리티)을 사용해야 한다.이런 고수준 유틸리티들은 Executor, Concurrent Colloection, Synchronizer를 통해 사용할 수 있다.그중 Conncurrent Collenction (병행 컬렉션)에 대해 알아보자. 대부분에 컬렉션 Map, List, Queue등은 병행 컬렉션을 제공한다. 병행성 컬렉션대표적으로 Map에서 제공하는 ConcurrentMap이다. 그중 putIfAbsent(key, value) 메서드가 대표적이다. 이 메서드는..

JAVA/Effective Java 2018.06.13 (1)

규칙 68 - 스레드보다는 실행자와 태스크를 이용하라.

여러 쓰레드를 실행해야할 때, 큐에 넣고 작업을 진행하거나 할 수 있으면 더욱 효율적으로 관리 할 수있다. 그래서 자바 1.5부터 자바 플랫폼에는 java.util.concurrent가 추가되었다. 이 패키지에는 Executor Framework가 들어 있는데 이는 인터페이스 기반 task 실행 프레임워크이다. 해당 Executor를 실행하기 위해서는 다음과 같이 입력하면 된다.1234567ExecutorService executor = Executors.newSingleThreadExecutor(); executor. @Override public void run() { System.out.println("test"); }});Colored by Color Scriptercs 그리고 만약 executo..

JAVA/Effective Java 2018.06.13

규칙 67 - 과도한 동기화는 피하라

동기화 시에 너무 많은 동기화 블록을 사용할 경우에 데드락이 걸리거나 성능저하 등등 문제를 일으킬 수 있는 소지들이 몇 가지 있다. 특히 동기화 영역안에서 수행되는 작업의 양을 가능한 줄여야 한다. 자바에서는 동기화에 대한 비용처리가 그나마 잘되어있지만 잘 사용해야 하는 이유는 잘못된 동기화 사용은 각 쓰레드들의 메인 메모리 접근에 대한 지연시간을 늘릴 수 있기 때문에 비용이 증가할 수 있다. 또한 클래스 내에서 동기화를 수행하는 것이 외부에서 객체 호출 시 사용하는것 보다 높은 병행성을 달성 할 수 있을 때문 진행해야한다. 다시말하자면 필요할 때 해당 메서드등을 호출하여 동기화를 실행해야지 해당 메서드 자체를 동기화 하는것은 좋지 않다. 예를 들면 기존에는 StringBuffer를 사용하여 내부적으로 ..

JAVA/Effective Java 2018.06.10

규칙 66 - 변경 가능 공유 데이터에 대한 접근은 동기화하라.

우리는 동시에 사용이 가능한 객체에 대해서 synchronized키워드를 사용하여 락을 걸어 코드 블록을 한번에 하나의 스레드만 접근할 수 있도록 한다. 이런 동기화를 적절하게 사용하면 모든 메서드가 항상 객체의 일관된 상태만 바라보도록 할 수 있다. 하지만 동기화 없이는 한 스레드가 만든 변화를 다른 스레드가 확인할 수 없다. 동기화는 스레드가 일관성이 깨진 객체를 관측할 수 없도록 할 뿐 아니라, 동기화 메서드나 동기화 블록에 진입한 스레드가 동일한 락의 보호 아래 이루어진 변경의 영향을 관측할 수 있도록 보장한다. 그렇기 때문에 특정 객체의 값을 다른 쓰레드가 읽기를 원한다면 동기화를 무조건 진행해야한다.즉, 변경 가능한 공유 데이터에 대한 접근을 동기화 해야한다. 다음 예를 보자.123456789..

JAVA/Effective Java 2018.06.10

규칙 65 - 예외를 무시하지마라.

사용하려고 하는 API의 설계자가 예외가 발생될 수 있다고 명시한 예외는 조심해야한다. 무시방법은 간단하게 호출하는 메서드를 빈 catch 블록이 붙은 try 문으로 감싸면, 예외를 무시할 수있다. 12345try { } catch (Exception ex) { }cs 빈 catch 블록은 예외를 선언한 목적으로 만들어진다.만약 이렇게 빈 catch 블록을 만들려고 하는 경우에는 적어도 왜 넘겼는지 주석을 달아주는 것이 좋다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙65

JAVA/Effective Java 2018.06.06

Java List 인터페이스 중 CopyOnWriteArrayList 소개

자바에는 크게 4개의 List 인터페이스를 구현한 클래스가 있다. - Vector, ArrayList, LinkedList, CopyOnWriteArrayList 그 중 가장 생소한 이름이 있는데 CopyOnWriteArrayList이다. CopyOnWriteArrayList는 그냥 ArrayList랑 다르길래 화려한 이름을 가지고 있는걸까? ArrayList vs CopyOnWriteArrayList 일반 ArrayList의 경우 스레드에 안전하게 설게되어 있지 않기때문에 만약 스레드 처리가 필요한 List의 경우에 Vector를 사용하거나 ArrayList에 synchroized를 사용하여 처리하였다. 하지만 자바 1.5부터 있던 CopyOnWriteArrayList를 쉽게 이문제를 해결할 수 있다...

JAVA/JAVA 관련 2018.06.03

Deque를 통해 버킷정렬(Bucket Sort)을 해보자.

저번시간에 만들었던 Deque를 사용하여 버킷정렬을 연습해보기로 했다. 우선 버킷정렬이 무엇인지 알아보자. 버킷정렬(Bucket Sort) 이란?? n개의 데이터를 정렬할 때 같은 크기의 간격을 갖는 n개의 버켓에 데이터를 분배한다. 입력 데이터가 균일하게 분포되었다면 각 버켓에는 1개의 데이터가 있게 되지만, 균일하게 분포되지 않으면 다수의 데이터가 버켓에 들어 갈 수 있으며 각 버켓의 데이터는 정렬하여 저장한다. n개의 모든 데이터를 버켓에 분배하였다면 버켓 번호 순으로 스캔하여 출력하면 정렬된 데이터를 얻게 된다. [예제] 최대 2자리를 갖는 정수 (0부터 99까지의 정수) 10개를 버켓 정렬한다고 하자. 각 버켓은 같은 크기의 간격 (0-9, 10-19, 20-29,…, 90-99)을 갖는 10개..

IT 지식/자료구조 2018.06.02 (1)

규칙 63 - 어떤 오류인지를 드러내는 정보를 상세한 메시지에 담으라.

개발을 진행하다보면 예기치 못한 상황에서 에러가 자주 발생한다. 에러가 발생하는 것을 다 알고 차단할수있다면 정말 바람직한 프로그램이라고 할 수있을 것이다.하지만 그럴수가 없기때문에 에러를 관리하고 효율적으로 에러정보를 전달하는것이 중요하다. 정확한 에러정보를 전달하는것이 빠르게 문제를 해결하는 실마리가 될것이다.그래서 에러가 발생되었을 때 오류의 상세 메시지에 예외에 관련된 모든 인자와 필드값을 포함시켜야 한다. 예를 들어, IndexOutOfBounds Exception의 경우 해당 범위를 벗어난 인자값과 하한과 상한값도 포함되어있어야 한다. 그러면 정확히 어떻게 오류가 발생된 것인지 알기가 쉬워진다. 하지만 관련된 데이터를 담는 것이 중요하지만 잘못사용하면 별로 도움이 되지 않을 수 있다.그리고 이..

JAVA/Effective Java 2018.06.01

규칙 62 - 메서드에서 던져지는 모든 예외에 대해 문서를 남겨라.

메서드를 올바르게 사용하려면 메서드에서 던져지는 예외에 대한 설명이 문서에 있어야 한다. 그리고 메서드가 던질수있는 모든 무점검 예외까지 선언할 필요는 없지만 점검지점 예외들과 마찬가지로주의해서 문서로 남겨놓으면 좋다. 특히 Javadoc @throws 태그를 사용해서 메서드에서 발생 가능한 모든 무점검 예외에 대한 문서를 남겨야 한다. 하지만 메서드 선언부의 throws 뒤에 무점검 예외를 나열하지는 말아야 한다. 요약하자면 메서드가 던질 가능성이 있는 모든 예외를 문서로 남겨라. 점검지점 예외, 무점검 예외도 남겨라. 이를 지키지 않으면 해당 API를 사용하는 다른사람들이 효과적으로 사용하는게 어려워진다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(201..

JAVA/Effective Java 2018.06.01