[Java] 41. 생산자 소비자 문제(2)
·
Java/멀티스레드&동시성
생산자 소비자 문제(2)#Java/멀티스레드정리이전 챕터에서 발견했던 생산자가 생산자를 깨우고, 소비자가 소비자를 깨우는 비효율 문제를 어떻게 해결해보자.해결 방안핵심은 생산자 스레드는 데이터를 생성하고, 대기중인 소비자 스레드에게 알려주어야 한다. 반대로 소비자 스레드는 데이터를 소비하고, 대기중인 생산자 스레드에게 알려주면 된다. 결국 생산자 스레드가 대기하는 대기 집합과, 소비자 스레드가 대기하는 대기 집합을 둘로 나누면 된다.대기 집합을 어떻게 분리할 수 있을까? 바로 앞서 학습한 Lock , ReentrantLock 을 사용하면 된다.먼저, synchronized , Object.wait() , Object.notify() 를 통해 작성한 코드를 Lock 인터페이스와 ReentrantLock 구..
[Java] 40. 생산자 소비자 문제(1)
·
Java/멀티스레드&동시성
생산자 소비자 문제(1)#Java/멀티스레드생산자 소비자 문제란?생산자 소비자 문제는 멀티스레드 프로그래밍에서 자주 등장하는 동시성 문제 중 하나로, 여러 스레드가 동시에 데이터를 생산하고 소비하는 상황을 다룬다. 아주 중요한 내용임!프린터 예제 - 그림기본 개념생산자(Producer): 데이터를 생성하는 역할을 한다. 예를 들어, 파일에서 데이터를 읽어오거나 네트워크에서 데이터를 받아오는 스레드가 생산자 역할을 할 수 있다.앞서 프린터 예제에서 사용자의 입력을 프린터 큐에 전달하는 스레드가 생산자의 역할이다.소비자(Consumer): 생성된 데이터를 사용하는 역할을 한다. 예를 들어, 데이터를 처리하거나 저장하는 스레드가 소비자 역할을 할 수 있다.앞서 프린터 예제에서 프린터 큐에 전달된 데이터를 받아..
[Java] 39. 고급 동기화 - concurrent.Lock
·
Java/멀티스레드&동시성
고급 동기화 - concurrent.Lock#Java/멀티스레드정리Synchronized의 단점synchronized 단점무한 대기: BLOCKED 상태의 스레드는 락이 풀릴 때 까지 무한 대기한다.특정 시간까지만 대기하는 타임아웃X중간에 인터럽트X공정성: 락이 돌아왔을 때 BLOCKED 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할 지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜기간 락을 획득하지 못할 수 있다.결국 더 유연하고, 더 세밀한 제어가 가능한 방법들이 필요하게 되었다.이런 문제를 해결하기 위해 자바 1.5부터 java.util.concurrent 라는 동시성 문제 해결을 위한 라이브러리 패키지가 추가된다.LockSupportjava.util.concurrent 라이브러리에는 수..
[Java] 38. 동기화 - synchronized
·
Java/멀티스레드&동시성
동기화 - synchronized#Java/멀티스레드정리멀티스레드를 사용할 때 가장 주의해야 할 점은, 같은 자원(리소스. ex) 인스턴스의 필드)에 여러 스레드가 동시에 접근할 때 발생하는 동시성 문제이다. (참고로 여러 스레드가 접근하는 자원을 공유 자원이라 한다. 대표적인 공유 자원은 인스턴스의 필드(멤버 변수)이다. )동시성 문제가 어떤 문제인지 이해하기 위해 간단한 은행 출금 예제를 하나 만들어보자.은행 출금 예제 - volatile 미적용package thread.sync;import static util.MyLogger.log;import static util.ThreadUtils.sleep;public class BankAccountV1 implements BankAccount { p..
[Java] 37. 메모리 가시성
·
Java/멀티스레드&동시성
메모리 가시성#Java/멀티스레드정리volatile과 메모리 가시성volatile 은 자바에서 예약된 키워드이다. (패키지 이름으로 사용할 수 없다). volatile 이 하는 역할은 무엇일까?이전 챕터에서 runFlag에 volatile 키워드를 사용했던 것을 기억할 것이다. 만약 여기서 volatile 키워드를 제거하면 어떻게 될까?public static void main(String[] args) { MyTask task = new MyTask(); Thread t = new Thread(task, "work"); // ...}static class MyTask implements Runnable { boolean runFlag = true; /..
[Java] 36. 스레드 제어와 생명 주기(2)
·
Java/멀티스레드&동시성
스레드 제어와 생명 주기(2)#Java/멀티스레드정리작업 중단 - 1. 변수특정 스레드의 작업을 중간에 중단하려면 어떻게 해야할까?public class ThreadStopMainV1 { public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task, "work"); thread.start(); sleep(4000); log("작업 중단 지시 runFlag=false"); task.runFlag = false; } static class MyTask implements Runnable { ..
[Java] 35. 스레드 제어와 생명 주기(1)
·
Java/멀티스레드&동시성
스레드 제어와 생명 주기(1)#Java/멀티스레드정리스레드 기본 정보Thread 클래스는 스레드를 생성하고 관리하는 기능을 제공한다. Thread 클래스가 제공하는 정보들을 직접 확인할 수 있다.0. 스레드 조회Thread mainThread = Thread.currentThread();현재 실행중인 스레드 객체를 가져온다.1. 스레드 생성스레드를 생성할 때는 실행할 Runnable 인터페이스의 구현체와, 스레드의 이름을 전달할 수 있다.Thread myThread = new Thread(new HelloRunnable(), "myThread");Runnable 인터페이스: 실행할 작업을 포함하는 인터페이스이다. HelloRunnable 클래스는 Runnable 인터페이스를 구현한 클래스이다.스레드 이..
[Java] 34. 스레드 생성과 실행
·
Java/멀티스레드&동시성
스레드 생성과 실행#Java/멀티스레드정리자바 메모리 구조 복습자바 메모리 구조스택 영역은 더 정확히는 각 스레드별로 하나의 실행 스택이 생성된다. 따라서 스레드 수 만큼 스택이 생성된다. 지금은 스레드를 1개만 사용하므로 스택도 하나이다. 이후 스레드를 추가할 것인데, 그러면 스택도 스레드 수 만큼 증가한다.스레드 생성자바에서 스레드는 어떻게 생성할까?스레드를 만들 때는 Thread 클래스를 상속 받는 방법과 Runnable 인터페이스를 구현하는 방법이 있다.스레드 생성 - Thread 상속자바가 예외를 객체로 다루듯이, 스레드도 객체로 다룬다. 스레드가 필요하면, 스레드 객체를 생성해서 사용하면 된다.package thread.start;public class HelloThread extends Th..
[Java] 33. 프로세스와 스레드
·
Java/멀티스레드&동시성
프로세스와 스레드#Java/멀티스레드멀티태스킹의 등장프로그램의 실행이란 프로그램을 구성하는 코드를 순서대로 CPU에서 연산(실행)하는 일이다.여기서 CPU 코어는 하나로 가정하므로, 한 번에 하나의 프로그램 코드만 실행할 수 있다.과거에는 한 번에 하나의 프로그램만 실행하여, 프로그램 하나가 끝난 뒤에 다른 프로그램을 실행할 수 있었다.이는 사용자에게 매우 큰 불편함을 초래한다.이를 해결하기 위해 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 '멀티태스킹' 기술이 등장했다.멀티태스킹만약 CPU가 매우 빠르게 두 프로그램의 코드를 번갈아 수행한다면, 사람이 느낄 때 두 프로그램이 동시에 실행되는 것처럼 느껴질 것이다. (대략 0.01초(10ms) 단위로 돌아가며 실행한다.)예를 들면, CPU 코어가..
[자료구조] 자바 Collection 총 정리(자료구조, Iterator, Iterable, Comparator, Comparable)
·
Java/Collection
컬렉션#Abstract/Java/Collection 인터페이스/List 자료 구조/ArrayList - 배열 리스트/연결리스트 - LinkedList/자바 List 인터페이스/자바 ArrayList/자바 LinkedList/Set/해시 알고리즘/자바의 hashCode()/자바 Set 인터페이스/Map 인터페이스/Stack - 사용 금지/Queue 인터페이스/Deque 인터페이스/Deque와 Stack, Queue/순회/Iterable, Iterator/자바가 제공하는 Iterable, Iterator/정렬 - Comparable, Comparator/컬렉션 유틸/Collection 인터페이스 정리Collection 인터페이스Collection 인터페이스는 java.util 패키지의 컬렉션 프레임워크의 핵..