⬛ 동시성 컬렉션이 필요한 이유원자적 연산; 여러 스레드가 동시에 접근해도 안전하다.그럼 아래에서 add(..) 는 원자적 연산일까?public class SimpleListMainV0 { public static void main(String[] args) { List list = new ArrayList(); // 스레드1, 스레드2가 동시에 실행 가정 list.add("A"); //스레드1 실행 가정 list.add("B"); // 스레드2 실행 가정 System.out.println(list); }} 위의 add(...)를 자세히 들여다보고, 다시 질문에 대답해보자. 아래는 원자적 연산인가?public void add(Object e) { elementData[size] = e; ..
Java
⬛ 생산자 소비자 문제🟢 생상자 소비자 문제 (producer-consumer problem)생산자 스레드와 소비자 스레드가 특정 자원을 함께 생산하고, 소비하면서 발생하는 문제 🟢 주요 개념생산자(Producer): 데이터를 생성하는 스레드로, 예를 들어 파일에서 데이터를 읽거나 네트워크에서 데이터를 받아오는 역할소비자(Consumer): 생산된 데이터를 사용하는 스레드로, 데이터를 처리하거나 저장하는 역할버퍼(Buffer): 생산자가 생성한 데이터를 임시로 저장하는 공간으로, 크기가 한정되어 있으며 생산자와 소비자가 이 공간을 통해 데이터를 주고받음⬛ 예제1 - 기본적 생산자 소비자 문제구현:BoundedQueueV1이라는 한정된 버퍼를 사용 버퍼에 데이터가 가득 차거나 비어 있을 때, 특별한 처..
⬛ LockSupport🟢 synchronized 단점무한 대기: BLOCKED상태는 락이 풀릴 때까지 무한대기공정성: 락획득 랜덤.특정 스레드가 너무 오랜기간 락획득 못할수도 있다. 🟢 LockSupport 기능park(): 스레드를 WAITING 상태로 변경unpark(): 스레드를 WAITING → RUNNABLE 상태로 변경public class LockSupportMainV1 { public static void main(String[] args) { Thread thread1 = new Thread(new ParkTask(),"Thread-1"); thread1.start(); //잠시 대기하여 Thread-1이 park상태에 빠질 시간을 준다. ..
⬛ 출금 예제로 보는 동시성 문제공유 자원: 여러 스레드가 접근하는 자원쓰레드 두개를 만들어 동시에 잔고가 천원인 계좌에서 동시에 돈을 출금하는 상황을 만들어보자.public class BankAccountV1 implements BankAccount { private int balance; //volatile private int balance; public BankAccountV1(int initialBalance) { this.balance = initialBalance;} @Override public boolean withdraw(int amount) { log("거래 시작: " + getClass().getSimpleName()); ..
⬛ 데몬 스레드사용자 스레드(non-daemon 스레드)프로그램의 주요 작업을 수행한다. 작업이 완료될 때까지 실행된다.모든 user 스레드가 종료되면 JVM도 종료된다.데몬 스레드백그라운드에서 보조적인 작업을 수행한다.모든 user 스레드가 종료되면 데몬 스레드는 자동으로 종료된다.JVM은 데몬 스레드의 실행 완료를 기다리지 않고 종료된다. 데몬 스레드가 아닌 모든 스레드가 종료되면, 자바 프로그램도 종료된다.setDaemon(true)로 설정 가능하다.⬛ 스레드 로거public class MyLogger { private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); public ..
답답해서 공부해보는 thread...자바의 정석 책을 다시 펼쳤다..◼️쓰레드 구현과 실행🟢 쓰레드 구현 방법 두가지Thread클래스를 상속 (단점: 다른클래스 상속받을수없음) Runnable인터페이스를 구현//1.Thread 클래스를 상속class MyThread extends Thread{ public void run() { /*작업내용*/ }}//2.Runnable 인터페이스를 구현class MyRunnable implements Runnable{ public void run() { /*작업내용*/ }} 🔶예시 코드public class ThreadEx1 { public static void main(String[] args) { ThreadEx1_1 t1 = new T..
⬛ 멀티태스킹과 멀티프로세싱초기엔 CPU에서 하나의 프로그램을 끝내야 다음 프로그램으로 넘어갔다.이런 불편함을 해소하기 위해 하나의 CPU 코어로 여러 프로그램을 동시에 실행하는 '멀티태스킹' 기술이 등장했다.🟢멀티프로세싱 컴퓨터 시스템에서 둘 이상의 프로세서(CPU 코어)를 사용하여 여러 작업을 동시에 처리하는 기술CPU 안에는 실제 연산을 처리할 수 있는 코어가 있다. CPU 코어가 둘 이상이라면 어떻게될까. 🟢멀티프로세싱 vs 멀티태스킹 멀티프로세싱하드웨어 장비의 관점 여러 CPU(여러 CPU 코어)를 사용하여 동시에 여러 작업을 수행하는 것을 의미멀티태스킹운영체제 소프트웨어의 관점단일 CPU(단일 CPU 코어)가 여러 작업을 동시에 수행하는 것처럼 보이게 하는 것을 의미소프트웨어 기반으로 C..
○ 직접 구현하는 Iterable, Interator자바는 자료구조 구현과 관계없이 모든 자료 구조를 동일한 방법으로 순회할 수 있는 Iterable,Iterator 인터페이스를 제공한다.public interface Iterable { Iterator iterator(); //iterator 반복자 반환}public interface Iterator { boolean hasNext(); //다음요소 없으면 false E next(); //다음요소 반환} 먼저 Iterator 구현체를 만든다.public class MyArrayIterator implements Iterator { private int currentIndex = -1; private int[] targetArr; publ..
○ 제네릭이 필요한 이유다양한 타입을 담는 박스가 필요하면 그때마다 각 박스 클래스를 새로 만들어야한다.public class BoxMain1 { public static void main(String[] args) { IntegerBox integerBox = new IntegerBox(); integerBox.set(10); //오토 박싱 Integer integer = integerBox.get(); System.out.println("integer = " + integer); StringBox stringBox = new StringBox(); stringBox.set("hello"); String str..
[Java] 김영한의 실전 자바 - 중급편 섹션10 예외처리2 - 실습강의 실습이 길어, 이번에는 코드예시들보단 흐름을 따라가며 핵심위주로 요약해 정리했다ㅎ :)○ 예외 처리 도입처음 만들었던 프로그램에 자바 예외 처리를 도입해본다.예외를 통해 정상 흐름과 예외 흐름을 분리하여 가독성을 높여보자. 반환 값을 통해 예외를 처리하는 방식이 아닌, 예외객체에 오류 코드와 메시지를 포함하여 처리한다. ○ 예외 복구 try-catch Main()밖으로 예외가 던져지면 스택 트레이스 출력후 프로그램이 종료된다. 예외를 잡아 예외 흐름을 정상 흐름으로 복구하기위해,try-catch 블록을 사용하여 예외를 처리하고, 오류 메시지를 출력한다.public class MainV2 { // 기존코드 public static..