处于萌芽阶段的 Java 核心知识库。
访问这里获取更好的阅读体验:https://crossoverjie.top/JCSprout/
📊 | ⚔️ | 🖥 | 🚏 | 🏖 | 🌁 | 📮 | 🔍 | 🚀 | 🌈 | 💡 |
---|---|---|---|---|---|---|---|---|---|---|
集合 | 多线程 | JVM | 分布式 | 框架 | 架构设计 | 数据库 | 算法 | Netty | 附加技能 | 联系作者 |
处于萌芽阶段的 Java 核心知识库。
访问这里获取更好的阅读体验:https://crossoverjie.top/JCSprout/
📊 | ⚔️ | 🖥 | 🚏 | 🏖 | 🌁 | 📮 | 🔍 | 🚀 | 🌈 | 💡 |
---|---|---|---|---|---|---|---|---|---|---|
集合 | 多线程 | JVM | 分布式 | 框架 | 架构设计 | 数据库 | 算法 | Netty | 附加技能 | 联系作者 |
Lock 接口和 Condition 接口作为锁最核心的两个接口,这里做一下简单介绍,为后续的源码阅读提供基础。
>java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
点赞再看,已成习惯。
介绍 ReentrantLock 的文章很多,今天我们来一起看一下 ReentrantLock 的源码,理解一下实现原理。
点赞再看,已成习惯。
本文出自论文《Can Seqlocks Get Along With Programming Language Memory Models?》,由老马啸西风翻译整理。
这篇论文李大狗在 StampedLock 的算法笔记中提及,好奇心驱使着我将论文找出来,拜读一下。
在某些情况下,Seqlock是一种重要的同步机制,它表示对常规读写器锁的重大改进。
它们避免了在读取器关键部分期间更新同步变量的需要,从而通过避免在锁对象本身上丢失缓存一致性而提高了性能。
点赞再看,已成习惯。
提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)。
/*
* @since 1.5
* @author Doug Lea
*/
public abstract class AbstractQueuedSynchronizer
extends AbstractOwnableSynchronizer
implements java.io.Serializable {
private static final long serialVersionUID = 7373984972572414691L;
/**
* Creates a new {@code AbstractQueuedSynchronizer} instance
* with initial synchronization state of zero.
*/
protected AbstractQueuedSynchronizer() { }
}
点赞再看,已成习惯。
我们在前面的文章中详细介绍了 jdk 自带的可重入锁使用及其源码。
本节就让我们一起来实现一个可重入锁。
点赞再看,已成习惯。
我们在前面的文章中详细介绍了 jdk 自带的可重入读写锁使用及其源码。
本节就让我们一起来实现一个读写锁。
我们先实现一个最基础版本的读写锁,便于大家理接最核心的部分。
后续将在这个基础上持续优化。
为了后续拓展,我们统一定义基础的接口,一共 4 个方法:
package com.github.houbb.lock.api.core;
/**
* 读写锁定义接口
* @author binbin.hou
* @since 0.0.2
*/
public interface IReadWriteLock {
/**
* 获取读锁
* @since 0.0.2
*/
void lockRead();
/**
* 释放读锁
*/
void unlockRead();
/**
* 获取写锁
* @since 0.0.2
*/
void lockWrite();
/**
* 释放写锁
*/
void unlockWrite();
}
由数组支持的有界阻塞队列。该队列对元素FIFO(先进先出)进行排序。
队列的开头是已在队列中停留最长时间的元素。
队列的尾部是最短时间位于队列中的元素。
这个类由李大狗和 Martin Buchholz 一起实现的。
ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,遵循队列的FIFO原则,队尾入队,队首出队。
注意:此队列不允许使用 null 元素。
这里我们主要演示方法使用,就不演示并发安全了,后面源码会解释。
ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();
// add() 将指定元素插入此队列的尾部。
queue.add("add");
// offer() 将指定元素插入此队列的尾部。
queue.offer("offer");
// peek() 获取但不移除此队列的头;如果此队列为空,则返回 null
String value = queue.peek();
System.out.println("PEEK: " + value);
// poll() 获取并移除此队列的头,如果此队列为空,则返回 null。
String poll = queue.poll();
System.out.println("POLL: " + poll);
// remove() 移除 从队列中移除指定元素的单个实例(如果存在)。
boolean remove = queue.remove("offer");
System.out.println("Remove result: " + remove);