백엔드 개발 PHP 튜토리얼 동기화를 사용하여 잠금 코드를 구현하는 방법에 대한 자세한 설명

동기화를 사용하여 잠금 코드를 구현하는 방법에 대한 자세한 설명

Dec 20, 2017 am 11:56 AM
lock synchronized

이 글에서는 동기화를 사용하여 Lock 코드를 구현하는 방법을 소개합니다. 다음은 도움이 필요한 친구들이 참고할 수 있는 사례입니다.

방법 1:

public synchronized void a(){
  //TODO
}
로그인 후 복사


방법 2:

public void b(){
  synchronized(this){
    //TODO
  }
}
로그인 후 복사


이 두 가지 방법 중 {} 사이에 잠금이 추가됩니다.

public void c() {
  lock.lock();
  try {
    // TODO
  } finally {
    lock.unlock();
  }
}
로그인 후 복사


이 lock()과 Unlock() 사이에 일종의 잠금이 추가되므로 잠금 기능을 구현하려면 lock()과 Unlock() 두 가지 메서드를 구현하는 방법을 먼저 생각하고 프레임워크를 정의해야 합니다. 다음과 같습니다:

public void lock(){
}
public void unlock(){
}
로그인 후 복사


그런 다음 동기화를 사용하여 이 두 가지 방법을 구현하는 방법을 생각해 보세요.

이제는 실제로 약간 더 명확한 아이디어가 있지만 여전히 이 두 가지 방법을 어떻게 채울지 모르겠습니다. 나중에 Lock의 특성을 분석한 다음 다음 코드를 살펴보겠습니다.

public void c() {
    lock.lock();
    //When current thread get the lock, other thread has to wait
    try {
        //current thread get in the lock, other thread can not get in
        // TODO
    }
    finally {
        lock.unlock();
        //current thread release the lock
    }
}
로그인 후 복사


이 코드에 몇 가지 설명만 추가하고 다른 작업은 하지 않았습니다. 이 코드를 이해하고 가장 자주 사용되는 단어인 currentthread가 무엇인지 확인하는 데 도움이 될까요? 그런 다음 lock() 및 Unlock( )을 채워 보겠습니다. 방법, 해결책을 찾기 위해 currentthread 키워드를 잡는 데 주의를 기울여야 할까요? 대답은 '예'입니다.

다음으로, 동기화를 사용할 때 스레드를 대기시키는 방법을 분석해 보세요. wait() 메소드를 사용하십시오. 스레드를 깨우는 방법은 무엇입니까? 통지() 메소드를 사용하십시오. 그런 다음 lock() 메서드의 wait() 메서드를 사용하고 Unlock() 메서드의 inform() 메서드를 사용합니다. 그러면 wait()와 inform()을 사용할 때 조건이 있습니다. 어떤 조건을 사용해야 할까요?

현재 잠금이 점유되어 있는지 여부를 판단 조건으로 사용해야 합니다. 잠금이 점유되어 있으면 현재 스레드가 대기합니다. 동기화를 사용할 때 항상 이 조건을 사용해 왔는지 생각해 보세요. 대답은 '예'입니다.

언제 잠금을 해제하고 어떤 조건을 사용하는지 분석해 보겠습니다. 스레드 A가 잠금을 얻으면 스레드 B가 잠금을 해제할 수 있을까요? 물론 그렇지 않습니다. B를 석방할 수 있다면 이는 원칙을 위반하는 것입니다. 스레드 A의 잠금은 스레드 A에 의해서만 해제될 수 있어야 합니다. 따라서 판단 조건은 잠금을 보유하고 있는 스레드가 현재 스레드인지 여부를 판단하는 것입니다. 그렇다면 해제할 수는 없습니다.

이제 전체 코드를 살펴보겠습니다.

package test.lock;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class NaiveLock {
    private static final long NONE = -1;
    private long owner = NONE;
    private Boolean isLooked() {
        return owner != NONE;
    }
    public synchronized void lock() {
        long currentThreadId = Thread.currentThread().getId();
        if (owner == currentThreadId) {
            throw new IllegalStateException("Lock has been acquired by current thread");
        }
        while (this.isLooked()) {
            System.out.println(String.format("thread %s is waitting lock", currentThreadId));
            try {
                wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        owner = currentThreadId;
        System.out.println(String.format("Lock is acquired by thread %s", owner));
    }
    public synchronized void unlock() {
        if (!this.isLooked() || owner != Thread.currentThread().getId()) {
            throw new IllegalStateException("Only Lock owner can unlock the lock");
        }
        System.out.println(String.format("thread %s is unlocking", owner));
        System.out.println();
        owner = NONE;
        notify();
    }
    public static void main(String[] args) {
        final NaiveLock lock = new NaiveLock();
        ExecutorService executor = Executors.newFixedThreadPool(20, new ThreadFactory() {
            private ThreadGroup group = new ThreadGroup("test thread group");
            {
                group.setDaemon(true);
            }
            @Override
                  public Thread newThread(Runnable r) {
                return new Thread(group, r);
            }
        }
        );
        for (int i = 0; i < 20; i++) {
            executor.submit(new Runnable() {
                @Override
                        public void run() {
                    lock.lock();
                    System.out.println(String.format("thread %s is running...", Thread.currentThread().getId()));
                    try {
                        Thread.sleep(new Random().nextint(1000));
                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.unlock();
                }
            }
            );
        }
    }
}
로그인 후 복사


실행하고 결과를 확인하세요.

Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
  
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
  
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 22 is unlocking
  
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
  
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
  
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
  
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
  
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
  
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
  
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
  
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
  
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
  
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
  
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
  
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
  
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
로그인 후 복사


for 루프를 30번으로 변경하면 결과를 확인하세요. 다시:

Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 8 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 26 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 25 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 27 is waitting lock
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 24 is waitting lock
thread 23 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 23 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 21 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 20 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 19 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 18 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
  
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
  
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
  
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
  
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
  
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
  
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
  
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
  
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
  
Lock is acquired by thread 8
thread 8 is running...
thread 8 is unlocking
  
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
  
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
  
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
  
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
  
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
  
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
로그인 후 복사


이 사례를 읽으신 후 방법을 마스터하셨다고 믿습니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사에 주목하세요!

관련 자료:

PHP가 스택 데이터 구조 및 대괄호 일치 알고리즘을 구현하는 방법에 대한 자세한 코드 예

PHP에서 가장 간단한 문자열 일치 알고리즘, PHP 일치 알고리즘_PHP 튜토리얼

가장 간단한 문자열 일치 알고리즘 튜토리얼 PHP

위 내용은 동기화를 사용하여 잠금 코드를 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 멀티스레딩에서 잠금을 사용하는 방법 Java 멀티스레딩에서 잠금을 사용하는 방법 May 12, 2023 pm 02:46 PM

Jdk1.5 이후에는 java.util.concurrent.locks 패키지 아래에 스레드 동기화를 구현하는 일련의 인터페이스와 클래스가 있습니다. 스레드 동기화에 관해서라면 누구나 내장된 동기화 키워드를 생각할 수 있습니다. Java의 키워드입니다. 스레드 동기화를 처리하지만 이 키워드는 결함이 많고 사용하기가 매우 편리하지 않으므로 아래에서 Lock을 비교하여 설명하겠습니다. 일반적으로 동기화 키워드를 사용할 때 다음과 같은 문제에 직면하게 됩니다. (1) 통제 불가능성, 잠금을 마음대로 잠그거나 해제할 수 없습니다. (2) 효율성이 상대적으로 낮습니다. 예를 들어 현재 두 개의 파일을 동시에 읽고 있습니다.

Java의 동기화 원리 및 사용 시나리오와 Callable 인터페이스의 사용 및 차이점 분석 Java의 동기화 원리 및 사용 시나리오와 Callable 인터페이스의 사용 및 차이점 분석 Apr 21, 2023 am 08:04 AM

1. 기본 기능 1. 낙관적 잠금으로 시작하여 잠금 충돌이 빈번하면 비관적 잠금으로 변환됩니다. 2. 경량 잠금 구현으로 시작하여 잠금이 오랫동안 유지되면 잠금이 해제됩니다. 3. 경량 잠금을 구현할 때 가장 많이 사용되는 스핀 잠금 전략 4. 불공정 잠금 5. 재진입 잠금 6. 읽기-쓰기 잠금이 아님 2. JVM 잠금 프로세스를 동기화합니다. 잠금은 잠금 없음, 편향된 잠금, 경량 잠금 및 중량 잠금 상태로 구분됩니다. 상황에 따라 순차적으로 업그레이드될 예정입니다. 편향된 자물쇠는 남자 주인공이 자물쇠이고 여자 주인공이 실이라고 가정합니다. 이 스레드만 이 자물쇠를 사용하면 남자 주인공과 여자 주인공은 결혼 증명서를 받지 못해도 영원히 행복하게 살 수 있습니다. -비용 운영) 그러나 여성 조연이 나타납니다.

Java에서 Lock을 사용하는 방법은 무엇입니까? Java에서 Lock을 사용하는 방법은 무엇입니까? Apr 23, 2023 pm 08:52 PM

1. 기능 (1) 잠금을 획득하는 잠금 방법은 중단을 지원하고 시간 초과 후 획득하지 않으며 비차단입니다. (2) 잠금 및 잠금 해제 위치를 기록해야 하는 의미를 개선합니다. (3) 잠금 명시적 잠금은 우리를 가져올 수 있습니다. 유연성이 뛰어나지만 동시에 잠금을 수동으로 해제해야 합니다. (4) 지원 조건 조건 개체 (5) 여러 읽기 스레드가 동시에 공유 리소스에 액세스하도록 허용합니다. 2.lock 사용법 //Get the lock voidlock() //현재 스레드가 인터럽트되지 않은 경우 잠금을 획득합니다. voidlockInterruptously()//이 잠금 인스턴스에 바인딩된 새 Condition 인스턴스를 반환합니다 ConditionnewCondition()//호출될 때만 잠금

Java Lock 클래스는 어떤 기능을 제공합니까? Java Lock 클래스는 어떤 기능을 제공합니까? Apr 21, 2023 am 08:16 AM

참고 1. Lock은 일련의 잠금 작업 방법을 정의하는 java.util.concurent 패키지의 인터페이스입니다. 2. Lock 인터페이스에는 주로 ReentrantLock, ReentrantReadWriteLock, ReentrantReadWriteLock 및 WriteLock 구현 클래스가 포함됩니다. 동기화와 달리 잠금은 잠금 획득 및 잠금 해제와 같은 관련 인터페이스를 제공하므로 사용이 더 유연하고 작동이 더 복잡합니다. InstanceReentrantReadWriteLocklock=newReentrantReadWriteLock();잠금 읽기

Java 키워드 동기화 원리 및 잠금 상태 예시 분석 Java 키워드 동기화 원리 및 잠금 상태 예시 분석 May 11, 2023 pm 03:25 PM

1. Java의 잠금 개념 스핀 잠금: 스레드가 잠금을 획득할 때 다른 스레드가 잠금을 획득한 경우 스레드는 루프에서 대기한 후 다음까지 잠금을 성공적으로 획득할 수 있는지 계속 판단합니다. 잠금이 획득되면 루프가 종료됩니다. 낙관적 잠금: 충돌이 없다고 가정하고 데이터 수정 시 이전에 획득한 데이터와 일치하지 않는 데이터가 발견되면 최신 데이터를 읽고 수정을 다시 시도합니다. 비관적 잠금: 동시성 충돌이 발생할 것이라고 가정하고 데이터와 관련된 모든 작업을 동기화하며 데이터를 읽는 시점부터 잠금을 시작합니다. 배타적 잠금(쓰기): 리소스에 쓰기 잠금을 추가합니다. 스레드는 리소스를 수정할 수 있지만 다른 스레드는 리소스를 다시 잠글 수 없습니다(단일 쓰기). 공유 잠금(읽기): 리소스에 읽기 잠금을 추가한 후에는 읽을 수만 있고 수정할 수는 없습니다. 다른 스레드는 읽기 잠금만 추가할 수 있고 쓰기 잠금(다중)은 추가할 수 없습니다. S로 본다

Java에서 동기화 메커니즘을 구현하기 위해 동기화를 사용하는 방법은 무엇입니까? Java에서 동기화 메커니즘을 구현하기 위해 동기화를 사용하는 방법은 무엇입니까? Apr 22, 2023 pm 02:46 PM

Java 1에서 동기화를 사용하는 방법 요약입니다. 함수 수정자로 동기화를 사용하는 경우 샘플 코드는 다음과 같습니다. Publicsynchronizedvoidmethod(){//….} 이것이 동기화 방법입니다. 그러면 이때 어떤 개체가 동기화됩니까? 그가 잠그는 것은 이 동기화된 메소드 객체를 호출하는 것입니다. 즉, 객체 P1이 서로 다른 스레드에서 이 동기화 방법을 실행하면 이들 사이에 상호 배제가 형성되어 동기화 효과를 얻을 수 있습니다. 그러나 이 객체가 속한 Class에 의해 생성된 또 다른 객체 P2는 동기화 키워드를 추가하여 이 메소드를 임의로 호출할 수 있습니다. 위의 샘플 코드 등

Java의 세 가지 동기화 방법은 무엇이며 어떻게 사용합니까? Java의 세 가지 동기화 방법은 무엇이며 어떻게 사용합니까? Apr 27, 2023 am 09:34 AM

1. 동기화는 가장 일반적으로 사용되는 동기화 방법이며 이를 사용하는 세 가지 주요 방법이 있음을 설명합니다. 2. 예시//일반 클래스 메서드 동기화synchronousdpublidvoidinvoke(){}//클래스 정적 메서드 동기화 동기화publicstaticvoidinvoke(){}//코드 블록 동기화 동기화(객체){}이 세 가지 메서드의 차이점은 동기화되는 개체가 다르다는 것입니다. 일반 클래스는 객체 자체를 동기화하고, 정적 메서드는 클래스 자체를 동기화하며, 코드 블록은 대괄호 안에 채워진 객체를 동기화합니다. Java에는 어떤 컬렉션이 있나요?

Java 동기화 잠금 업그레이드의 원칙과 프로세스는 무엇입니까? Java 동기화 잠금 업그레이드의 원칙과 프로세스는 무엇입니까? Apr 19, 2023 pm 10:22 PM

도구 준비 동기화의 원리에 대해 공식적으로 이야기하기 전에 스핀 잠금에 대해 먼저 이야기하겠습니다. 스핀 잠금은 동기화 최적화에 큰 역할을 하기 때문입니다. 스핀락을 이해하려면 먼저 원자성이 무엇인지 이해해야 합니다. 소위 원자성은 단순히 각 작업이 완료되지 않았거나 완료되었음을 의미합니다. 예를 들어, 변수 데이터에 하나를 추가하려면 다음 세 단계가 있습니다. 데이터 추가 로드 메모리에서 레지스터로. 데이터 값에 1을 더합니다. 결과를 다시 메모리에 씁니다. 원자성은 스레드가 증분 작업을 수행할 때 이 스레드가 이 세 가지 프로세스를 완료할 때만 다른 스레드에 의해 중단될 수 없음을 의미합니다.

See all articles