매일 조금씩

Thread와 synchronized 본문

Java

Thread와 synchronized

mezo 2022. 2. 14. 19:19
728x90
반응형

스레드

1. Thread란?

프로세스란 간단히 '실행 중인 프로그램'을 뜻하는데..

프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 thread로 구성되어 있다.

프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 thread이다. 

모든 프로세스에는 최소한 하나 이상의 thread가 존재하며, 둘 이상의 thread를 가진 프로세스를 multi-thread 프로세스 라고 한다. 

 

2. Thread 구현과 실행

Thread를 구현하는 방법 두가지

  • Thread 클래스를 상속
  • Runnable 인터페이스를 구현

 

2.1 Thread 클래스

public class ThreadExam01 {
   public static void main(String[] args){
       MyThread01 m1 = new MyThread01("*");
       MyThread01 m2 = new MyThread01("+");
       MyThread01 m3 = new MyThread01("#");
       m1.start();
       m2.start();
       m3.start();
       System.out.println("main메소드 종료.");
  }
}
​
class MyThread01 extends Thread{
   private String str;
   public MyThread01(String str){
       this.str = str;
  }
​
   @Override
   public void run() {
       for(int i = 0; i < 5; i++)
           System.out.print(str);
  }
}

 

2.2 Runnable 인터페이스

public class ThreadExam02 {
   public static void main(String[] args){
       Runnable r1 = new MyThread02("*");
       Runnable r2 = new MyThread02("%");
       Runnable r3 = new MyThread02("#");
       
       //Thread t1 = new Thread(new MyThread02("*"));
       Thread t1 = new Thread(r1);
       Thread t2 = new Thread(r2);
       Thread t3 = new Thread(r3);
       t1.start();
       t2.start();
       t3.start();
       System.out.println("main메소드 종료.");
  }
}
​
class MyThread02 implements Runnable{
   private String str;
   public MyThread02(String str){
       this.str = str;
  }
​
   @Override
   public void run() {
       for(int i = 0; i < 5; i++)
           System.out.print(str);
  }
}

위 Runnable 인터페이스 관련 내용은 '모던자바인액션' 84p에서 Runnable 인터페이스의 업그레이드 버전인 Callable 인터페이스와 함께 언급 된다. (자바 스레드로 병렬로 코드 블록 실행)

 

 

Thread 클래스와 Runnable 인터페이스 둘다 사용하려면 run() 메소드를 상속받아서 오버라이딩 해줘야한다. 

스레드 작업을 해줄 곳에서 start()를 호출해준다. 

start()를 호출하면 스레드를 준비하고 run() 을 실행한다.

 

여기서 Runnable 인터페이스를 구현한 경우 인스턴스 생성방법이 다르다!

Runnable r1 = new MyThread02("*");
Thread t1 = new Thread(r1);
t1.start();

//또는
​
Thread t1 = new Thread(new MyThread02("*"));
t1.start();

 

람다를 활용한 구현은 다음에 다시 정리!

 

 

 

 

Synchronized

멀티스레드 환경에서 발생하는 동기화 문제를 해결하기 위한 키워드이다. 

synchronized 키워드를 사용하면 스레드간 동기화를 시켜 data의 thread-safe를 가능하게한다. 

synchronized는 여러개의 스레드가 한개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념이다. 

변수와 함수에 사용할 수 있다.

너무 남발하면 오히려 프로그램 성능 저하를 일으킬 수 있다. 

 

// 1. 메서드에서 사용하는 경우

public synchronized void method(){// 코드}

 

 

// 2. 객체 변수에 사용하는 경우(block)

private Object obj = new Object();

public void exampleMethod(){ synchronized(obj){//코드 }}

 

 

 

*****

스레드, synchronized라는 것에 대한 개념정리, 어떻게 쓰는지는 알겠는데 가슴 깊이 이해되는 느낌이 아님.

마치 spring 처럼 직접 어디에 써봐야 확실히 안다고 말할 수 있을 거 같은 너낌쓰..

실제 우리 백엔드 코딩에서 어떨때 쓰일까..? 궁금궁금띠 대히쓰 알려줘


 

 

728x90
반응형