fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: correct volatile description for AQS state variable - #2829

Merged
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516
Apr 15, 2026
Merged

fix: correct volatile description for AQS state variable#2829
Snailclimb merged 1 commit into
Snailclimb:mainfrom
Senrian:fix/aqs-state-volatile-explanation-2516

Conversation

@Senrian

Copy link
Copy Markdown
Contributor

修复 AQS 中 state 变量的 volatile 作用描述不准确问题

问题描述

关闭 #2516

原文中代码注释为:

// 共享变量,使用volatile修饰保证线程可见性privatevolatileintstate;

以及描述文字仅提到 volatile 用于"展示当前临界资源的获取情况"。

问题分析

volatile 在 AQS state 变量中的作用不仅仅是保证可见性。实际上,在 AQS 实现中更关键的是通过 happens-before 规则来防止指令重排序:

JMM 的 happens-before 规则规定:volatile 变量的写操作先行发生于后续的读操作。

这保证了锁的获取/释放操作的语义正确性——即线程释放锁(写 state)之后,另一个线程获取锁(读 state)能看到所有在释放锁之前的操作。

修改内容

  1. 更新代码注释:// 共享变量,使用volatile修饰,保证线程可见性并防止指令重排序
  2. 在描述文字中补充 happens-before 规则的解释

…climb#2516)
The previous description only mentioned thread visibility as the reason for
using volatile to modify the state variable. However, volatile's more important
role here is preventing instruction reordering through the happens-before rule
(volatile write happens-before subsequent read), which ensures the correctness
of lock semantics.
FixesSnailclimb#2516
@Snailclimb
Snailclimb merged commit b7b3f1a into Snailclimb:mainApr 15, 2026
1 check passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Senrian@Snailclimb