thread 4

동시성 문제와 동기화(synchronized)

동시성 문제두개 이상의 스레드가 공유자원을 여러 단계로 나누어 이용할 때 동시성 문제가 일어난다.   '잔액'이라는 공유자원을 사용하고 로직을 (1)잔액 확인 (2)잔액 출금 으로 나누어져있을 때  [한 번에 여러개의 스레드 실행할 경우]    한 스레드가 공유자원인 잔액의 값을 (2)출금 로직에서 변경했을 때    다른 스레드에서는 '잔액'을 처음으로 설정한 값을 기준으로(변경되지 않은 값을 기준으로) 검증을 하면 원치 않는 결과 초래 15:38:50.830 [ t2] 거래 시작 : BankAccountV115:38:50.830 [ t1] 거래 시작 : BankAccountV115:38:50.840 [ t1] [검증 시작] 출금액 : 800, 잔액 : 100015:38:..

JAVA 2024.11.24

멀티스레드 메모리 접근 방식/메모리 가시성/happens-before

실제 메모리의 접근 방식 각 CPU마다 캐시 메모리라는 것을 사용한다, 메인 메모리는 CPU입장에서 거리도 멀고, 속도도 상대적 느리다. 해당 캐시 메모리는 CPU의 빠른 연산을 위해 CPU와 가까이 붙어있고, 속도도 빠른 메모리이다. 보통 코어 단위로 캐시 메모리를 각각 보유하고있다.volatile을 사용하지 않을 경우 메인 메모리(힙 영역)에 있는 변수의 값을 각 캐시 메모리에서 불러오고, 그 이후 캐시 메모리에 있는 변수의 값을 사용하게 된다. 멀티스레드 환경에서 volatile 없이 변수의 값을 변경하는 경우 main 스레드에서 runFlag 변수의 값을 true 에서 false로 바꾸는 경우,메인메모리와 work스레드를 연산하는 CPU가 사용하는 캐시 메모리에 바로 반영이 되지 않는다.그러므로,..

JAVA 2024.11.21

스레드와 Yield

여러 스레드가 동시에 접근하는 경우 동시성 컬렉션{ java.util.concurrent 패키지} 및 동시성 변수 volatile을 사용하는 것이 안전하다.  ConcurrentLinkedQueue : QUEUE 상속, concuurent 패키지 / 여러 스레드에 의해 자료구조가 수정될 수 있음volatile : 동시에 실행되는 여러 스레드에 의해 필드가 수정될 수 있음을 나타냄package thread.control.printer;import java.util.Queue;import java.util.Scanner;import java.util.concurrent.ConcurrentLinkedQueue;import static util.MyLogger.log;import static util.Threa..

JAVA 2024.11.18

스레드 인터럽트

1. InterruptInterrupt - 1. 인터럽트를 사용하지 말고, 무한루프 스레드의 작업을 중단시키는 방법  아래  work 스레드를 중단하는데에 가장 쉬운 방법은 work스레드 작업에 변수를 지정하고,실행하는 메인 스레드에서 그 변수를 조작하는 것이다 [ while(true) -> while(false) ]그런데, 이런 방법은 sleep으로 초를 맞춰서 중단시키는거라,특정스레드가 끝나자마자 바로 중단하는게 아니라 sleep()이 있으면 sleep()이 끝난다음에 중단을 할 수 있다.↓  work 스레드 2번째 작업 시작하고 1초 지난 뒤(main스레드가 sleep(4000)에서 깨어나는 시점)에 while(false)를 인식하고 작업이 끝나면(2초뒤에) work 스레드가 작업을 끝냄21:46:..

JAVA 2024.10.31