[Java] synchronized block 이해하고 사용하기
·
Java
글을 읽기 전 자바의 모니터에 대한 지식이 없다면 필자의 다른 글 자바 객체의 Lock 과 Monitor 이해하기를 먼저 읽는 것을 추천드립니다.synchronized 개요[synchronized 키워드란?]synchronized 키워드는 자바에서 멀티스레드 환경에서 동기화를 보장하기 위해 사용된다. 특정 블록이나 메서드를 임계영역(critical section)으로 설정하여 하나의 스레드만 접근할 수 있도록 만들어 데이터 불일치 문제(race condition)를 방지하고, 여러 스레드가 공유 리소스를 안전하게 사용할 수 있도록 하는 것이 목적이다. [synchronized 는 어떻게 적용하는가?]메서드 전체를 감쌀지, 문장만 감쌀지, static 을 붙일지 말지 선택해서 적용할 수 있다. 메서드에 s..
[Java] 자바 객체의 Lock 과 Monitor 이해하기
·
Java
Java 객체의 Lock 이해하기[Lock 은 무엇이며 왜 필요한가?]락은 쓰레드 동기화(synchronization) 를 위해 필요하다.쓰레드 동기화: 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것프로세스가 싱글쓰레드인 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티쓰레드인 경우 여러 쓰레드가 같은 프로세스 내 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다. 예를 들어 쓰레드A 가 작업하던 공유데이터를 쓰레드B가 임의로 변경했다면, 쓰레드 A가 다시 제어권을 받아 나머지 작업을 마쳤을 때 원래 의도했던 결과와 다른 결과를 얻는 동기화문제가 발생한다. 이러한 일이 발생하는 것을 방지하기 위해 한 ..
[Java] Blocking Queue 이해하고 사용해보기
·
Java
Blocking Queue 이해하기[Blocking Queue 란?]Blocking Queue는 Thread-safe(스레드 안전)한 큐를 구현하기 위한 인터페이스다. Java5에서 java.util.concurrent 패키지에 추가되었다. 큐의 기본 작업에 블로킹을 추가해 큐가 가득 찼을 때 항목을 추가하려는 스레드나, 큐가 비었을 때 항목을 제거하려는 스레드를 대기 상태로 만든다. 블록킹은 특정 조건이 충족될 때까지 쓰레드를 일시 중지시키는 것으로, 연산이 완료될 때까지 쓰레드를 대기 상태로 만든다.큐가 비어있으면: 요소를 꺼내려는(Thread가 take()를 호출) 스레드는 큐에 요소가 추가될 때까지 대기한다.큐가 가득 차면: 요소를 추가하려는(Thread가 put()을 호출) 스레드는 큐에 여유 ..
[Java] Callable, Feature 이해 및 사용예시
·
Java
Callable 이해하기[Callable 은 왜 등장했는가?]자바에서 멀티스레딩을 사용할 때 가장 기본적인 방법은 Runnable 인터페이스를 활용하는 것이다. 그러나 Runnable 인터페이스는 다음과 같은 한계를 가지고 있다.반환값을 가질 수 없음: Runnable의 run() 메서드는 반환값이 없는 void 타입이다. 따라서 실행 결과를 얻으려면 별도의 공유 변수 또는 콜백을 사용해야 한다.예외 처리가 어려움: Runnable은 checked exception을 명시적으로 던질 수 없다. run() 메서드는 throws 절을 가질 수 없으며, 내부에서 발생한 예외는 잡아서 처리해야 한다.이러한 문제를 해결하기 위해 Java 5에서 Callable 인터페이스가 도입되었다. java.util.concu..
[Java] 열거형(Enum) 이해하고 사용하기
·
Java
enum 이란?enum은 JDK 1.5 부터 도입된 연관된 상수(Constant)들의 집합을 정의하는 특수한 클래스다. enum 에 미리 정의해둔 정해진 값만 사용하도록 강제함으로써 데이터 일관성이 확보되고 가독성,유지보수가 편리해진다. enum 은 싱글톤(Singleton)과 유사하게JVM에서 클래스 로딩 시 단 한번만 인스턴스되고 이후 동일한 객체를 재사용하므로 불필요한 인스턴스 생성이 일어나지 않는다. enum 을 사용하지 않는 방식의 문제점[문자열을 이용한 방식의 문제점]enum 을 사용하지 않고, 단순 문자열 비교를 이용해 회원등급에 따라 할인을 적용하는 메서드를 정의했다. public class MemberService { public int discount(String grade, in..
[Java] Thread, Runnable 이해하고 사용하기
·
Java
쓰레드와 멀티스레드 이해하기[단일쓰레드가 아닌 멀티쓰레드를 사용하는 이유]쓰레드는 프로세스(실행중인 프로그램)에서 하나의 실행 흐름으로 프로그램 실행의 가장 작은 단위다. Java 명령어를 사용해 클래스를 실행하면 JVM이 시작되며, 자바 프로세스가 생성된다. 이때, main() 메서드가 실행되면서 하나의 기본 스레드(메인 스레드)가 시작된다. 일반적으로 하나의 쓰레드만으로는 동시에 여러 작업을 하는데 제한이 있으므로, 긴 대기시간이 발생했을 때 기다리는 동안 다른 일을 처리할 수 없다. 따라서 이러한 문제를 해결하기 위해 하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 방식인  멀티쓰레드를 사용하해 CPU를 효율적으로 사용할 수 있다. 멀티쓰레드를 이용하면 쓰레드가 빠르게 번갈아가며 작업을 ..
자바의 정석 OOP(1)
·
Java
자바의 정석 객체지향(1) 부분을 읽고, 압축 정리한 글이다.객체지향 언어객체지향 언어의 주요 특징 3가지코드의 재사용성이 높다. : 새로운 코드를 작성할 때 기존의 코드를 이용해 쉽게 작성이 가능하다.코드의 관리가 용이하다. : 코드 간 관계를 이용해 적은 노력으로 쉽게 코드를 변경할 수 있다.신뢰성이 높은 프로그래밍을 가능하게 한다. : 제어자와 메서드를 이용해 데이터를 보호하고, 올바른 값을 유지하도록 하며 코드의 중복을 제거해 코드의 불일치로 인한 오동작을 방지한다.객체지향 개념은 아래 3가지를 생각하며 학습한다.재사용성유지보수중복 코드의 제거객체지향 개념을 이해했다 하더라도 객체지향적 장점들을 충분히 활용한 프로그램을 작성하기는 쉽지 않다.너무 객체지향 개념에 얽매여 고민하기보다는 프로그램을 기..