본문 바로가기

전체 글80

생산자-소비자 문제(2) - ReentrantLock 대기 synchronized 대기의 문제점은 스레드 대기집합이 하나이므로 원하는 스레드를 깨울 수 없고생산자->생산자 깨우거나, 소비자 -> 소비자 깨우면 비효율 발생한다. 하지만 ReentrantLock 클래스를 이용하면 스레드 대기집합을 여러개(생산자 / 소비자) 구분할 수 있다. Lock(ReentrantLock)는 Condition이라는 스레드 대기공간을 제공한다.private final Lock lock = new ReentrantLock();private final Condition producerCond = lock.newCondition();private final Condition consumerCond = lock.newCondition(); await() / signal()생산자를 넣을때 .. 2024. 10. 23.
생산자-소비자 문제(1) Synchronized 대기 생산자-소비자 문제는 멀티스레딩 환경에서 생산자가 데이터를 생성하고소비자가 이를 소비하는 과정에서 발생하는 전형적인 동기화 문제이다. 생산자가 소비할 수 있는 공간이 가득 찼을 때 혹은 소비자가 소비할 수 있는 공간에 아무것도 없을 때 대기하고,소비자가 데이터를 소비한 후 생산자가 데이터를 생성하거나 생산자가 데이터를 채운 후 소비자가 데이터를 사용할 수 있도록 하는 것입니다. wait() / notify()1. 생산자의 입장- 생산할 수 있는 데이터 큐가 가득 차면 wait()한다. 이때 생산자의 상태는 WAITING상태가 되고 스레드 대기 집합으로 들어가며 lock을 반납한다.- notify()가 호출되면 스레드 대기 집합에서 대기중인 스레드(소비자)를 깨워서 BLOCKED상태로 만든다.- 깨워진 스.. 2024. 10. 23.
자바 동기화 멀티스레딩 환경에서 여러 스레드가 동시에 공유 자원에 접근할 때 데이터의 일관성과 무결성을 보장하기 위해 필요하다. 동기화를 통해 한 스레드가 자원에 접근하는 동안 다른 스레드가 해당 자원에 접근하지 못하도록 막을 수 있다. Synchronized 블록/메서드synchronized 메서드를 사용하기 위해서는 synchronized키워드를 메서드 앞에 붙여주기만 하면 된다.public synchronized void synchronizedMethod() { // 동기화된 코드} 특정 코드에만 적용하려면 synchronized 키워드를 사용해 블록을 적용해도 된다.public void method() { synchronized (this) { // 동기화된 코드 }} 단점 :- .. 2024. 10. 23.
스레드 - 인터럽트 아래에 예시에서main스레드에서 runFlag의 값을 false로 줬지만 실행되고 있는 while문을 기다리고 다음 루프를 돌때 runFlag를 false인것을 확인하고 종료시킨다. (= 종료시기와 텀이 생김) public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task, "work"); thread.start(); sleep(4000); task.runFlag = false;}static class MyTask implements Runnable{ volatile boolean runFlag = true; @Override public voi.. 2024. 10. 18.
스레드 하나의 프로세스 내에서 실행되는 흐름의 단위를 말한다.한 프로그램은 하나의 스레드를 가지고 있고, 둘 이상의 스레드를 동시에 실행하는 경우 이 방식을 멀티스레드라고 한다. 스레드 생성스레드를 상속받는 방법과, Runnable 인터페이스를 구현하는 방법이 있다.Thread 클래스를 상속받으면 다른 클래스를 상속받지 못한다. 또한 Runnable을 구현하면 재사용성이 높고 코드의 일관성을 유지할 수 있으므로 더 객체지향적인 방법이다. public static void main(String[] args) {/*ABC abc = new ABC();Thread thread1 = new Thread(abc, "thread-1");*/Thread thread1 = new Thread(new ABC(), "thread.. 2024. 10. 18.
Comparable, Comparator 자바는 개발자가 복잡한 알고리즘을 신경쓰지 않고 정렬의 기준만 간단히 변경할 수 있도록 Comparable, Comparator 인터페이스를 통해 추상화 해 두었다. 객체의 정렬이 필요한 경우 Comparable을 통해 기본 자연 순서를 제공한다.public class MyUser implements Comparable{ @Override public int compareTo(MyUser o) { //원하는 정렬 기준 }} 자연 순서 외에 다른 정렬 기준이 추가로 필요하면 Comparator를 통해 새로 정의할 수도 있다.public class newComparator implements Comparator { @Override public int compare(MyUs.. 2024. 10. 11.