- Java633
- Distributed189
- Tool133
- Spring102
- MQ89
- Netty88
- Log86
- File72
- RPC65
- SOFA65
- Concurrency60
- IM55
- Memory51
- Apache50
- Engine49
- Net49
- Design Pattern45
- Schedule40
- Lock33
- Basic32
- java31
- JVM26
- Dev24
- Protocol23
- Thread23
- System18
- Network17
- Web17
- SQL11
- Github10
- JMM10
- Jvm10
- Programming Language10
- SSO10
- Safe10
- System-Design10
- ORM10
- Base9
- Go9
- Maven9
- Pattern8
- Theory8
- WEB8
- TOOL7
- Auth6
- Architecture6
- HTTP6
- Python6
- CS4
- Mybatis4
- Concurrent3
- Exception3
- source-code3
- Framework2
- Gateway2
- Http2
- JMS2
- Security2
- Cache2
- DEV1
- Dotnet1
- IO1
- IOC1
- IOS1
- IoT1
- JDBC1
- Best Practice1
- Mybaits1
- PHP1
- Source Code1
- Dubbo1
- MVC1
说明
Lock 接口和 Condition 接口作为锁最核心的两个接口,这里做一下简单介绍,为后续的源码阅读提供基础。
jdk 版本
>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 的文章很多,今天我们来一起看一下 ReentrantLock 的源码,理解一下实现原理。
点赞再看,已成习惯。
本文出自论文《Can Seqlocks Get Along With Programming Language Memory Models?》,由老马啸西风翻译整理。
这篇论文李大狗在 StampedLock 的算法笔记中提及,好奇心驱使着我将论文找出来,拜读一下。
序言
在某些情况下,Seqlock是一种重要的同步机制,它表示对常规读写器锁的重大改进。
它们避免了在读取器关键部分期间更新同步变量的需要,从而通过避免在锁对象本身上丢失缓存一致性而提高了性能。
点赞再看,已成习惯。
AQS
提供一个框架,用于实现依赖先进先出(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);
简介
可伸缩的并发ConcurrentNavigableMap 实现。
根据可比较的自然顺序或根据在创建 map 时提供的Comparator对 map 进行排序,具体取决于所使用的构造函数。