목록Java (19)
백엔드 엔지니어 이재혁
volatile / 메모리 가시성여러 스레드에서 접근하는 변수의 경우 volatile 키워드를 써줘야 안전하다. 메모리 가시성 문제: 멀티 스레드 환경에서, 같은 인스턴스에 대해, 어떤 스레드에서 변경한 값이 또 다른 스레드에서는 변경한 값으로 보이지 않는 문제가 발생하는 것 메모리 가시성 문제의 근본적인 원인은 CPU 코어에 있는 캐시 메모리에서 기인한다. 연관된 내용은 [CS] CPU 캐시 메모리의 흥미로운 점들 참조. volatile 키워드를 사용하면, CPU의 캐시 메모리를 사용하지 않고, 메인 메모리를 사용하도록 강제하여, 모든 스레드가 같은 시점에 무조건 같은 데이터를 보도록 설정할 수 있다. 메인 메모리는 비교적 느리기 때문에 성능이 하락한다는 점은 감안하고 키워드를 사용해야 한다. sync..
Runnable 인터페이스를 구현하는 방식으로 "작업"을 정의할 수 있다. 이렇게 정의한 작업을, Thread 객체를 생성할 때 넘겨주는 방식으로 Thread를 실행한다. Runnable 사용Thread와 작업을 분리시켜 코드를 작성할 수 있다. 결론부터 말하자면Thread를 실행할 때는, Thread를 상속받아서 만들지 말고, Runnable을 사용해서 작업을 정의하고 만들자. Thread를 상속하면?Thread를 상속하면 구현이 간단하지만, 상속의 제한, 유연성 부족Java는 다중 상속을 허용하지 않기 때문에 이미 다른 클래스를 상속받은 경우 Thread 클래스를 상속받을 수 없다. Runnable 인터페이스 구현 방식1. 상속이 자유롭다.2. 코드 가독성 향상: Thread와 실행할 작업을 분리3...
Main 함수에서 Thread 객체를 생성 Thread th1 = new Thread());해당 Thread의 start 메서드 실행 th1.start();Thread가 새로 자신만의 스택 프레임을 생성Thread가 run() 메서드를 실행 @Override public void run() { System.out.println(Thread.currentThread().getName() + ": run()"); }start()로 thread를 시작해줘야 thread가 실제로 자신만의 스레드 작업 공간을 생성하고 스레드로서 역할을 한다.th1.run() 을 실행하면 안된다. run() 메서드를 main에서 직접 호출하면 main 스레드가 th1의 run() 메서드를 직접 실행한다. 단일 스레드로 실행됨. ..