동시 프로그래밍에서는 데이터 일관성을 보장하기 위해 공유 리소스에 대한 액세스를 관리하는 것이 중요합니다. 기존의 동기화 키워드는 공정성, 즉시 잠금 획득, 특정 시간 동안 잠금 획득을 기다리는 등과 같은 복잡한 시나리오에 대한 유연성이 부족합니다. Lock, ReadWriteLock 및 StampedLock API는 이러한 제한 사항을 해결하기 위해 Java 1.5에 도입되었으며 개발자가 처리할 수 있는 뛰어난 제어 기능을 제공합니다. 공유 리소스 액세스. java.util.concurrent 패키지의 일부입니다.
Lock API는 스레드 동기화를 처리하기 위한 인터페이스이며 아래와 같은 메소드를 제공합니다.
재진입 잠금
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
ReadWriteLock API는 인터페이스이며 읽기 및 쓰기 시나리오를 유지하기 위해 한 쌍의 잠금을 유지합니다. 작성자가 없는 경우 여러 스레드가 읽기 잠금을 동시에 보유할 수 있습니다. 쓰기 잠금은 배타적입니다.
주요 규칙
예: 마이크로 서비스 통신에서 서비스 B가 서비스 A로부터 JWT를 기대한다고 가정합니다. JWT는 서비스 A에 의해 생성되며 몇 분 동안 캐시할 수 있습니다. 이 시나리오에서는 ReentrantReadWriteLock이 더 유용합니다. 토큰이 만료되었거나 곧 만료될 경우 토큰을 갱신할 수 있습니다. 읽기 기아를 피하기 위해 여기서는 읽기 잠금을 획득하지 않습니다.
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
StampedLock은 Java 8에서 도입되었으며 클래스입니다. 세 가지 잠금 모드를 지원하고 잠금을 해제하는 데 사용되는 스탬프를 반환합니다. 잠금 업그레이드가 가능합니다.
핵심 사항:
String jwt = JwtUtil.generateJwt(); ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); Lock readLock = lock.readLock(); public String getJwt(String key, String value) { if (StringUtils.hasLength(jwt)) { if (JwtUtil.isJwtEligibleToRenew(jwt)) { generateJwt(); } } else { generateJwt(); } return this.jwt; } public void generateJwt() { this.writeLock.lock(); //write lock try { if (JwtUtil.isJwtEligibleToRenew(jwt)) { this.jwt = JwtUtil.generateJwt(); } } finally { this.writeLock.unlock(); //release write lock } }
낙관적인 읽기 예시. 이를 통해 스레드는 기존 읽기 잠금을 획득하지 않고도 읽을 수 있으며 잠금 경합을 방지하여 성능이 향상됩니다. 낙관적 읽기 잠금 시간을 획득한 후 쓰기 잠금을 획득하면 verify()는 false를 반환하고 그렇지 않으면 true가 됩니다.
public void readAndWrite() { long l = this.stampedLock.readLock(); try { //critical section } finally { this.stampedLock.unlock(l); } long w = this.stampedLock.writeLock(); try { //critical section } finally { this.stampedLock.unlock(w); } }
즐거운 코딩과 학습!!!
궁금하신 점은 댓글 남겨주세요
위 내용은 Java의 Lock API 개요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!