리셋 되지 말자

3일차 본문

Java(폐지)/Java 공부

3일차

kyeongjun-dev 2020. 7. 14. 14:20

전역 변수와 메모리

public class Start5{
    static int share;

    public static void main(Stirng[] args){
        share = 55;
        int k=fun(5,7);

        System.out.printls(share);
    }

    private static int fun(int m, int p){
        share = m+p;

        return m-p;
    }
}
  • 4번째 줄을 실행하기 전 T 메모리 상태
    -> share 변수에 static 키워드가 붙어서 T 메모리의 스태틱 영역에 변수 공간이 할당된다.

  • 이 후의 과정은 생략

전역 변수와 지역 변수

  • 전역 변수 : 스택 프레임으로부터 독립적인 변수
  • 지역 변수 : 스택 프레임에 종속적인 변수

-> 전역변수를 피할수 있으면 피하는게 좋다. (코드가 많아지면 추적이 힘들다.)
-> 읽기 전용으로 값을 공유해서 전역 상수로 쓰는것은 추천하는 방식. (ex PI)

멀티 스레드 / 멀티 프로세스의 이해

  • 멀티 스레드(Multi Thread) : 스택 영역을 스레드 개수만큼 분할해서 쓰는 것

  • 멀티 프로세스(Multi Process) : 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조

-> 멀티 프로세스는 각 프로세스마다 각자의 T 메모리가 있고, 각자 고유의 공간이므로 서로 참조할 수 없다.(각각의 프로세스의 전역변수에 접근할 수 없다.) 그에 반해 멀티 스레드는 하나의 T 메모리만 사용하는데 스택 영역만 분할해서 사용하는 구조다.
-> 멀티 프로세스는 하나의 프로세스가 다른 프로세스의 T 메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조이지만 메모리 사용량은 그만큼 크다. 이에비해 멀티 스레드는 비교적 메모리를 적게 사용할 수 있는 구조다.
-> 자바 웹 개발에서 서블릿은 요청단 스레드를 생성한다. (아직 해본적이 없음!)

멀티 스레드 환경에서 전역 변수 사용의 문제점

  • 전역 변수 A가 있고 두 개의 스레드가 있을 때의 예시
    -> 스레드1이 A에 10을 할당했는데, CPU 사용권이 스레드2로 넘어가서 스레드2가 A에 20을 할당한 뒤 스레드1에서 A를 출력했는데 10이 아닌 20이 나오는 상황

    스레드1 스레드2 결과
    전역 변수 A에 10 할당 전역 변수 A는 10을 저장
    전역 변수 A에 20 할당 전역 변수 A는 20을 저장
    전역 변수 A의 값을 출력 20 출력
  • 쓰기 가능한 전역변수를 사용하게 되면 스레드 안전성이 깨진다고 표현한다. 이를 보완하는 방법으로 락(Lcok)을 거는 방법이 있다. 하지만 락을 사용하는 순간 멀티 스레드의 장점을 버린것과 마찬가지가 된다.

  • 멀티 스레드는 웹 프로그래밍에서 참 열심히 쓰는 기술이다.

  • 스레드 코드 예시

    public class Main extends Thread{
      static int share;
      public static void main(String[] args) {
          Main t1 = new Main();
          Main t2 = new Main();
    
          t1.start();
          t2.start();
      }
    
      public void run() {
          for(int count = 0; count <10; count++) {
              System.out.println(share++);
              try {
                  sleep(1000);
              }catch(InterruptedException e) {}
          }
      }
    }
  • 결과1

    0
    1
    2
    2
    3
    4
    6
    5
    7
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  • 결과2

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
  • 결과가 같을때가 있고 다를 때가 있다. 스레드들이 전역변수를 출력할 때, cpu 사용권이 달라져서 그런것 같다.(쓴이의 의견. 틀릴확률 79프로)

필드vs속성, 함수 vs 메서드

  • 함수와 메서드는 절차/구조적 프로그래밍에서 부르는 이름과 객체지향 프로그래밍에서 부르는 이름의 차이만 있지, 같다.
  • 절차/구조적 프로그래밍에서는 전역변수를 필드 라고 불렀고, 객체지향 프로그래밍에서는 전역 변수를 프로퍼티라고 부른다.
Comments