>Java >java지도 시간 >Java에서 잠금 메커니즘을 사용하여 스레드 동기화를 달성하는 방법은 무엇입니까?

Java에서 잠금 메커니즘을 사용하여 스레드 동기화를 달성하는 방법은 무엇입니까?

WBOY
WBOY원래의
2023-08-02 13:47:021284검색

스레드 동기화를 달성하기 위해 Java에서 잠금 메커니즘을 사용하는 방법은 무엇입니까?

멀티 스레드 프로그래밍에서 스레드 동기화는 매우 중요한 개념입니다. 여러 스레드가 동시에 공유 리소스에 액세스하고 수정하면 데이터 불일치 또는 경쟁 조건이 발생할 수 있습니다. Java는 이러한 문제를 해결하고 공유 리소스에 대한 스레드로부터 안전한 액세스를 보장하기 위한 잠금 메커니즘을 제공합니다.

Java의 잠금 메커니즘은 동기화된 키워드와 잠금 인터페이스를 통해 제공됩니다. 다음으로 이 두 가지 메커니즘을 사용하여 스레드 동기화를 달성하는 방법을 알아봅니다.

Synchronized 키워드를 사용하여 스레드 동기화를 구현하는 예:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

class IncrementThread extends Thread {
    private Counter counter;

    public IncrementThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            counter.increment();
        }
    }
}

public class SynchronizedExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        IncrementThread thread1 = new IncrementThread(counter);
        IncrementThread thread2 = new IncrementThread(counter);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("Final count: " + counter.getCount());
    }
}

위 예에서 Counter 클래스에는 카운터 값을 나타내는 count 변수가 있습니다. increment() 메서드는 동기화된 키워드로 수정됩니다. 즉, 언제든지 하나의 스레드만 count 변수에 액세스하고 수정할 수 있음을 의미합니다. 카운터 값을 얻을 때 스레드 안전성을 보장하기 위해 getCount() 메서드도 동기화된 키워드로 수정되었습니다.

IncrementThread 클래스는 Counter 객체를 생성자 매개변수로 받아들이고 run() 메서드에서 increment() 메서드를 호출하여 카운터 값을 증가시키는 스레드 클래스입니다.

메인 프로그램에서는 두 개의 IncrementThread 스레드를 생성하고 이를 각각 두 개의 스레드 인스턴스에 전달합니다. 그런 다음 이 두 스레드를 시작하고 Join() 메서드를 사용하여 완료될 때까지 기다립니다. 마지막으로 최종 카운터 값을 인쇄합니다.

Lock 인터페이스를 사용하여 스레드 동기화를 구현하는 예:

class Counter {
    private int count = 0;
    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

class IncrementThread extends Thread {
    private Counter counter;

    public IncrementThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            counter.increment();
        }
    }
}

public class LockExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        IncrementThread thread1 = new IncrementThread(counter);
        IncrementThread thread2 = new IncrementThread(counter);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("Final count: " + counter.getCount());
    }
}

위의 예에서 Lock 인터페이스는 스레드 동기화를 구현하기 위해 Counter 클래스의 increment() 및 getCount() 메서드에 사용됩니다. 메소드의 시작과 끝에서 각각 잠금을 획득하고 해제하기 위해 ReentrantLock 인스턴스를 생성합니다.

IncrementThread 클래스와 메인 프로그램의 코드는 이전 예제와 동일합니다. 스레드 동기화를 달성하려면 Counter 클래스의 동기화 키워드 대신 Lock 인터페이스를 사용하세요.

요약:

멀티 스레드 프로그래밍에서 스레드 동기화는 중요한 개념입니다. Java는 스레드 동기화를 달성하기 위해 동기화된 키워드와 잠금 인터페이스를 제공합니다. 어떤 메커니즘을 사용하더라도 언제든지 하나의 스레드만 공유 리소스에 액세스하고 수정할 수 있으므로 스레드로부터 안전한 액세스가 보장됩니다.

위는 스레드 동기화를 달성하기 위해 Java에서 잠금 메커니즘을 사용하는 샘플 코드입니다. 이러한 예제를 이해하고 연구함으로써 스레드 동기화를 더 잘 적용하여 멀티 스레드 프로그램의 정확성과 성능을 보장할 수 있습니다.

위 내용은 Java에서 잠금 메커니즘을 사용하여 스레드 동기화를 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.