>  기사  >  Java  >  Java의 인터페이스와 추상 클래스의 동기화 및 잠금 메커니즘

Java의 인터페이스와 추상 클래스의 동기화 및 잠금 메커니즘

王林
王林원래의
2024-05-01 14:27:01531검색

Java의 인터페이스 및 추상 클래스 동기화 메커니즘: 인터페이스 및 추상 클래스는 인스턴스화할 수 없으며 자체 잠금을 가질 수 없습니다. 일반 메소드와 유사하지만 동기화 키워드를 사용하여 수정되는 동기화된 메소드를 선언할 수 있습니다. 동기화된 메서드가 호출되면 스레드는 해당 메서드의 잠금을 획득합니다. 동일한 메서드를 동시에 호출하는 다른 스레드는 잠금이 해제될 때까지 차단됩니다. 실제 사례: 공유 리소스 클래스 SharedResource에는 두 개의 동기화 메서드가 있습니다. 그러나 메서드 동기화로 인해 스레드는 값의 정확성을 보장하고 동시성을 방지하기 위해 값을 수정하기 전에 잠금에 액세스할 때까지 기다려야 합니다. 문제.

Java 中接口和抽象类的同步与锁机制

Java의 인터페이스와 추상 클래스의 동기화 및 잠금 메커니즘

소개

동기화는 여러 스레드가 공유 리소스에 안전하게 액세스할 수 있도록 보장하는 메커니즘입니다. Java에서는 잠금을 사용하여 동기화를 달성할 수 있습니다. 잠금은 스레드가 잠금을 요청할 때 잠금이 해제될 때까지 다른 스레드가 리소스에 액세스하지 못하도록 차단하는 개체입니다.

인터페이스와 추상 클래스의 동기화

인터페이스와 추상 클래스는 인스턴스화할 수 없으므로 자체 잠금을 가질 수 없습니다. 그러나 일반 메소드와 매우 유사하지만 synchronized 키워드를 사용하여 수정되는 동기화된 메소드를 선언할 수 있습니다. synchronized 关键字修改。

public interface SynchronizedInterface {

    synchronized void synchronizedMethod();

}

public abstract class SynchronizedAbstractClass {

    synchronized void synchronizedMethod();

}

当某个线程调用同步方法时,它将获取该方法的锁。如果另一个线程尝试同时调用同一个方法,它将被阻塞,直到该锁被释放。

实战案例

考虑一个共享资源类 SharedResource,它具有两个同步方法:incrementdecrement

public class SharedResource {

    private int value = 0;

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

    public synchronized void decrement() {
        value--;
    }

}

现在,我们有两个线程 Thread1Thread2,它们并发地访问 SharedResource

public class Thread1 implements Runnable {

    private SharedResource sharedResource;

    @Override
    public void run() {
        for (int i = 0; i < 100000; i++) {
            sharedResource.increment();
        }
    }

}

public class Thread2 implements Runnable {

    private SharedResource sharedResource;

    @Override
    public void run() {
        for (int i = 0; i < 100000; i++) {
            sharedResource.decrement();
        }
    }

}

public class Main {

    public static void main(String[] args) {
        SharedResource sharedResource = new SharedResource();

        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();

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

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final value: " + sharedResource.value);
    }

}

在这个案例中,两个线程并行地调用 incrementdecrement 方法,但由于这些方法是同步的,因此每个线程在修改 value 之前都必须等待对锁的访问。这确保了 valuerrreee

스레드가 동기화된 메서드를 호출하면 해당 메서드의 잠금을 획득합니다. 다른 스레드가 동시에 동일한 메서드를 호출하려고 하면 잠금이 해제될 때까지 해당 스레드가 차단됩니다. 🎜🎜🎜실용 사례🎜🎜🎜두 가지 동기화 방법인 incrementdecrement가 있는 공유 리소스 클래스 SharedResource를 생각해 보세요. 🎜rrreee🎜이제 SharedResource에 동시에 액세스하는 두 개의 스레드 Thread1Thread2가 있습니다. 🎜rrreee🎜이 경우 두 스레드가 incrementdecrement 메서드를 병렬로 호출하지만 이러한 메서드가 동기화되므로 각 스레드가 값을 수정하고 있습니다 code>는 먼저 잠금에 대한 액세스를 기다려야 합니다. 이렇게 하면 <code>value 값이 항상 정확하고 동시성 문제가 발생하지 않습니다. 🎜

위 내용은 Java의 인터페이스와 추상 클래스의 동기화 및 잠금 메커니즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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