자바

    [Java] Volatile 키워드

    [Java] Volatile 키워드

    🔍 멀티 코어 프로세서 멀티 코어 프로세서에는 코어마다 별도의 개시를 가지고 있기 때문에 멀티 쓰레드 프로그래밍의 결과가 제대로 동작하지 않을 수 있다. L1캐시와 L2캐시에 대해서 간단히 설명하면 다음과 같다. L1 캐시는 CPU 코어에 가장 가까운 위치에 있어 빠르게 접근할 수 있지만 용량이 작다. L2 캐시는 L1캐시보다 크며 속도는 느리다. 여러 코어간의 데이터 공유를 위한 캐시로 사용된다. 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 따라서 다시 값을 읽어올 때는 먼저 캐시에 있는지 확인하고 없을 때만 메모리에서 읽어온다. 멀티 코어 프로세스에서는 다음과 같이 코어마다 별도의 캐시를 가지고 있기 때문에 원하는 결과를 얻지 못할 수도 있다. 🔍 Volatile 키..

    [Java] 쓰레드의 동기화

    🔍 쓰레드의 동기화 멀티쓰레드 프로세스의 경우 같은 자원을 여러 쓰레드에서 공유하여 사용하기 때문에, 예상치 못한 결과를 얻을 수도 있다. 예를 들어 돈을 인출하는 과정을 두 개의 쓰레드 작업으로 생각해보자. 현재 3000원이 통장 잔고에 있고, 쓰레드 A는 3000원 인출을 요청한다. 이때, 쓰레드 B도 1000원을 인출 요청한다. 이 경우에 쓰레드 A가 deposit -= money 를 실행하기 전에 쓰레드 B가 deposit >= money 구문을 실행한다면 deposit이 마이너스가 될 것이다. public class BankAccount { private int deposit; public void withdraw(int money) { if(deposit >= money) { deposit -..

    [Java] 쓰레드 완벽 정리

    [Java] 쓰레드 완벽 정리

    🔍 프로세스와 쓰레드 프로세스란 '실행중인 프로그램'을 말한다. 우리가 프로그램을 실행시키면 OS(윈도우, Mac 등)는 프로그램 실행에 필요한 데이터와 메모리 등의 자원을 할당한다. 프로세스는 이렇게 할당 받은 자원과 쓰레드로 구성되어 있다. 쓰레드는 '프로세스가 할당 받은 자원을 활용하여 실제 작업을 이행하는 존재' 를 말한다. 쓰레드의 생성에는 제한이 없지만, 작업을 수행하기 위한 메모리 공간을 필요로 한다. 쓰레드는 프로세스가 가지고 있는 자원을 할당받기 때문에 프로세스의 메모리 한계치까지만 생성할 수 있다. 🔍 멀티 태스킹과 멀티 쓰레딩 우리는 문서 작업을 하면서 동시에 유튜브 음악을 감상할 수 있다. 이는 윈도우와 같은 운영체제는 멀티태스킹을 제공하기 때문에 가능한 일이다. 멀티 태스킹은 두 ..

    [토비 스프링] CH4-1. 예외처리

    [토비 스프링] CH4-1. 예외처리

    초난감 예외처리 자바를 처음 배우면 예외처리를 다음과 같이 try-catch문을 써서 처리한다. try { ... } catch(SQLException e) { } 예외가 발생하는 것을 catch블록을 써서 잡아내는 것은 좋은데 아무것도 하지 않고 별문제 없는 것처럼 넘어가 버리는 건 위험한 일이다. (리소스 소진, 예상치 못한 다른 문제를 야기한다.) 다음과 같은 코드들도 잘못 된 예외 처리 방식이다. 오류 메세지는 출력해주지만, 다른 로그나 메세지에 금방 묻혀버려 놓치기 쉽다. catch(SQLException e) { System.out.println(e); } catch(SQLException e) { System.out.println(); } 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시..

    [Effective Java] 스트림 병렬화는 주의해서 적용하라

    자바의 동시성 프로그래밍 첫 릴리스에서부터 스레드, 동기화, wait/notify를 지원했다. 자바 5부터는 동시성 컬렉션인 java.util.concurrent 라이브러리와 실행자 프레임워크를 지원했다. 자바 7부터는 고성능 병렬 분해 프레임워크 포크-조인 패키지를 추가했다. 자바 8부터는 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했다. 동시성 프로그래밍에서는 안전성과 응답 기능 상태를 유지하는 것이 중요한 포인트인데, 자바의 많은 지원에도 올바르고 빠르게 작성하는 일은 여전히 어렵다. 병렬 스트림의 잘못된 사용 다음은 스트림을 사용해 처음 20개의 메르센 소수를 생성하는 프로그램이다. public static void main(String[]args){ ..