📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 스레드란
  • Thread 클래스와 Runnable 인터페이스
  • Thread 클래스를 상속받아 스레드 만들기
  • Runnable 인터페이스로 스레드 만들기
  • 스레드의 상태
  • 스레드의 우선순위
  • Main스레드
  • 동기화
  • 데드락
  • 참고

Was this helpful?

  1. WS 온라인 자바 스터디

Week10(멀티쓰레드 프로그래밍)

스레드란

스레드(thread)란 직역하면 바느질 할 때 사용하는 '실'이다. 바늘에 꿰어진 하나의실로 하나의 바느질 작업만 할 수 있다.

컴퓨터에서 사용하는 스레드는 thread of control의 준말이다

하나의 실로 하나의 바느질 밖에 없듯 이, 하나의 스레드로 하나의 작업밖에 처리할 수 없다

구체적으로 스레드는 운영체제나 JVM에서 태스크를 실행하는 단위로써, 운영체제나 JVM에 의해 관리되는 단위

JVM은 하나의 태스크를 실행하기 위해 하나의 스레드를 만들고, 스레드로 하여금 태스크 코드를 실행하게 한다

Thread 클래스와 Runnable 인터페이스

자바 스레드를 만들기 위해서는 두 가지 작업이 필요하다

  • 스레드 코드 작성

  • JVM에서 스레드를 생성하고 스레드 코드를 실행하도록 요청

스레드 코드를 작성하는 방법

  • Thread 클래스 이용

  • Runnable 인터페이스 이용

Thread 클래스를 상속받아 스레드 만들기

  • Thread 클래스의 경로명은 java.lang.Thread

  • Thread 클래스를 상속받아 원하는 스레드 코드를 생성할 수 있다.

  • Thread 클래스는 스레드를 만들고 유지 관리하기 위해 다양한 메소드를 제공

    • Thread 생성자

      • Thread() : 스레드 객체 생성

      • Thread(Runnable target) : Runnable객체인 target을 이용하여 thread객체 생성

      • Thread(String name) : 이름이 name인 스레드 객체 생성

      • Thread(Runnable target, String name) : Runnable 객체를 이용하여, 이름이 name인 스레드 객체 생성

    • Thread 메소드

      • void run() : 스레드가 실행할 부분

      • void start() : JVM에서 스레드 실행을 시작하도록 요청

      • void interrup() : 스레드 강제 종료

      • static void yield() : 다른 스레드에게 실행을 양보

      • void join() : 스레드가 종료할 때까지 기다림

      • long getId() : 스레드의 ID값 리턴

      • String getName() : 스레드의 이름 리턴

      • int getPriority() : 스레드의 우선순위값 리턴 ( 1- 10 사이)

      • void setPriority(int n) : 스레드의 우선순위 값을 n으로 변경

      • Thread.State getState() : 스레드의 상태 값 리턴

      • static void sleep(long mills) : 스레드는 mills 시간 동안 잔다. mills의 단위는 밀리초

      • static Thread currentThread() : 현재 실행중인 스레드 객체와 래퍼런스 리턴

Thread 클래스 작성

class TimerThread extends Thread{
  @Override
    public void run(){
    //실행할 것을 기술
  }
}

//사용
TimerThread th = new TimerThread();
th.start();
  • Thread 클래스 상속

    • extends 키워드를 사용해서 상속

  • run() 메소드 오버라이딩

    • run() 메소드에 작성된 코드를 스레드 코드라고 부른다.

    • 스레드는 run()에서부터 실행을 시작하고 run()이 종료하면 스레드도 종료한다.

    • run()을 오버라이딩 하지 않는다면 Thread클래스에 작성된 run()이 실행되며 run()은 아무런 일도 하지 않고 단순히 리턴하도록 작성되어있기 때문에 스레드가 바로 종료

  • 스레드 객체 생성

    • 스레드 객체의 생성은 그냥 객체의 생성에 불과함

    • 스레드는 다른 객체와는 다르게 JVM에 등록되어 JVM에 의해 스케쥴링 되어야 비로소 작동

  • 스레드의 시작 : start() 메소드 호출

    • Thread 클래스의 start() 메소드를 호출

    • start() 메소드는 Thread에 구현된 메소드이며 개발자가 오버라이딩 하면 안된다

    • start()메소드는 생성된 스레드 객체를 스케쥴링이 가능한 상태로 전환하도록 JVM에게 지시한다

    • 이후 스케쥴링에 의해 이 스레드가 선택되면 비로소 JVM에 의해 run() 메소드가 호출되어 실행을 시작

Runnable 인터페이스로 스레드 만들기

Runnable은 클래스가 아닌 인터페이스로써 경로명 java.lang.Runnable이며, 다음과 같이 추상 메소드를 run()하나만 가지고 있다.

interface Runnable{
    public void run();
}

아래는 Runnable 인터페이스의 run()을 구현한 TimerRunnable 클래스를 작성하고 스레드를 생성하는 코드임.

class TimerRunnable implements Runnable{
    int n = 0;
    @Override
    public void run(){
        while(true){
            System.out.println(n);
            n++;
            try{
                Thread.sleep(1000);
            }
            catch(InterruptedException e){
                return;
            }
        }
    }
}

//사용
Thread th = new Thread(new TimerRunnable());
th.start();
  • Runnable 인터페이스 구현

    • implements로 받아서 사용

  • run() 메소드 오버라이딩

    • run()메소드는 스레드 코드이며 run()이 종료되면 스레드도 종료된다

  • 스레드 객체 생성

    • Thread th = new Thread(new TimerRunnable());

  • start() 메소드 호출

    • th.start()는 생성된 스레드 객체 th를 스케쥴링이 가능한 상태로 전환하도록 JVM에게 지시하고 이후 JVM에 의해 이 스레드가 선택되면 이 스레드의 run() 메소드가 호출되고 실행

스레드의 상태

스레드는 생명 주기를 가진다 그리고 그 생명 주기 동안 여러 상태의 변이를 거친다.

스레드의 상태는 총 6가지이며 JVM에 의해서 관리된다

  • NEW : 스레드가 생성되었지만 아직 실행할 준비가 되지 않은 상태이다. start() 메소드가 호출되면 RUNNABLE 상태가 된다

  • RUNNABLE : 스레드가 현재 실행되고 있거나 실행 준비되어 스케쥴링을 기다리는 상태

  • TIMED_WAITING : 스레드가 sleep(long n)을 호출하여 n밀리초 동안 잠을 자는 상태

  • BLOCK : 스레드가 I/O 작업을 실행하고 완료를 기다리면서 멈춘 상태

  • WAITING : 스레드가 어떤 객체 a에 대해서 a.wait()을 호출하여 다른 스레드가 a.notify()나 a.notifyAll()을 불러줄 때 까지 무한정 기다리는 상태

  • TERMINATED : 스레드가 종료한 상태, 더 이상 다른 상태로 변이할 수 없ㅇ므

스레드의 일생

  1. new Thread()에 의해 스레드 객체가 생성되면 JVM은 생성된 스레드 정보를 관리, 생성된 스레드는 NEW 상태이다

    • NEW 상태의 스레드는 스케쥴링되지 않기 때문에 실행될 수 없는 상태이다.

    • 스케쥴링이란 JVM이 RUNNABLE(준비) 상태인 스레드 중에서 하나를 선택하여 실행시키는 과정

  2. Thread 클래스의 start() 메소드가 호출되면 스레드는 비로소 실행될 수 있는 RUNNABLE(준비) 상태가 된다.

    • JVM은 RUNNABLE상태에 있는 스레드 중에서 하나를 선택, 실행함

    • 처음으로 스케줄링되는 스레드는 run() 메소드의 첫 라인부터 실행을 시작

    • JVM은 스케쥴링 시 우선순위가 높은 스레드를 우선적으로 선택

    • 만약 우선순위가 동일한 스레드가 여러개가 있으면 라운드로빈방식으로 진행

  3. 만약 우선 실행 중인 스레드가 I/O 작업을 하게 되면 -> JVM에 의해 즉각 중지되면 BLOCK상태가 된다

    • BLOCK상태의 스레드는 I/O 작업이 완료될 때 까지 스케쥴링 되지 않고 대기함

    • I/O작업이 완료되면 스레드는 자동으로 RUNNABLE 상태가 된다

  4. 실행 중인 스레드가 만일 yield()를 호출하면 다른 스레드가 스케쥴링 될 수 있도록 양보하겠다는 의미로, JVM은 현재 실행 중인 스레드를 즉각 RUNNABLE 상태로 변경하고 스케쥴링을 실시한다. 만일 다른 높은 우선순위의 스레드가 없거나 동일한 우선 순위의 다른 스레드가 없으면 이 스레드가 다시 스케쥴링된다

  5. 실행 중인 스데르가 sleep(millis)을 호출하면 mills 밀리초 시간만큼 잠을 자게되므로 JVM은 이 스레드를 TIMED_WAITING 상태로 변경하고 스케쥴링을 시작한다. 이 스레드는 millis 밀리초 후 깨어나 RUNNABLE상태가 된다

스레드의 우선순위

JVM은 철저히 우선순위를 기반으로 스레드를 스케줄링한다. 가장 높은 우선순위의 스레드를 먼저 실행시킨다.

만약 동일한 우선순위일 경우에는 돌아가면서 실행시킨다.

우선순위이 체계

  • 최대값(MAX_PRIORITY) = 10

  • 최소값(MIN_PRIORITY) = 1

  • 보통값(NORMAL_PRIORITY) = 5

자바 응용프로그램이 실행될 때 처음으로 생성되는 main 스레드는 보통 값의 우선순위로 태어나며

자식 스레드는 생성될 때 부모 스레드의 우선순위 값을 물려받기 때문에

main스레드의 모든 자식 스레드는 보통값(5)의 우선순위를 가지고 탄생

우선순위의 변경이 필요할 때

void setPriority(int newPriority)

이걸로 우선순위 값을 변경

우선순위의 값이 필요할 때

int getPriority();

이걸로 우선순위의 값을 가져옴

Main스레드

JVM은 자바 응용 프로그램을 실헹하기 전에 사용자 스레드를 하나 만들고 이 스레드로 하여금 main()을 실행하게 한다.

이것이 main스레드이고 실행 시작 주소는 main() 메소드의 첫 코드가 된다.

이렇게 되면 자바 응용 프로그램을 실행하게되면 main스레드와 JVM내에서 자동으로 생성된 가비지 컬렉션 스레드 2개의 스레드가 존재하게 된다

main스레드의 정보 출력

public class ThreadMainEx{
    public static void main(String [] args){
    //스레드 아이디얻기
    long id = Thread.currentThread().getId();
    //스레드 이름 얻기
    String name = Thread.currentThread().getName();
    //스레드 우선순위값 얻기
    int priority = Thread.currentThread().getPriority();
    //스레드 상태 값 얻기
    Thread.State s = Thread.curentThread().getState();

    System.out.println("현재 스레드 아이디 : "+id);
    System.out.println("현재 스레드 이름 : "+name);
    System.out.println("현재 스레드 우선순위 : "+priority);
    System.out.println("현재 스레드 값 : "+s);

  }
}

동기화

A와 B가 하나의 화이트 보드에 옮긴 총 물건의 갯수를 집계를 한다고 가정을 해보자

둘 다 10개씩 옮겨서 +10을 기록해야하는 상황에서 현재 집계수는 50이다

A가 먼저 작성하고 있는 도중에

B가 기록을 하게 된다면

A는 50 + 10 = 60 값을 작성하고있을것이고

그 사이에 B는 50 + 10 = 60을 작성할것이다

실제로는 A가 10개, B가 10개를 옮겼기 때문에 마지막이 70이 되어야 하지만

결과값은 60이다

멀티스레드 프로그램을 작성할 때 주의할 점은 스레드가 공유 데이터에 동시에 접근하는 경우에 대한 처리.

이에 대한 해결책이 스레드 동기화이다(Thread Synchronization)

  • 스레드 동기화란 공유 데이터에 접근하고자 하는 다수의 스레드가 서로 순서대로 충돌 없이 공유 데이터를 배타적으로 접근하기 위해 상호 협력하는 것을 말한다.

  • 공유 데이터에 대한 접근은 배타적이고 독점적으로 이루어져야 하며, 독점적으로 공유 데이터를 다루는 프로그램 코드를 임계 영역이라고 부른다

방법

  • synchronized로 동기화 블록 지정

    • 가장 쉬운 방법으로, 스레드가 공유 데이터를 접근할 때 하나씩 순차적으로 실행하도록 제어하는 기법

    • 하나의 스레드가 공유 데이터에 접근을 시작한 순간, 데이터를 잠가(lock) 다른 스레드가 대기하도록 하는 방식

    • synchronized키워드는 스레드 동기화를 위한 장치로써, 임의의 코드 블록을 동기화가 설정된 임계 영역으로 지정한다.

    • synchronized 블록은, 진입할 때 lock이 걸리고, 빠져나올 때 unlock 동작이 자동으로 이루어지도록 컴파일된다.

      메소드 전체를 임계영역으로 지정

    • synchronized void add(){
        //현재 합을 알아내고
          int n = getCurrentSum();
        //10만큼 증가시키고
        n+=10;
        //증가된 결과를 기록한다
        setCurrentSum(n);
      }
      • 이렇게 synchronized를 선언하면 add()메소드를 통째로 임계 영역으로 지정

      • add() 메소드가 호출되면 자동으로 동기화되고 한 스레드가 add() 메소드를 호출하여 실행하고 있는 도중에 다른 스레드가 add() 메소드를 호출하면 이 스레드는 첫 번째 스레드가 add() 실행을 마치고 완전히 빠져나오기까지 자동으로 대기하게 된다

코드 블록을 임계 영역으로 지정
  • void execute(){
        .....
      synchronized(this){
        int n = getCurrentSum();
        n += 10;
        setCurrentSum(n);
      }
      .....
    }
    • 한 스레드가 synchronized 블록 내의 코드를 실행하고 있을 때 다른 스레드가 이 블록을 실행하고자 하면, 먼저 실행 중인 스레드가 synchronized 블록의 실행을 마칠 때까지 자동으로 대기

    • 여기서 synchronized(this)는 synchronized 블록에서 인자로 주어진 객체와 연계된 lock을 사용하도록 개발자가 지정한 것

데드락

교착상태(deadlock)이란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 아무도 완료하지 못하는 상태-위키백과

조건

  • 상호배제 : 프로세스들이 필요로 하는 자원에 대해서 배타적인 통제권을 요구

  • 점유대기 : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림

  • 비선점 : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다

  • 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있음

예방

  • 상호배제 조건의 제거 : 교착 상태는 두 개 이상의 프로세스가 공유 가능한 자원을 사용할 때 발생하는 것이므로 공유 불가능한, 즉 상호 배제 조건을 제거하면 교착 상태를 해결가능

  • 점유대기 조건의 제거 : 한 프로세스에 수행되기 전에 모든 자원을 할당시키고 나서 점유하지 않을 때에는 다른 프로세스가 자원을 요구하도록 하는 방법

  • 비선점 조건의 제거 : 비선점 프로세스에 대해 선점 가능한 프로토콜을 만들어 준다

  • 환형 대기 조건의 제거 : 자원 유형에 따라 순서를 매김

참고

명품 JAVA Programming - 저자 황기태

PreviousWeek9(예외처리)NextWeek11(Enum)

Last updated 3 years ago

Was this helpful?