분류 전체보기(18)
-
메모리 가시성
public static void main(String[] args) throws InterruptedException { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); Thread.sleep(1000); myRunnable.flag = false; } static class MyRunnable implements Runnable { boolean flag = true; @Override public void run() { System.out..
2024.10.20 -
ThreadPoolExecutor
ThreadPoolExecutor executor = new ThreadPoolExecutor( 10, // corePoolSize 10, // maximumPoolSize 10L, // keepAliveTime TimeUnit.SECONDS, // timeUnit new LinkedBlockingQueue(10) // queue);corePoolSize - 실행에 참여시킬 스레드 크기작업이 시작되어야 스레드도 생성된다. 즉 처음부터 corePoolSize만큼 만들어지지 않는다.ThreadPoolExecutor.prestartAllCoreThreads 을 이용하면 처음부터 corePoolSize만큼 만들 수 있다.maximumPoolSize ..
2024.10.13 -
Object notify(), wait()
wait() 현재 스레드가 가진 락을 반납하고 대기(WAITING)한다. 현재 스레드가 syncrhonized 블록이나 메서드에서 락을 소유하고 있을 때만 호출할 수 있다. wait()를 호출한 스레드는 락을 반납하고, 다른 스레드가 해당 락을 획득할 수 있도록 한다. 이렇게 대기 상태로 전환된 스레드는 다른 스레드가 notify() 또는 notifyAll() 을 호출할 때까지 대기 상태를 유지한다.notify() 대기 중인 스레드 하나를 깨운다. 이 메서드는 synchronized 블록이나 메서드에서 사용이 되어야 한다. 깨어난 스레드는 WAITING → BLOCKED 상태가 된다.BLOCKED 상태는 락 대기 집합이라는 곳에서 관리가 된다.notifyAll() 대기 중인 모든 스레드를 깨운다.wait..
2024.10.06 -
동기화
LockSupportSynchronized는 한계가 있다.무한 대기공정성따라서 Java 1.5부터 concurrent 패키지가 추가되었고 그 중에 LockSupport에 대해 알아보자LockSupportpark() : 스레드를 WAITING 상태로 변경한다.parkNanos(nanos) : 스레드를 나노초 동안만 TIMED_WAITING 상태로 변경한다.unpark(thread) : WAITING 상태의 대상 스레드를 RUNNABLE 상태로 변경한다.WAITING 또는 TIMED_WAITING 상태를 RUNNABLE로 변경하는 방법은 2가지가 있다.LockSupport.unpart(thread)thread.interrupt()public class LockSupportMain { public sta..
2024.10.05 -
스레드 제어와 생명 주기
스레드 그룹thread.getThreadGroup() 하면 나오는게 스레드 그룹이다. 스레드 그룹은 스레드를 그룹화하여 관리할 수 있다. 기본적으로 모든 스레드는 부모 스레드와 동일한 스레드 그룹에 속하게 된다.스레드 그룹은 여러 스레드를 하나의 그룹으로 묶어서 특정 작업(예: 일괄 종료, 우선순위 설정)을 수행할 수 있다.스레드 상태NEW : 스레드가 아직 시작되지 않은 상태RUNNABLE : 스레드가 실행 중이거나 실행 가능한 상태BLOCKED : 스레드가 동기화 락을 기다리는 상태WAITING : 스레드가 다른 스레드의 특정 작업이 완료되기를 기다리는 상태TIMED_WAITING : 일정 시간동안 기다리는 상태TERMINATED : 스레드가 실행을 마친 상태main 스레드가 thread1, thre..
2024.10.02 -
JVM 메모리 영역
public class Main { public static void main(String[] args) { ExampleClass exampleClass = new ExampleClass(); int sum = exampleClass.sum(5, 10); }}public class ExampleClass { private int a; private int b; public int sum(int a, int b) { return a + b; }}1단계: Main클래스 로드Main 클래스가 처음 실행되면, JVM은 클래스 로더를 통해 .class 파일을 메소드 영역(Method Area)으로 로드한다. 상수 풀(Constant Pool)..
2024.09.29