JAVA(244)
-
[Java][Thread] 쓰레드의 동기화 #4 fork & join 프레임워크
fork & join 프레임워크 JDK 1.7 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어줍니다. 1. fork & join 프레임워크 종류 RecursiveAction 반환값이 없는 작업을 구현할 때 사용 RecursiveTask 반환값이 있는 작업을 구현할 때 사용 RecursiveAction 추상 클래스 형식 public abstract class RecursiveAction extends ForkJoinTask{ ... protected abstract void compute(); // 상속을 통해 이 메서드를 구현해야함 ... } RecursiveTask 추상 클래스 형식 public abstract class RecursiveTask extends Fork..
2022.07.05 -
[Java][Thread] 쓰레드의 동기화 #3 volatile
1. volatile의 필요성 멀티 코어 프로세서 환경에서 쓰레드를 사용하는 경우 각각의 코어에는 별도의 캐시를 가지고 있습니다. 그리고 쓰레드를 수행하는 CPU 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업을 수행합니다. 다시 같은 값을 읽어올 때는 먼저 캐시에 있는지 확인을 한 다음에 없을 때만 메모리에서 읽어오게 됩니다. 때문에 메모리에 저장된 변수의 값이 변경이 되었는데도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생합니다. 다음 예제는 쓰레드 3개의 이름을 출력하는 예제입니다. 주목할 점은 쓰레드 인스턴스의 메소드를 사용하지 않고 변수를 이용해서 중지했다가 다시 수행한다는 점입니다. public class Driver { public sta..
2022.07.05 -
[Java][Thread] 쓰레드의 동기화 #2 Lock과 Condition을 이용한 동기화
JDK에서 동기화할 수 있는 방법으로 synchronized 키워드를 제외한 "java.util.concurrent.locks" 패키지를 제공합니다. locks 클래스는 JDK 1.5 이후부터 제공합니다. 1. lock 클래스의 종류 ReentrantLock : 재진입이 가능한 lock, 가장 일반적인 배타 lock ReentrantReadWriteLock : 읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock : ReentrantReadWriteLock에 낙관적인 lock의 기능들을 추가 StampedLock 클래스는 JDK 1.8부터 추가됨 Lock 인터페이스를 구현하지 않음 ReentrantLock 클래스 특정 조건에서 lock을 풀고 나중에 다시 lock을 얻고 임계영역으로 들어..
2022.07.05 -
[Java][Thread] 쓰레드의 동기화 #1 synchronized, wait, notify
동기화(synchronization)의 필요성 멀티쓰레드 프로세스의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게됩니다. 예를 들어 쓰레드 A가 balance 변수의 값에서 -5000을 더하여 0으로 만들려는 작업을 수행할 때 쓰레드 B가 제어권을 가져서 먼저 0으로 만든다면 쓰레드 A가 다시 제어권을 찾을때 0에서 -5000을 더하여 balance 변수는 -5000이 될 것입니다. 이는 통잔 잔액이 0원 밑으로는 있을 수 없기에 잘못된 상황입니다. 위와 같은 상황을 방지하기 위해서는 어떤 한 쓰레드가 같은 프로세스 내의 공유 자원에 접근하여 작업을 마치기 전까지는 다른 쓰레드는 접근할 수 없도록 해야 합니다. 이러한 것을 쓰레드의 동기화라고 합니다. ..
2022.07.01 -
[Java][Thread] 쓰레드의 실행 제어
쓰레드의 스케줄링과 관련된 메서드 메서드 설명 static void sleep(long millis) static void sleep(long millis, int nanos) 지정된 시간동안 쓰레드를 일시정지시킴. 지정한 시간이 지나고 나면, 자동적으로 다시 실행대기상태가 됨 void join() void join(long millis) void join(long millis, int nanos) 지정된 시간동안 쓰레드가 실행되도록 합니다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속합니다. void interrupt() sleep()이나 join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기상태로 만듭니다. 해당 쓰레드에서는 InterruptedE..
2022.06.30 -
[Java][Thread] 데몬 쓰레드(daemon thread)
1. 데몬 쓰레드는 무엇인가? 데몬 쓰레드는 다른 일반 쓰레드(데몬 쓰레드가 아닌 쓰레드)의 작업을 돕는 보조적인 역할을 수행하는 쓰레드입니다. 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료됩니다. 대표적인 데몬 쓰레드로는 가비지 컬렉터, 워드프로세서의 자동저장, 화면 자동갱신 등이 존재합니다. 데몬 쓰레드의 특징 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 종료됨 데몬 쓰레드는 무한루프와 조건문을 이용해서 실행후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기함 데몬 쓰레드를 생성하기 위해서는 쓰레드를 생성한 다음 setDaemon(true)를 호출하여 생성함 데몬 쓰레드가 생성한 쓰레드는 자동적으로 데몬 쓰레드가 됨 데몬 쓰레드 관련 메서드 boolean i..
2022.06.30