Synchronize와 AtomicBoolean은 Java에서 멀티스레딩 프로그래밍에서 자주 사용된다. 각각의 용도와 사용방법을 알아보도록 하자.
1. Synchronize
synchronize 키워드는 특정 블록이나 메서드에 대해 스레드가 동시에 접근하지 못하도록 동기화한다. 이는 주로 임계 영역(critical section)을 보호하는 데 사용된다. synchronized 키워드를 사용하면 한 번에 하나의 스레드만 해당 블록을 실행할 수 있다.
(1) SynchronizedExample.java
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
public static void main(String[] args) throws InterruptedException {
SynchronizedExample example = new SynchronizedExample();
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
example.increment();
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("Final count : " + example.getCount());
}
}
위의 예제에서 increment 메서드는 synchronized로 선언되어 있어 여러 스레드가 동시에 접근할 수 없다. 따라서, count 변수는 안전하게 증가할 수 있다.
2. AtomicBoolean
AtomicBoolean은 원자적(atomic)으로 boolean 값을 업데이트할 수 있는 클래스이다. 원자적 업데이트란 여러 스레드가 변수에 동시에 접근하더라도 한 번에 하나의 스레드만 변수의 값을 변경할 수 있음을 의미한다. AtomicBoolean은 락을 사용하지 않고 동기화를 보장하기 때문에 성능이 좋다.
(1) AtomicBooleanExample.java
import java.util.concurrent.atomic.AtomicBoolean;
public class AtomicBooleanExample {
private AtomicBoolean flag = new AtomicBoolean(false);
public void setTrue() {
flag.set(true);
}
public boolean isTrue() {
return flag.get();
}
public static void main(String[] args) throws InterruptedException {
AtomicBooleanExample example = new AtomicBooleanExample();
Runnable task = () -> {
if (example.flag.compareAndSet(false, true)) {
System.out.println("Flag was false, setting it to true");
} else {
System.out.println("Flag was already true");
}
};
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("Final flag state : " + example.isTrue());
}
}
위의 예제에서 compareAndSet 메서드는 flag가 false인 경우에만 true로 설정하고, 그렇지 않으면 아무 작업도 수행하지 않는다. 이 작업은 원자적으로 수행되기 때문에 동기화가 필요 없다.
3. 차이점
- synchronize : 특정 코드 블록 또는 메서드에 대해 동기화를 보장하여 여러 스레드가 동시에 접근하는 것을 방지
- AtomicBoolean : 락 없이 원자적 boolean 업데이트를 제공하여 더 나은 성능을 제공
한 번에 여러 레드가 동시에 접근할 수 없다는 것에 공통점이 있지만 사용되는 용도나 성능 그리고 방법에 차이가 있다. 각각의 용도를 검토하고 멀티스레딩 환경에서 적절하게 사용하면 비동기 환경에서의 데이터값을 유지하는 것에 도움이 될 것이다.
단순하게 멀티스레딩 환경에서 synchronize와 AtomicBoolean을 사용하자 라고 생각하기 보단 적절하게 사용이 필요한 것 같다. 무작정 synchronize를 남발하면 성능저하를 일으킬 수 있기 때문이다. 반면AtomicBoolean의 사용은 원자적 클래스를 사용하여 성능 개선과 동기화를 유지할 수 있다. 사용 전 용도에 따라 적절히 코드를 작성해보도록 하자.
'Android > Android Java' 카테고리의 다른 글
[Android Java] TreeView (0) | 2023.12.20 |
---|---|
[Android Java] China Push, Doze Mode (0) | 2023.11.23 |
[Android Java] 사진, 동영상 촬영(ActivityResultLauncher, Scoped Storage) (0) | 2023.11.22 |
[Android Java] Scoped Storage 대응 (1) | 2023.11.21 |
[Android Java] Notification Action, RemoteInput (1) | 2023.11.13 |