전체 글 341

Future

Future 를 사용하면 Runnable 이 아닌 Callable 을 사용할 수 있어 값을 리턴 받을 수 있고 submit() 으로 BlockingQueue에 해야할 작업들을 담아 놓고 스레드 풀에서 스레드들이 하나씩 접근해서 처리한다. submit() 은 블로킹 상태가 아니며 get()을 호출해야 블로킹 상태가 되므로 이때 작업이 실행 된다. 이처럼 미래에 실행할걸 정해두고 나중에 실행을 하게 되면 하나의 작업마다 블로킹이 되지 않기 때문에 메인 스레드가 작업해야 할것들 여러개를 미리 처리 해둘 수 있어서 좋다.코드 예시package thread.excutor.future;import java.util.concurrent.*;import static thread.util.MyLogger.log;publ..

자바기초 2025.07.02

원자적 연산 CAS

원자적 연산이란 i = i + 1 같은 여러 스레드가 연산 시킬 수 있는 게 아니라 i = 1 같이 완벽히 하나만 연산할 수 있는 것이다. 이런 방식은 여러 스레드가 접근해도 값이 변하지 않는다. 자바는 원자적 연산을 제공한다.아래 예시는 AtomicInteger와 AtomicBoolean 사용 예시 이다.package thread.cas.increment;import java.util.concurrent.atomic.AtomicInteger;public class MyAtomicInteger implements IncrementInteger { AtomicInteger atomicInteger = new AtomicInteger(0); @Override public synchronize..

자바기초 2025.07.01

Object - wait, notify

Object.wait()- 현재 스레드가 가진 락을 반납하고 대기 한다.- 현재 스레드를 대기 상태로 전환한다. 이 메서드는 현재 스레드가 synchronized 블록이나 메서드에서 락을 소유하고 있을 때만 호출할 수 있다. 호출한 스레드는 락을 반납하고 다른 스레드가 해당 락을 획득할 수 있도록 한다. 이렇게 대기 상태로 전환된 스레드는 다른 스레드가 notify() 또는 notifyAll() 을 호출할 때까지 대기 상태를 유지한다. Object.notify()- 대기 중인 스레드 중 하나를 깨운다.- 이 메서드는 synchronized 블록이나 메서드에서 호출 되어야 한다. 깨운 스레드는 락을 다시 획득할 기회를 얻게 된다. 만약 대기 중인 스레드가 여러 개라면 그 중 하나만이 깨워지게 된다. Ob..

자바기초 2025.06.30

Object.notify() vs Condition.signal()

Object.notify()- 대기 중인 스레드 중 임의의 하나를 선택해서 깨운다. 스레드가 깨어나는 순서는 정의되어 있지 않으며 JVM 구현에 따라 다르다. 보통 먼저 들어온 스레드가 먼저 수행 되지만 구현에 따라 다를 수 있다.- synchronized 블록 내에서 모니터 락을 가지고 있는 스레드가 호출해야 한다. 즉 Object.notify() 를 사용하려면 synchronized 를 사용해야 한다. Condition.signal()- 대기 중인 스레드 중 하나를 깨우며 일반적으로는 FIFO 순서로 깨운다. 이 부분은 자바 버전과 구현에 따라 달라질 수 있지만 보통 Condition 구현은 Queue 구조를 사용하기 때문에 FIFO 순서로 깨운다.- ReentrantLock 을 가지고 있는 스레드가..

자바기초 2025.06.30

ReentrantLock

Lock 인터 페이스public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); } void lock() - 락 획득. 만약 다른 스레드가 이미 락을 획득 했다면 락이 풀릴 때까지 현재 스레드는 대기(WATING) 한다. 이 메서드는 인터럽트에 응답하지 않는다. 끝까..

자바기초 2025.06.30

LockSupport

LockSupport는 스레드를 WATING 상태로 변경한다.WATING 상태는 누가 깨워주기 전까지 계속 대기한다. 그리고 CPU 실행 스케줄링에 들어가지 않는다. LockSupport 의 대표적인 기능은- park(): 스레드를 WATING 상태로 변경. * 스레드를 대기 상태로 둔다. 참고로 park의 뜻이 "주차하다", "두다"라는 뜻이다.- parkNanos(nanos): 스레드를 나노초 동안만 TIME_WATING 상태로 변경한다. * 지정한 나노초가 지나면 TIME_WATING 상태에서 빠져나오고 RUNNABLE 상태로 변경된다.- unpark(thread): WATING 상태의 대상 스레드를 RUNNABLE 상태로 변경한다. park() 와 unpark(thread) 사용 예제p..

자바기초 2025.06.30