-
스핀락,뮤텍스,세마포에 대해 각각 정의 및 차이 with 예제 코드 java컴퓨터과학 2024. 5. 27. 11:04728x90반응형
1. 스핀락(Spinlock)
정의
스핀락은 락을 획득하기 위해 루프를 돌며(lock을 획득할 때까지) 락의 상태를 계속 확인하는 방식의 동기화 메커니즘입니다. CPU 사이클을 소모하면서도, 락을 빠르게 획득할 수 있을 때 유리합니다. 특히, 락이 짧은 시간 동안 점유될 때 유리합니다.
특징
- 바쁜 대기(busy-waiting)를 사용하여 CPU 사이클을 소모합니다.
- 멀티코어 시스템에서 락을 빠르게 획득할 수 있을 때 유리합니다.
- 오래 대기할 경우 성능 저하가 발생할 수 있습니다.
import java.util.concurrent.atomic.AtomicBoolean; class Spinlock { private final AtomicBoolean lock = new AtomicBoolean(false); public void acquire() { while (!lock.compareAndSet(false, true)) { // busy-wait } } public void release() { lock.set(false); } } public class SpinlockExample { private static int sharedCounter = 0; private static final Spinlock spinlock = new Spinlock(); public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { threads[i] = new Thread(() -> { for (int j = 0; j < 100000; j++) { spinlock.acquire(); sharedCounter++; spinlock.release(); } }); threads[i].start(); } for (Thread thread : threads) { thread.join(); } System.out.println("Final counter value: " + sharedCounter); } }
2. 뮤텍스(Mutex)
정의
뮤텍스는 하나의 스레드만이 접근할 수 있도록 하는 락입니다. 뮤텍스는 스레드가 락을 획득할 때까지 대기하며, 락을 획득한 스레드만이 공유 자원에 접근할 수 있습니다.
특징
- 상호 배제(mutual exclusion)를 보장합니다.
- 락을 획득하지 못한 스레드는 대기 상태로 들어갑니다.
- OS에 의해 관리되며, 일반적으로 효율적입니다.
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MutexExample { private static int sharedCounter = 0; private static final Lock mutex = new ReentrantLock(); public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { threads[i] = new Thread(() -> { for (int j = 0; j < 100000; j++) { mutex.lock(); try { sharedCounter++; } finally { mutex.unlock(); } } }); threads[i].start(); } for (Thread thread : threads) { thread.join(); } System.out.println("Final counter value: " + sharedCounter); } }
3. 세마포어(Semaphore)
정의
세마포어는 지정된 개수만큼의 스레드가 자원에 접근할 수 있도록 허용하는 동기화 도구입니다. 세마포어는 주로 두 가지 타입이 있습니다: 카운팅 세마포어와 바이너리 세마포어(뮤텍스와 유사함). 카운팅 세마포어는 여러 개의 스레드가 접근할 수 있는 자원의 개수를 나타냅니다.
특징
- 지정된 개수의 스레드가 접근할 수 있습니다.
- 접근할 수 있는 스레드의 개수를 제한하여 자원의 과도한 사용을 방지합니다.
import java.util.concurrent.Semaphore; public class SemaphoreExample { private static int sharedCounter = 0; private static final Semaphore semaphore = new Semaphore(5); // 최대 5개의 스레드가 접근 가능 public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { threads[i] = new Thread(() -> { for (int j = 0; j < 100000; j++) { try { semaphore.acquire(); sharedCounter++; } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } }); threads[i].start(); } for (Thread thread : threads) { thread.join(); } System.out.println("Final counter value: " + sharedCounter); } }
차이점 요약
- 스핀락: 바쁜 대기를 통해 락을 획득, 짧은 시간 락 점유에 유리.
- 뮤텍스: 하나의 스레드만 접근 가능, 대기 상태에서 락을 획득.
- 세마포어: 지정된 개수만큼 스레드가 접근 가능, 자원의 과도한 사용을 방지.
728x90반응형'컴퓨터과학' 카테고리의 다른 글
JSON 마셜링/언마셜링이란? (0) 2024.05.23 컨슈머 스레드(Consumer Thread)와 프로듀서 스레드(Producer Thread) (0) 2024.05.23 cpu바운드 프로그램 멀티쓰레딩에 최적의 스레드 개수 결정 방법 및 멀티쓰레딩 개발에 주의할점 (0) 2024.05.22 프로세스 컨텍스트 스위칭과 스레드 컨텍스트 스위칭 정의 및 차이 with 예제 python (0) 2024.05.22 단일프로세스,멀티프로그래밍,멀티태스킹,멀티프로세싱,컨텍스트 스위칭,스레드,멀티쓰레드란 무엇인가? (0) 2024.05.17