管理对共享资源的访问对于并发编程中确保数据一致性非常重要。传统的synchronized关键字对于公平性、立即获取锁、等待特定时间获取锁等复杂场景缺乏灵活性。Java 1.5中引入了Lock、ReadWriteLock和StampedLock API来解决这些限制,并为开发人员提供了很好的控制来处理共享资源访问。它们是 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 } }
乐观的阅读示例。这允许线程在不获取传统读锁的情况下进行读取,从而避免了锁争用,从而提高了性能。如果在获取乐观读锁时间后获取了任何写锁,validate() 将返回 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中文网其他相关文章!