반응형

JAVA 19

태태코딩 - 람다(김영한 실전자바 고급 3편)

요즘 AI공부를 시작하다보니, AI공부를 쉬고싶을 때 백엔드 공부로 치유하는 느낌이다,, 원래는 백엔드도 점점 공부라고 느껴지던 참이였는데,, 치료된건가..? 싶다 일단 AI 끝나면 멀티스레드를 마무리하고, 람다를 제대로 다시 공부해볼 예정이다. 효율적인 코드?역시 영한 강사님이다,, 아직 시작 부분이지만, 람다가 왜 필요한지 설명해주신다.머리속 코드로 작성해보자면 public void ex1(){ String ex1 = "행복"System.out.println("오늘은 "+ ex1+ "해요");} public void ex2(){ String ex2 = "우울"System.out.println("오늘은 "+ ex2+ "해요");}public class Main { public static void..

JAVA 2025.04.27

태태개발일지 - 고급 java (김영한) 컬랙션 동시성

전 글에서 CAS 연산을 다룬 후  컬랙션 동시성에 대해 글을 작성해보려한다. Collection 동시성? 자바에서는 List, Map, Set 컬랙션들은 기본적으로 동기화가 되어있지 않기 때문에, 멀티쓰레드 환경에서 사용할 경우 동기화를 고려해야한다.해결방법 1. 프록시를 사용하여 synchronized를 메서드 마다 붙여서 동시성을 보장해준다. 2. Collections.synchronizedXXX() 이라는 동기화된  컬렉션을 사용한다.  사실 1번과 2번 둘다 사용할 수 는 있지만, 현업에서는 더 간편하고 효율적으로 사용하기 위해서 java.util.concurrent를 사용한다. 종류(1) Concurrent List클래스특징CopyOnWriteArrayList- 읽기 연산이 많고, 쓰기 연산이..

JAVA 2025.03.19

태태개발일지 - 자바 고급 (김영한) CAS 연산

자바 원자적 연산 원자적 연산이란? 하나의 연산이 중간에 끊기지 않고 한 번에 수행되는 것  원자적 연산을 사용하는 이유멀티스레드 환경에서 동시에 여러 스레드가 공유 변수에 접근하면 경합이 발생할 수 있다.이 문제를 해결하기 위해 synchronized 와 같은 키워드로 lock을 걸어서 동기화 할 수 있지만, 락을 사용하면 성능이 저하될 수 있다. ex) 아래는 원자적인 연산이 아니여서 경합이 발생할 수 있는 코드이다.public void use(){if(i==10){}i++;}CAS CAS(Compare-And-Swap) 을 사용해서 동기화 없이(비블로킹, Lock-Free) 원자적 연산을 수행할 수 있도록 설계된 클래스  사용법 import java.util.concurrent.atomic.Atom..

JAVA 2025.03.17

태태개발일지 - java 고급 멀티스레드(김영한)

전 글에 이어서 작성하겠다.전 글을 요약하자면, 생산자와 소비자가 같은 대기공간에 들어가고 랜덤으로 깨어진다는 것이였다. ReentrantLock여기서 사용하는 것이 ReentrantLock 이다. 예시코드 public void awaitMethod() { lock.lock(); try { while (!ready) { // ready가 true가 될 때까지 대기 System.out.println(Thread.currentThread().getName() + " 대기 중..."); condition.await(); // 현재 스레드를 대기 상태로 만든다. } S..

JAVA 2025.03.08

태태개발일지 - java 고급 멀티스레드

생산자 스레드와 소비자 스레드 시뮬레이션가정:1. 생산자는 데이터를 가져와서 queue에 입력을한다.2. 소비자는 데이터를 queue에서 가져와서 제거한다.  기본 코드 예시 public synchronized void produce(int value) throws InterruptedException { while (queue.size() == MAX_SIZE) { System.out.println("Queue is full. Producer is waiting..."); sleep(); // Queue가 꽉 차면 기다림 } queue.offer(value); System.out.println("Produced..

JAVA 2025.03.06

태태개발일지 - 자바 고급 멀티쓰레드(김영한)

동시성저번 글은 메모리 가시성에 대한 글을 작성했다. 보통 성능을 위해 변수를 메모리에서 직접 참조하지 않고, 캐시에 담아서 값을 처리를 하는데, 이를 통해서 생기는 문제였다. 이번에 다룰 부분은 동시성이다. private Integer x = 7000if(x > 5000){ x -= 4000;} 쓰레드 안에서 이러한 로직을 실행할 때 문제가 생긴다.  만약 두개의 쓰레드가 동시에 실행한다면 어떻게 될까?  둘다 if문에 들어가서 검증로직을 수행 후 , x의 값을 변경하게 된다. 동시에 값을 참조했으므로 x의 값은 7000으로 찍히고 둘다 if문 안으로 들어가게 된다. 첫번째 쓰레드가 x에서 -4000을 해버렸고, 두번째 쓰레드가 값을 변경할때 x는 1000이 되게 되어 x는 음수가 되는 상황이 발생..

JAVA 2025.02.22

태태개발일지 - 멀티스레딩(김영한 고급 자바)

메모리 가시성 (Memory Visibility) 스레드를 선언할 때 공유변수를 volatile 으로 선언하는 이유를 알아보았다. 쓰레드와 메인쓰레드는 효율을 위해서 캐시에 변수의 값을 집어넣고 프로세스를 진행한다.즉. Main Thread에서 기존 쓰레드의 공유변수의 상태값을 바꾼다해도 캐시의 값이 바뀌기 때문에 쓰레드는 그 값의 변화를 인지하지 못한다는 것이다. private Boolean flag;를 쓰레드안에 선언해놓고 MainMethod에서flag = "false";를 선언한다고 해도 바로 실행중인 멀티 스레드에서 인지하지 못한다는 뜻이다.이것이 메모리의 가시성이다. 이유위에 언급한 것 처럼, MainThread 와 Multi Trhead모두 변수의 값을 캐시에 불러와서 그 값을 지속적으로 읽기..

JAVA 2025.02.17

태태개발일지 - 고급 자바 멀티 스레드

인터럽트 1. volatile boolean runFlagRunnable 클래스 안에 volatile boolean runFlag = true;를 선언해준다.  main method에서 task.runFlage = false; 넣으면 작업을 중단할 수 있다. 하지만 위와 같은 방법으로는 바로 작업을 중단할 수 없기 때문에  log("작업 중단 지시 thread.interrupt()"); 2.thread.interrupt();  인터럽트 메서드를 사용한다.  하지만 interrupt(); 가 발생했다고 바로 interruptException이 일어나는게 아니다.sleep(); 과 같이 스레드를 대기시키는 명령어를 만나면 interruptException을 만든다.  예외가 터지면 -> 이제 인터럽트 상태가..

JAVA 2025.02.11

태태코딩 - 김영한 자바 고급[스레드]

Thread 메서드Thread.threadId();  => 각 스레드에 대해 유일한 idThread.getName(); => 디버깅이나 로깅 목적으로 유용하다.Thread.getPriority();  => 스레드 우선순위 1이 가장낮음 10이 가장높음 기본값: 5 set 메서드를 가지고 우선순위를 변경할 수 있다.스케줄러가 따져보고 결정한다. *실제 실행 순서는 JVM 구현과 운영체제에 따라 달라질 수 있다.Thread.getThreadGroup(); =>   스레드 그룹은 하나의 그룹으로 묶어서 일괄종료, 우선순위 설정을한다.*부모 스레드* : 새로운 스레드를 생성하는 스레드를 의미한다.Thread.getState(); => 스레드 상태new , runnable, bolcked, waiting, tim..

JAVA 2025.02.08

태태개발일지 - 멀티쓰레드

자바 메모리 구조메서드영역: 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.클래스 정보, static, 런타임 상수 스택영역: 자바 실행 시 스택이 생성된다.스택 프레임: 스택 영역에 쌓이는 네모 박스 하나가 스택 프레임이다 힙영역: 객체와 배열이 생성되는 영역. 가비지 컬랙션이 이루어지는 주요 영역. 스레드 생성1. Thread 상속public class HelloThread extends Thread{ @Override public void run(){ System.out.println(Thread.currentThread().getName()+":run()"); }} .run은 호출하지 말기 : 하단의 이유 제시 .star..

JAVA 2025.02.05
반응형