ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스핀락,뮤텍스,세마포에 대해 각각 정의 및 차이 with 예제 코드 java
    컴퓨터과학 2024. 5. 27. 11:04
    728x90
    반응형

     

    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
    반응형
Designed by Tistory.