ReentrantLock的内存可见性语义
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tài liệu
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- java, linux
- Lĩnh vực
- documentation, operating-systems
Hướng nghiên cứu
Start with ReentrantLock's NonfairSync.lock, AbstractQueuedSynchronizer.compareAndSetState, setState, and tryRelease, then compare their documented volatile memory semantics with the referenced JSR-133 Cookbook. Review the Linux Atomic::cmpxchg implementation and x86 lock-prefixed instruction discussion. Done means documenting the acquire and release ordering clearly, including what is guaranteed by Java rather than by x86 alone.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
加锁
以NonfairSync为例:
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
关键在于compareAndSetState方法:
/**
* Atomically sets synchronization state to the given updated
* value if the current state value equals the expected value.
* This operation has memory semantics of a {@code volatile} read
* and write.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that the actual
* value was not equal to the expected value.
*/
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
注释里写了,此方法有相当于volatile读写的内存语义。所以这个内存语义又是什么?
参考Doug lea的: The JSR-133 Cookbook for Compiler Writers
- Issue a StoreStore barrier before each volatile store
- Issue a StoreLoad barrier after each volatile store.(Alternatively, if available, you can implement volatile store as an atomic instruction (for example XCHG on x86) and omit the barrier. This may be more efficient if atomic instructions are cheaper than StoreLoad barriers.)
- Issue LoadLoad and LoadStore barriers after each volatile load.
unsafe.compareAndSwapInt由Atomic::cmpxchg实现(Linux):
inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
bool mp = os::is_MP();
__asm__ __volatile__ (LOCK_IF_MP(%4) "cmpxchgq %1,(%3)"
: "=a" (exchange_value)
: "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
: "cc", "memory");
return exchange_value;
}
所以这在x86上就是加了lock前缀的cmpxhgg指令,而lock前缀在intel上便充当了读写memory barrier的作用,来自书中的摘抄L:
On the other hand, x86 CPUs have traditionally given no ordering guarantees for loads, so the smp_mb() and smp_rmb() primitives expand to lock;addl. This atomic instruction acts as a barrier to both loads and stores.
解锁
只看一行:
protected final boolean tryRelease(int releases) {
// ...
setState(c);
// ...
}
/**
* Sets the value of synchronization state.
* This operation has memory semantics of a {@code volatile} write.
* @param newState the new state value
*/
protected final void setState(int newState) {
state = newState;
}
从前面Doug lea的文章中可以看出,volatile写会导致在后面追加一个StoreLoad屏障,而此屏障在x86上:

So,也许又是一条lock前缀指令。
- Ngôn ngữ chính
- Java
- Star
- 2k
- Fork
- 716
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của seaswalker/jdk-sourcecode-analysis
-
一种从值转为枚举的方法Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 35/100
-
求一个HttpConnectionSocketImpl的源码分析Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 20/100
-
JMM和Linux内存屏障定义Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
-
令人迷惑的volatile例子(三)Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 18/100
-
令人迷惑的volatile例子(二)Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
Tất cả issue của seaswalker/jdk-sourcecode-analysis
Issue tương tự
-
`RedisList.reversed()` view returns an empty `range` and `trim` removes all elementsCó thể đã có người làm @CCCLL đã nhận hôm nay. Đang mởstatus: waiting-for-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
spring-projects/spring-data-redis#3461 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
devops-thiago/ThrillhouseBot#1093 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Missing htmx attribute processorĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
wimdeblauwe/htmx-spring-boot#205 ·
-
[BUG] 增量 SSE 解析器未识别单独 CR 换行,导致事件无法及时交付Có thể đã có người làm @king-wwwhhh đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
langchain4j/langchain4j#6669 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement tech-debt
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Albertinesilva/backend-engineering-journey-java-springboot#41 ·