1 ) 전역변수
= 스택프레임에 독립적임
= 코드 어느곳에서나 접근 가능
= 공유변수 라고도함
Q) 왜 전역변수 사용을 지양해야할까?
>> 프로젝트 규모에 따라 코드가 커지면서 여러 메서드에서 전역 변수의 값을 변경하기 어렵게되면 메모리로 추적하지 않는 이상 전역 변수에 저장돼 있는 값을 파악하기 쉽지 않기 때문이다.
따라서 전역변수의 사용은 피해야하지만, 다만 읽기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 추천.
대표적인 전역 상수는 원주율을 나타내는 PI값
이 값은 Math 클래스에 이미 정의 되어있다.
System.out.println(Math.PI); 로 확인가능
2) 지역변수
= 스택프레임에 종속적임
1. 멀티스레드
멀티스레드의 T메모리 모델은 스택 영역을 "스레드 개수"만큼 분할해서 쓰는 것
다시 복습하자면
T 메모리는 스태틱 영역 + 스택 영역(메서드들의 놀이터) + 힙 영역
으로 나누어진다.
따라서 다른 스레드에서 스택 영역에 접근할 수 없지만
스태틱 영역과 힙 영역은 공유해서 사용할 수 있다.
그러므로 멀티프로세스 대비 메모리를 적게 사용하게된다.
2. 멀티프로세스
다수의 데이터 저장 영역
= 다수의 T 메모리를 갖는 구조이다.
(스태틱 영역 + 스택 영역 + 힙 영역)
(스태틱 영역 + 스택 영역 + 힙 영역)
(스태틱 영역 + 스택 영역 + 힙 영역)
...
이 영역들은 각자 고유공간이어서 서로 참조할 수 없다.
(안전한 구조이지만 메모리 사용량이 크다)
이 개념들을 정리해보면
자바 웹 프로그래밍에서 서블릿은 "요청당 스레드"인데,
요청당 스레드(Servlet)가 요청당 프로세스(CGI)보다
왜 더 효율적인지 알 수 있다.
Q. 멀티 스레드에서 전역 변수 사용의 문제점?
>>
두 개의 스레드에서 스레드 1이 공유영역(스태틱 + 힙)에 있는 전역 변수 A에 10을 할당하고, CPU사용권이 스레드2로 넘어가 A를 20으로 초기화 후 다시 CPU사용권이 스레드 1으로 넘어오면
A의 값은 20으로 출력되는 문제가 발생
다른 말로 "쓰기 가능한 전역변수를 사용하게되면 '스레드 안전성이 깨진다'라고 표현한다"
이를 보완하기 위해 "락"을 걸기도 하는데, 이는 멀티스레드의 장점을 버리는 것과 가다.
ㅡㅡㅡ
Q. Thread.sleep()과 InterruptedException은 언제 쓰는지
>>
테스트 코드 등에서 어떤 로직이 실행될때까지 특정 시간동안 기다려야할때 사용되는 Thread.sleep()
하지만 이 메서드를 사용하려할때마다 InterruptedException이 발생한다.
이를
try {
Thread.sleep(millis);
} catch (InterruptedException e){
}
처럼 처리하기도 한다.
그렇다면 이것이 왜 발생하였는지 근본적인 개념을 알아보고자 한다.
이어서
1. Java Thread의 인터럽트(Interrupt) 메커니즘
>>
InterruptedException 은 자바 스레드의 인터럽트 메커니즘 일부이다.
한 스레드가 다른 스레드를 인터럽트할 수도 있고,
각 스레드 자신이 인터럽트 되었는지 확인할 수도 있다.
자기 자신의 스레드를 인터럽트 할 수도 있다.
인터럽트가 발생한다는 것은 "스레드가 하던일을 멈추라는 신호"이며, 이를 적절히 처리해야한다.
만약 어떤 스레드를 인터럽트하고 싶으면 대상 스레드의 Thread.interrupt()메서드를 호출해야한다.
정리하자면,
인터럽트는 스레드를 종료하고자하며,
테스트코드가 아니라면 인터럽트를 적절히 처리해야한다.
만약 멀티스레드 코드에 무한루프 or InterruptedException의 메서드 호출이 있다면,
while (!Thread.currentThread().isInterrupted()) {
try {
// Thread.sleep(), Future.get(),
// BlockingQueue.take() 등이 여기올 수 있다.
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
의 코드를 관용구처럼 사용하는 것을 권장한다.
브레이크 포인트를 더블클릭으로 코드 줄에다 걸어두고
Debug As > Java Application 실행 후
F5를 누르면서 스택 프레임 현황판을 살펴보면
share 값이 실시간으로 변하는 것을 확인할 수 있다.
스태틱 : 클래스의 공간
스택 : 메서드의 공간
힙 : 객체의 공간
'Programming > Spring_스프링' 카테고리의 다른 글
[스프링] 5. 다중상속과 인터페이스 (0) | 2023.05.22 |
---|---|
[스프링] 4. 클래스 멤버와 객체 멤버, 객체지향의 상속 (0) | 2023.05.19 |
[스프링] 3. 객체지향의 4대 특성, 클래스와 객체의 관계 (0) | 2023.05.19 |
[스프링] 1. 프로젝트 생성 및 메모리 구조 확인 (2) (0) | 2023.03.01 |
[스프링] 1. 프로젝트 생성 및 메모리 구조 확인 (2) | 2023.02.28 |