ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스레드 자원의 동기화 (키워드 synchronized)
    JAVA/Thread 2020. 10. 12. 17:59

    우선 앞에서 스레드는 시 분할 방식이라고 하였다.

    예제1

    프로그램 실행결과

    소스 파일

    StaticLockPrintMain.java
    0.00MB

     

     

    예제2

    위의 소스를 계속 실행해서 프로그램 결과는 세 종류로 나뉜다.

    case1

    case2

    case3

    소스 파일

    MainThread.java
    0.00MB

     

    위의 소스에서 Sleep함수의 주석을 제거해보자.

    주석을 제거한 부분은 아래의 클래스이다.

    프로그램 실행결과

    일반적인 경우라면 USER1에서 100의 값이 출력되어야 하는데, 200이 출력 되는 이유는

    Sleep함수 때문이다.

    User1 쓰레드가 작업을 하려고 할 때 메모리 변수에 100값을 저장하고 나서

    바로 2초 간의 지연이 발생하는데, 이 때 User2쓰레드가 시작 되어 메모리 변수에 200값을 저장하고 나서

    이 User2 쓰레드도 2초 간의 지연이 발생한다.

    이 때 메모리 변수에는 200값이 저장되어 있다.

    지연이 끝난 후에 시작하는 문장이 바로 메모리 변수 값을 출력하는 부분이므로

    User1과 User2 쓰레드는 모두 200이라는 메모리 변수 값을 출력한다.

     

    이번에는 위의 Calculator클래스의 SetMemory메소드에 synchronized 키워드를 붙여보자.

    아래의 소스를 보자.

    위의 소스에서 별 차이가 없으나, 전체를 올리도록 하겠다.

    프로그램 실행결과

    소스 파일

    MainThread.java
    0.00MB

     

    키워드 synchronized를 쓰면 락(lock)이 걸린다.
    user1 스레드의 작업이 모두 완료가 되어야 다음 작업 순서인 user2로 넘어간다.
    이와 같은 역할을 해주는 키워드가 synchronized이다.
    synchronized가 있으면 사용하고 있는 쓰레드 이외의 다른 쓰레드가 접근하지 못한다.
    먼저 진입한 스레드가 우선권을 갖는다.
    user1과 user2가 스레드 함수가 아니면 순차적으로 호출된다.

    위의 소스에서 user1이 user2보다 먼저 진입했기 때문에 user1이 우선권을 갖는다.

    그래서 위의 실행결과를 보듯 user1이 먼저 처리가 되고 user2가 그 이후에 처리가 된다.

     

     

     

    스레드와 sleep 메서드 예제

    우선순위

    - java.lang.MIN_PRIORITY, java.lang.NORM_PRIORITY, java.lang.MAX_PRIORITY

    - setPriority(int p): 현재 스레드의 우선순위를 인자 p로 설정하기 위한 메소드
    - getPriority(): 현재 스레드의 우선순위를 반환하는 메소드

    우선 순위는 1에서 10까지의 값을 갖는다.

     

    프로그램 실행결과로, t1이 끝난 후에 t2,t3가 수행된다.

    소스 파일

    SleepThreadMain.java
    0.00MB

     

     

    sleep()를 적용한 경우

    - 특정 스레드에 CPU의 자원이 집중하는 것을 막을 수 있다.
    - 불규칙적인 동기화는 지원한다.

     

    프로그램 실행결과 : sleep함수를 호출하지 않은 경우

     

    프로그램 실행결과 : sleep함수를 호출한 경우

    소스 파일

    SchedulingTest2.java
    0.00MB

     

     

     

    우선순위를 적용한 예제

     - Thread.MAX_PRIORITY   10
     - Thread.NORM_PRIORITY  5
     - Thread.MIN_PRIORITY   1
     - sleep()의 이용, 우선순위가 적용은 되나 다른 스레드에게 제어권이 자주 넘어감

    프로그램 실행결과

    소스 파일

    SchedulingTest4.java
    0.00MB

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

    Thread join  (0) 2020.10.12
    Thread의 State  (0) 2020.10.12
    Thread와 자원 공유 - 멤버필드, static필드  (1) 2020.10.08
    Thread의 기초  (0) 2020.10.07

    댓글

Designed by Tistory.