
동시성 컬렉션동시성 컬렉션이 필요한 이유package thread.collection.simple.list;public interface SimpleList { int size(); void add(Object e); Object get(int index);}package thread.collection.simple.list;import java.util.Arrays;import static util.ThreadUtils.sleep;public class BasicList implements SimpleList { private static final int DEFAULT_CAPACITY = 5; private Object[] elementData; private int ..
원자적 연산아래의 코드는 단순히 값을 하나 증가 시키는 코드이다.멀티스레드 환경이라면 synchronized나 Lock 같은 안전한 임계 영역을 설정해주어야 한다.value++; 와 같은 연산은 원자적 연산이 아니라, 3단계에 걸친 연산이 진행되기 때문이다.package thread.cas.increment;public class BasicInteger implements IncrementInteger{ private int value; @Override public void increment() { value++; } @Override public int get() { return value; }}package thread.cas.incre..

생산자 소비자 문제package thread.bounded;import util.MyLogger;import java.util.ArrayList;import java.util.List;import static util.MyLogger.log;import static util.ThreadUtils.sleep;public class BoundedMain { public static void main(String[] args) { // 1. BoundedQueue 선택 BoundedQueue queue = new BoundedQueueV4(2); // 2. 생산자, 소비자 실행 순서 선택, 반드시 하나만 선택! //producerFirst(queue); ..
synchronized의 가장 큰 단점인 무한 대기 문제를 LockSupport로 해결할 수 있다.LockSupport1LockSupportimport util.MyLogger;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.LockSupport;import static util.MyLogger.log;import static util.ThreadUtils.sleep;public class LockSupportMainV1 { public static void main(String[] args) { Thread thread1 = new Thread(new ParkTest(), "Thread-1"); ..
Synchronizedsynchronized 메서드import static util.MyLogger.log;import static util.ThreadUtils.sleep;public class BankAccountV2 implements BankAccount { private int balance; public BankAccountV2(int initialBalance) { this.balance = initialBalance; } @Override public synchronized boolean withdraw(int amount) { log("거래 시작: " + getClass().getSimpleName()); // 잔고가 출금액..
메모리 가시성package thread.volatile1;import util.MyLogger;import util.ThreadUtils;import static util.MyLogger.log;import static util.ThreadUtils.*;public class VolatileFlagMain { public static void main(String[] args) { MyTask task = new MyTask(); Thread t = new Thread(task, "work"); log("runFlag = " + task.runFlag); t.start(); sleep(1000); log("runFlag를 f..

프로세스와 스레드CPU가 여러개의 프로그램을 대략 0.01초 정도 수행하다가 잠시 멈추고 번갈아하면서 수행한다.멀티태스킹이란, 하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력이다.운영체제가 스케줄링을 수행하고, CPU를 최대한 사용하면서 작업이 골고루 수행될 수 있게 최적화된다 라고만 이해하면 된다.시분할: 마치 동시에 실행 되는 것처럼 하는 기법스케줄링: 어떤 프로그램이 얼마만큼 실행될지는 운영체제가 결정하는 것멀티프로세싱이란, 컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용하여 여러 작업을 동시에 처리하는 기술을 의미한다.멀티프로세싱: 하드웨어 기반멀티태스킹 : 소프트웨어 기반여러 CPU 코어를 사용 = 멀티프로세싱단일 CPU 코어 관점에서 여러 작업을 분할해서 수행 = 멀티태스킹..

형식화 클래스 java.text 패키지에는 숫자와 날짜를 원하는 형식으로 쉽게 출력할 수 있는 기능이 존재 DecimalFormat : 10진수 숫자를 형식 문자열로 변환 숫자 -> 문자: format() 문자 -> 숫자: parse() 10진수를 형식 문자열로 변환 (숫자 -> 형식 문자열) double number = 1234567.89; DecimalFormat df = new DecimalFormat("#.0000"); String result = df.format(number); System.out.println(result); //결과: 1234567.8900 빈 자릿수를 0으로 채워주는 코드의 예시이다. 숫자를 형식 문자열로 형식화할 때 format 메소드를 사용한다. 특정 형식의 문자열을 ..