본문 바로가기

JAVA

[JAVA] 5주차 | 멀티스레드 개념, 동기화 문제

스레드 (Thread)

- 하나의 프로세스 내부에서 동작
- 사용자가 작성한 코드
- JVM에 의해 스케줄링 되는 실행 단위
 

멀티 스레딩

- 하나의 응용프로그램을 동시 처리가 가능한 여러 작업(코드)으로 분할
- 작업 개수만큼 스레드 생성 (각 스레드가 하나의 작업을 처리하는 방식)
- 모든 스레드는 프로세스(응용 프로그램) 내부의 자원과 메모리 공유
- 한 스레드가 대기하는 동안 다른 스레드가 동작. 프로그램 동작 시간 지연을 줄임
 
 
--> 스레드는 무언가의 일을 동시에 하고싶을 때 병렬처럼 쓰입니다.
main함수에서는 main 스레드가 작동하고, 새로운 스레드를 만들어서 .start()로 호출하면 새로운 스레드와 메인 스레드가 동시에 작동합니다.
 

스레드 생성 방법

Thread 클래스를 상속

1) 스레드 상속 받기
2) run 메소드 오버라이딩
3) start()메소드로 호출

Runnable 인터페이스 구현

1) Runnable 구현하기
2) run 메소드 오버라이딩
3) start()메소드로 호출
 

Thread의 start() 메소드 호출: 대기상태로 진입 후 스케줄러가 정한 순서에 따라 해당 Thread가 실행됨
다양한 메소드: start(), yield(), run(), wait(), sleep(), suspend(), resume(), join()
현재 동작중인 스레드 이름 가져오기: Thread.currentThread()
 
 
예제)
main() : print("start ") -> 스레드1("-")호출 -> 스레드1("+")호출 -> print("end ")
스레드 : 받은 문자열을 10번 출력
output : start end ++-+-+--+-+-+-+-+--
 

https://youtu.be/tF9C3rG7Xtw
이 영상의 예제를 참고한 것인데 설명을 잘해주십니다!

 

멀티 스레딩의 문제점

여러 스레드들이 같은 자원을 공유할 때 다음과 같은 문제 발생

스레드 동기화 기법 (Thread Synchronization)

멀티 스레드가 공유 데이터에 동시에 접근할 때 발생하는 문제점의 해결책
- 한 번에 하나의 스레드만 공유 데이터에 접근 가능
 

자바 스레드 동기화 방법

1) synchronized 키워드 사용
2) wait()-notify() 메소드
3) Seamphore 클래스 활용

synchronized를 쓰면 그 부분만 차례대로 실행되어 충돌이 없어짐

synchronized를 사용했을 때 결과가 제대로 출력된 것을 볼 수 있음.

 
sum++ 이라는 단 한줄의 코드인데 왜 충돌이 일어나느냐 묻는다면,

위의 그림과 같이 여러 줄의 바이트 코드로 컴파일 되어 실행되기 때문입니다.

 


이렇게 쓰레드 개념에 대해 알아보았습니다.
쓰레드를 이용하여 채팅 프로그램을 만들 수 있다고 하는데 기회가 되면 만들어 볼 예정입니다.