본문 바로가기

전체 글129

[Java] Singleton 패턴 구현 예제 싱글톤 패턴클래스의 인스턴스가 반드시 딱 한 개만 생성됨을 보장하는 패턴- 클래스의 생성자를 private로 선언하여 외부에서 인스턴스를 생성하지 못하도록 방지함 -> 생성자가 private 이므로 상속이 불가능함- 클래스 내에 private static 변수로 자기 자신 클래스의 인스턴스를 가짐- 이 private static 변수를 리턴해주는 public static getInstance() 메소드를 가짐 * 이 포스팅에서는 Lazy 초기화를 이용한 예제만 다룬다. 필드 선언과 함께 초기화하는 것은 다루지 않음 첫 번째 예제 - Single Threaded Execution -> 문제 없음import java.util.Date; public class MySystem { private static M.. 2015. 1. 25.
[Java] Uncaught Exception Handler, Shutdown Hook 캐치되지 않는 예외의 핸들러 (Uncaught Exception Handler) 프로그램이 예외를 통보했을 때 그 예외를 캐치하는 try-catch절이 어디에도 적혀있지 않다고 하자. 이런 경우에는 일반적으로 쓰레드의 call stack을 표시하고 프로그램이 종료된다. Thread 클래스의 static 메소드인 setDefaultUncaughtExceptionHandler 메소드를 사용하면 캐치되지 않는 예외의 핸들러를 설정할 수 있다. 핸들러는 Thread.UncaughtExceptionHandler 인터페이스의 객체로서 표현하고, 실제 처리는 uncaughtException 메소드에 기술한다. 이렇게 핸들러를 설정하면 종료할 때 call stack이 표시되지 않고 프로그램이 종료된다. Shutdown.. 2015. 1. 19.
[Java] 인터럽트 상태와 InterruptedException의 상호 변환 인터럽트 상태와 InterruptedException의 상호 변환interrupt() 메소드를 호출하면 쓰레드에 인터럽트를 걸 수 있다. 이러한 행위는 다음 중 어느 하나의 결과를 낳는다.1) 쓰레드가 '인터럽트 상태'가 된다 -> '상태'에 반영2) InterruptedException이 통보된다 -> '제어'에 반영 일반적으로는 1)이 되지만, 쓰레드가 sleep/wait/join 하고 있는 경우에는 2)가 된다. (그리고 2의 경우에는 '인터럽트 상태'가 되지 않는다.) 그런데 이 1)과 2)는 상호 변환이 가능하다. 인터럽트 상태 -> InterruptedException으로 변환if (Thread.interrupted()) { throw new InterruptedException(); }- 이.. 2015. 1. 19.
[Java] 동기화 / synchronized, volatile, final 먼저, 동기화가 제대로 이루어지지 않아서 문제가 생기는 경우를 살펴보자. reorder - reorder란, 최적화를 위해 컴파일러나 JVM이 프로그램의 처리 순서를 바꾸는 것을 말한다. - 프로그램의 수행 능력을 높이기 위해 널리 사용되고 있지만, 그 사실을 프로그래머가 의식하기는 어렵다. 실제 싱글 쓰레드 프로그램에서는 reorder가 이뤄지고 있는지 판단할 수 없다. reorder시에 예기치 못한 작동을 막기 위한 제약이 따르기 때문이다. (사실 싱글 쓰레드 프로그램에서는 reorder로 인한 동시성 문제가 일어나지 않는다.) - 그러나 멀티 쓰레드 프로그램에서는 reorder가 원인이 되어 예기치 못한 작동을 하는 경우가 있다. class Something { private int x = 0; p.. 2015. 1. 19.
[Java] java.util.concurrent.CountDownLatch, java.util.concurrent.CyclicBarrier 클래스 java.util.concurrent.CountDownLatch 클래스, java.util.concurrent.CyclicBarrier 클래스는 여러개의 쓰레드를 동기시킬 때 사용하면 편리하다. java.util.concurrent.CountDownLatch 클래스 어떤 쓰레드가 지정한 쓰레드가 종료되기를 기다릴 때에는 java.lang.Thread 클래스의 join 메소드를 이용한다. 하지만 join 메소드로 기다리는 것이 가능한 것은 '쓰레드의 종료'라고 하는 단 한 번의 액션뿐이다. 따라서 '지정한 횟수만큼 어떠한 액션이 일어나는 것을 기다린다'라는 것은 불가능하다. java.util.concurrent.CountDownLatch 클래스를 사용하면 '지정한 횟수만큼 countdown 메소드가 호출되.. 2015. 1. 19.
[멀티쓰레드패턴] #5. Producer-Consumer 패턴 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Chapter 05 부분을 정리한 것이다. Producer-Consumer 패턴 - OS 수업에서 쓰레드를 배울 때 가장 먼저 접하게 되는 예제! 생산자-소비자 패턴 - 생산자쓰레드는 데이터를 작성하고, 소비자쓰레드는 데이터를 사용한다. 즉 생산자가 소비자에게 안전하게 데이터를 전달하는 것인데, 각각이 별개의 쓰레드로 동작함으로서 양쪽 처리속도에 차이가 있으면 문제가 생기게 된다. - 생산활동과 소비활동이 올바른 순서대로 일어날 수 있도록 양쪽 쓰레드간에 처리 속도의 차이를 메워주는 중개자가 필요하다. 구현 예제 시나리오 - 요리사(Class MakerThread)는 케익(String cake)을 만들어서 테이블(Class Ta.. 2015. 1. 17.
[멀티쓰레드패턴] #4. Balking 패턴 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Chapter 04 부분을 정리한 것이다. Balking 패턴 - balk : 중단하고 돌아가다- 어떤 처리를 할 때, 실행 직전에 가드조건을 확인하여 조건을 만족하지 않을 때에는 처리를 하지 않고 그냥 돌아가는 패턴 - 객체는 상태를 가지고 있는데, 상태가 적절할 때에만 처리를 실행하고 상태가 적절하ㄴ지 않으면 처리를 실행하지 않는다.1. 객체가 적절한 상태임을 가드조건으로 표현한다. 2. 처리하기 전에 가드조건을 만족하는지 테스트한다. (if문) 가드조건 테스트는 synchronized 메소드/블록 안에서 수행되어야 한다.3. 가드조건을 만족하는 경우에 한해 실행을 계속한다.4. 가드조건을 만족하지 않으면 처리를 실행하지 않.. 2015. 1. 10.
MySQL 쿼리를 오라클 쿼리로 변경하기 MySQL -> Oracle 데이터베이스 마이그레이션에 따른 쿼리 변경 작업진행했던 것들을 정리해본다. 1. FROM dual오라클에서는 SELECT 문에 FROM 절이 필수이므로, FROM 절이 필요 없는 쿼리에는 'FROM dual'을 붙여줌 2. 날짜 표기 함수 변경. 윗줄이 MySQL 표현이고 아랫줄이 오라클 표현이다. // 현재 시간 (년월일시분초)DATE_FORMAT(NOW(),'%Y%m%d%H%i%s')TO_CHAR(SYSDATE,'YYYYMMDDhh24miss') // 현재 시간 (년월일)DATE_FORMAT(NOW(),'%Y%m%d')TO_CHAR(SYSDATE,'YYYYMMDD') // 1초 후DATE_FORMAT(DATE_ADD(NOW() , INTERVAL + 1 SECOND),'%.. 2015. 1. 9.
[멀티쓰레드패턴] #3. Guarded Suspension 패턴 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Chapter 03 부분을 정리한 것이다. Guarded Suspension 패턴 - guarded : 보호받고 있는, suspension : 일시정지 - 지금 이 처리를 실행하면 안 될 때, 처리하기 직전에 쓰레드를 기다리게 하는 패턴. 쓰레드를 기다리게 하여 인스턴스의 안전성을 보호함. public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "[ Request " + na.. 2015. 1. 5.
[멀티쓰레드패턴] Collection과 멀티쓰레드 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Chapter 02 부분을 정리한 것이다. Collection과 멀티쓰레드 여러개의 인스턴스를 관리하는 인터페이스나 클래스를 총칭하여 컬렉션 이라고 한다.- java.util.List 인터페이스, java.util.ArrayList 클래스 등등..- 자바의 컬렉션은 대부분 thread-safety 하지 않다. 따라서 여러개의 쓰레드들이 동시에 컬렉션에 접근하는 경우에는 사용하고자 하는 컬렉션이 thread-safety 한지 아닌지 API 레퍼런스를 체크해볼 필요가 있다. 예제 1) thread-safety 하지 않은 java.util.ArrayList 클래스예제 2) Collections.synchronizedList 메소드에 .. 2015. 1. 4.
[멀티쓰레드패턴] #2. Immutable 패턴 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Chapter 02 부분을 정리한 것이다. Immutable 패턴 - immutable: 불변의, 변하는 것이 없는. - immutable 클래스: 인스턴스 생성 후에는 인스턴스의 상태가 절대 변하지 않는 클래스. public final class Person { // final 클래스이므로 상속 불가 // name, address는 final 필드이므로 setter 메소드 미존재, getter 메소드만 존재 // private 필드이므로 외부에서 접근 불가 private final String name; private final String address; // final 필드들의 값을 생성자에서 초기화 public Perso.. 2015. 1. 4.
[멀티쓰레드패턴] #1. Single Threaded Execution 패턴 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Chapter 01 부분을 정리한 것이다. Single Threaded Execution 패턴 (=Critical Section) - 좁은 다리를 한 번에 한 명만 건널 수 있는 것처럼, 어떤 영역에 한 번에 한 개의 쓰레드만이 처리를 실행할 수 있도록 제한을 둔 패턴. - Single Threaded Execution 패턴은 Critical Section 이라고도 불리는데, Single Treaded Execution은 실행하는 쓰레드(다리를 건너는 사람)에 초점을 맞춘 이름이고 Critical Section은 실행 영역 (한 명만 건널 수 있는 다리)에 주목한 이름이다. 참고사항 - 멀티쓰레드 프로그램에서, 오류를 검출하기 .. 2015. 1. 3.
순차(sequential) / 병렬(parallel) / 병행(concurrent) 처리방식 차이 순차 처리 / sequential 복수의 업무를 순서대로 하나씩 처리. 병렬 처리 / parallel 복수의 업무를 "동시에" 처리. 병행 처리 / concurrent 병렬에 비해 추상도가 높은 표현. 한 개의 업무를 어떠한 순서로 처리하든 상관 없는 여러 개의 작업으로 분할하여 처리. 작업자가 한 명이라면 분할된 작업들을 순차적으로 처리하게 되지만, 작업자가 두 명이라면 같은 작업을 병렬적으로 처리할 수 있다. 멀티쓰레드 프로그램에서의 처리 멀티쓰레드 프로그램의 경우 병행 처리를 의미한다. 만약 CPU가 한 개 뿐이라면 병행처리를 순차적으로 실행할 테고, CPU가 여러개라면 병행처리를 병렬적으로 실행할 수 있다. 일반 컴퓨터는 대개 CPU가 한개이므로 복수의 쓰레드가 작동하고 있다 하더라도 병행처리를 .. 2015. 1. 2.
멀티쓰레드 프로그램의 성능 평가 기준 #References: "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" Introduction 02 안정성 (safety) 안전성이란 객체를 망가뜨리지 않는 것. 올바른 프로그램의 필수 조건. - 객체가 망가진다는 것은, 객체가 설계자의 의도와는 다른 상태가 되는 것을 의미한다. 예를 들어, 객체의 필드가 예상 외의 값을 취하는 것 (마이너스 통장이 아닌...ㅋㅋ 계좌의 잔고가 마이너스가 된다던가.) - 여러개의 쓰레드가 이용해도 안정성이 유지되는 클래스를 thread-safety 클래스라고 한다. - 자바 클래스 라이브러리에는 thread-safety한 클래스와 그렇지 않는 클래스가 있으므로, 멀티쓰레드 프로그램에서 라이브러리를 사용할 때에는 API 레퍼런스를 확인하여 주의해야 한다. 예를.. 2015. 1. 2.
기본적인 쓰레드 제어 - sleep/ wait / notify / notifyAll 이 내용은 "Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편" 책의 Introduction 01 부분을 정리한 것이다. 쓰레드의 일시 정지 (sleep) public class Main { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.print("Good!"); try { // sleep() 메소드는 InterruptedException을 발생시킬 수 있음 Thread.sleep(1000); // 1000밀리초=1초동안 현재의 쓰레드를 일시정지함 } catch (InterruptedException e) { } } } } "Good!"을 출력한 뒤, sleep() 메소드 호출로 인하여 해당 쓰.. 2015. 1. 2.