멀티스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것을 말한다. 자바에서는 Thread 클래스와 Runnable 인터페이스를 사용하여 스레드를 생성하고 제어할 수 있다.
// Thread 클래스를 상속받아 스레드 생성
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " - " + i);
}
}
}
// Runnable 인터페이스를 구현하여 스레드 생성
class MyRunnable implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
}
}
}
public class Main {
public static void main(String[] args) {
// Thread 클래스를 상속받은 스레드 시작
MyThread thread1 = new MyThread();
thread1.start();
// Runnable 인터페이스를 구현한 스레드 시작
Thread thread2 = new Thread(new MyRunnable());
thread2.start();
}
}
동기화는 여러 스레드가 동시에 공유 자원에 접근할 때 발생할 수 있는 문제를 방지하기 위한 기술이다. 자바에서는 synchronized 키워드를 사용하여 동기화 블록을 지정할 수 있다.
class Counter {
private int count = 0;
// 동기화 메서드
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
class CounterThread extends Thread {
private Counter counter;
public CounterThread(Counter counter) {
this.counter = counter;
}
public void run() {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
}
}
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
CounterThread thread1 = new CounterThread(counter);
CounterThread thread2 = new CounterThread(counter);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final count: " + counter.getCount());
}
}
동기화 블록을 사용하면 메서드 전체가 아닌 특정 블록만 동기화할 수 있다. 이렇게 하면 성능을 향상시킬 수 있다.
class Counter {
private int count = 0;
public void increment() {
synchronized (this) {
count++;
}
}
public int getCount() {
return count;
}
}
멀티스레딩은 성능 향상을 위해 중요한 기술이며, 자바에서는 Thread
클래스와 Runnable
인터페이스를 사용하여 스레드를 생성할 수 있다. 그러나 멀티스레딩 환경에서는 동기화 문제를 신경 써야 하며, 이를 위해 synchronized
키워드를 사용하여 동기화 블록을 지정할 수 있다. 동기화는 공유 자원의 일관성을 유지하고, 스레드 간의 충돌을 방지하는 데 필수적이다. 이번 TIL에서는 멀티스레딩과 동기화의 기본 개념과 자바에서의 구현 방법을 살펴보았다.