ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Thread와 자원 공유 - 멤버필드, static필드
    JAVA/Thread 2020. 10. 8. 18:25

    Thread와 자원 공유 - 멤버필드, static필드
        - 같은자원(같은 객체의 멤버필드)을 여러개의 쓰레드가 공유할 수 있다.
        - 문제점발생 : 좌석예약, 계좌입출금 등등
        - 문제점은 동기화 처리(synchronized)로 해결할 수 있다.

     

     

    멤버 필드 예제

    프로그램 실행결과의 일정부분

    소스 파일

    ThreadMain4.java
    0.00MB

     

     

     

    static 필드 예제

    아래의 프로그램에서 MemberPrint클래스의 필드 i가 static이고 prviate임을 기억하자.

    아래의 프로그램이 100번 도는 이유는 static 때문이다. 실행결과를 참고하자.
    실행결과를 보면 필드 i가 static으로 선언이 되어있으면

    MemberPrint의 객체들이 모두 i값을 같이 참조를 해야한다.

    그런데 프로그램 실행결과를 보면 스레드 A,B,C모두 i가 0일 때를 실행하고 있다.

    이와 같은 일이 발생하는 경우는

    예를 들어 쓰레드 A가 i가 0일때 값을 사용하고 나서 이 값이 1증가 하기 전에

    B와 C쓰레드가 i값을 가지고 와서 쓰는 경우다.

     

    즉, 쓰레드가 i값을 가지고 온 순간이 달라서 그렇다.

    해결책은 밑에서 알아보도록 하자.

     

    프로그램 실행결과

     

    소스 파일

    ThreadMain4.java
    0.00MB

     

    이에 대한 해결책으로 synchronized()함수를 통해 static 변수 i를 동기화 시키자.

    synchronized함수의 매개변수로는 동기화 시킬 클래스 명을 대입하면 된다.

    그런데, 실행해 보면 스레드A가 모든 처리를 하는 것을 볼 수 있다.

    이는 스레드는 기본적으로 시 분할 방식인데
    워낙 빨라서 해당 스레드가 이 시간 내에 모든 것을 전부 처리했기 때문이다.

    프로그램 실행결과

    소스 파일

    ThreadMain5.java
    0.00MB

     

    그래서, 이와 같은 경우에 sleep함수를 이용하자.

    그런데 sleep함수를 적용해도 스레드 A만 호출이 된다.

    이에 대한 해결책은 좀 더 찾아봐야 겠다.

    프로그램 실행결과

    소스 파일

    ThreadMain5.java
    0.00MB

     

    'JAVA > Thread' 카테고리의 다른 글

    Thread join  (0) 2020.10.12
    Thread의 State  (0) 2020.10.12
    스레드 자원의 동기화 (키워드 synchronized)  (0) 2020.10.12
    Thread의 기초  (0) 2020.10.07

    댓글

Designed by Tistory.