forked from itwanger/toBeBetterJavaer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjava-thread-baguwen.html
More file actions
48 lines (45 loc) · 73 KB
/
Copy pathjava-thread-baguwen.html
File metadata and controls
48 lines (45 loc) · 73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-beta.67" />
<meta name="theme" content="VuePress Theme Hope" />
<meta name="keywords" content="Java,java,thread,面试题,八股文"><meta property="og:url" content="https://javabetter.cn/interview/java-thread-baguwen.html"><meta property="og:site_name" content="二哥的Java进阶之路"><meta property="og:title" content="Java 并发编程背诵版八股文必看🍉"><meta property="og:description" content="二哥的Java进阶之路,小白的零基础Java教程,Java 并发编程背诵版八股文必看🍉"><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="og:updated_time" content="2023-09-04T05:16:42.000Z"><meta property="article:author" content="沉默王二"><meta property="article:tag" content="面试题&八股文"><meta property="article:modified_time" content="2023-09-04T05:16:42.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Java 并发编程背诵版八股文必看🍉","image":[""],"dateModified":"2023-09-04T05:16:42.000Z","author":[{"@type":"Person","name":"沉默王二","url":"/about-the-author/"}]}</script><meta name="robots" content="all"><meta name="author" content="沉默王二"><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0"><meta name="apple-mobile-web-app-capable" content="yes"><script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?5230ac143650bf5eb3c14f3fb9b1d3ec";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><link rel="stylesheet" href="//at.alicdn.com/t/font_3180624_7cy10l7jqqh.css"><link rel="icon" href="https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/favicon.ico"><link rel="icon" href="/assets/icon/chrome-mask-512.png" type="image/png" sizes="512x512"><link rel="icon" href="/assets/icon/chrome-mask-192.png" type="image/png" sizes="192x192"><link rel="icon" href="/assets/icon/chrome-512.png" type="image/png" sizes="512x512"><link rel="icon" href="/assets/icon/chrome-192.png" type="image/png" sizes="192x192"><link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials"><meta name="theme-color" content="#096dd9"><link rel="apple-touch-icon" href="/assets/icon/apple-icon-152.png"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="msapplication-TileImage" content="/assets/icon/ms-icon-144.png"><meta name="msapplication-TileColor" content="#ffffff"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"><title>Java 并发编程背诵版八股文必看🍉 | 二哥的Java进阶之路</title><meta name="description" content="二哥的Java进阶之路,小白的零基础Java教程,Java 并发编程背诵版八股文必看🍉">
<style>
:root {
--bg-color: #fff;
}
html[data-theme="dark"] {
--bg-color: #1d1e1f;
}
html,
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="preload" href="/assets/style-c6d22cf5.css" as="style"><link rel="stylesheet" href="/assets/style-c6d22cf5.css">
<link rel="modulepreload" href="/assets/app-a425eb61.js"><link rel="modulepreload" href="/assets/java-thread-baguwen.html-7aa59985.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-c27b6911.js"><link rel="modulepreload" href="/assets/java-thread-baguwen.html-f1ad637c.js">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand" href="/"><img class="vp-nav-logo" src="https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/logo-02.png" alt="二哥的Java进阶之路"><!----><span class="vp-site-name hide-in-pad">二哥的Java进阶之路</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><a class="vp-link nav-link" href="/blog.html"><span class="font-icon icon iconfont icon-gaishu" style=""></span>博客<!----></a></div><div class="nav-item hide-in-mobile"><a class="vp-link nav-link" href="/home.html"><span class="font-icon icon iconfont icon-lujing" style=""></span>进阶之路<!----></a></div><div class="nav-item hide-in-mobile"><a class="vp-link nav-link" href="/zhishixingqiu/"><span class="font-icon icon iconfont icon-Artboard" style=""></span>知识星球<!----></a></div><div class="nav-item hide-in-mobile"><a class="vp-link nav-link" href="/xuexiluxian/"><span class="font-icon icon iconfont icon-luxian" style=""></span>学习路线<!----></a></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button type="button" class="dropdown-title" aria-label="珍藏资源"><span class="title"><span class="font-icon icon iconfont icon-youzhi" style=""></span>珍藏资源</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a class="vp-link nav-link" href="/pdf/"><span class="font-icon icon iconfont icon-java" style=""></span>PDF下载<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/sidebar/sanfene/nixi.html"><span class="font-icon icon iconfont icon-zhunbei" style=""></span>面渣逆袭<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><a href="https://space.bilibili.com/513340480" rel="noopener noreferrer" target="_blank" aria-label="B站视频" class="nav-link"><span class="font-icon icon iconfont icon-bzhan" style=""></span>B站视频<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div></nav><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><!----><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/itwanger/toBeBetterJavaer" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button type="button" class="outlook-button" tabindex="-1" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" class="icon outlook-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="outlook icon"><path d="M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4 38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32 51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0 102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2 6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4 0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2 9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224 419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4 470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0 22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6 12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128 505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2 16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8 86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4 80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6 6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"></path></svg><div class="outlook-dropdown"><!----></div></button></div><!--[--><div id="docsearch-container" style="display:none;"></div><div><button type="button" class="DocSearch DocSearch-Button" aria-label="搜索文档"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">搜索文档</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/home.html"><!---->一、前言<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">二、Java基础</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">三、Java进阶</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">四、MySQL</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">五、Redis</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">六、计算机基础</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable active" type="button"><!----><span class="vp-sidebar-title">七、求职面试</span><span class="vp-arrow down"></span></button><ul class="vp-sidebar-links"><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable active" type="button"><!----><span class="vp-sidebar-title">面试题&八股文</span><span class="vp-arrow down"></span></button><ul class="vp-sidebar-links"><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/java-34.html"><!---->34 道 Java 精选面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/java-hashmap-13.html"><!---->13道HashMap精选面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/mysql-60.html"><!---->60 道 MySQL 精选面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/mysql-suoyin-15.html"><!---->MySQL索引15连问,抗住!<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/redis-12.html"><!---->12 道 Redis 精选面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/nginx-40.html"><!---->40 道 Nginx 精选面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/dubbo-17.html"><!---->17 道 Dubbo 精选面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/kafka-40.html"><!---->40 道精选 Kafka 面试题👍<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/java-basic-baguwen.html"><!---->Java基础背诵版八股文🍉<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active" href="/interview/java-thread-baguwen.html"><!---->并发编程背诵版八股文🍉<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述java内存模型-jmm"><!---->简述Java内存模型(JMM)<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述as-if-serial"><!---->简述as-if-serial<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述happens-before八大规则"><!---->简述happens-before八大规则<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#as-if-serial-和-happens-before-的区别"><!---->as-if-serial 和 happens-before 的区别<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述原子性操作"><!---->简述原子性操作<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述线程的可见性"><!---->简述线程的可见性<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述有序性"><!---->简述有序性<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述java中volatile关键字作用"><!---->简述Java中volatile关键字作用<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#java线程的实现方式"><!---->Java线程的实现方式<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述java线程的状态"><!---->简述Java线程的状态<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述线程通信的方式"><!---->简述线程通信的方式<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述线程池"><!---->简述线程池<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述executor框架"><!---->简述Executor框架<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述executor的继承关系"><!---->简述Executor的继承关系<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述线程池的状态"><!---->简述线程池的状态<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述线程池类型"><!---->简述线程池类型<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述阻塞队列"><!---->简述阻塞队列<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#谈一谈threadlocal"><!---->谈一谈ThreadLocal<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#聊聊你对java并发包下unsafe类的理解"><!---->聊聊你对Java并发包下unsafe类的理解<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#java中的乐观锁与cas算法"><!---->Java中的乐观锁与CAS算法<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#aba问题及解决方法简述"><!---->ABA问题及解决方法简述<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述常见的atomic类"><!---->简述常见的Atomic类<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述atomic类基本实现原理"><!---->简述Atomic类基本实现原理<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述countdownlatch"><!---->简述CountDownLatch<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述cyclicbarrier"><!---->简述CyclicBarrier<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述semaphore"><!---->简述Semaphore<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述exchanger"><!---->简述Exchanger<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述concurrenthashmap"><!---->简述ConcurrentHashMap<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#synchronized底层实现原理"><!---->synchronized底层实现原理<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#synchronized关键词使用方法"><!---->synchronized关键词使用方法<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述java偏向锁"><!---->简述Java偏向锁<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述轻量级锁"><!---->简述轻量级锁<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述锁优化策略"><!---->简述锁优化策略<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述java的自旋锁"><!---->简述Java的自旋锁<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述自适应自旋锁"><!---->简述自适应自旋锁<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述锁粗化"><!---->简述锁粗化<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述锁消除"><!---->简述锁消除<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述lock与reentrantlock"><!---->简述Lock与ReentrantLock<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/interview/java-thread-baguwen.html#简述aqs"><!---->简述AQS<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/java-jvm-baguwen.html"><!---->JVM背诵版八股文🍉<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/mianshiguan-bigfile-miaochuan.html"><!---->如何秒传大文件?<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/mianshiguan-fenkufenbiao.html"><!---->为什么要分库分表?<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/interview/mianshiguan-youhuiquan.html"><!---->如何设计优惠券系统?<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">优质面经</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">面试准备</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">城市选择</span><span class="vp-arrow end"></span></button><!----></section></li></ul></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">八、学习建议</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">九、知识库搭建</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">十、联系作者</span><span class="vp-arrow end"></span></button><!----></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><!---->Java 并发编程背诵版八股文必看🍉</h1><div class="page-info"><span class="page-author-info" aria-label="作者🖊" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="page-author-item" href="/about-the-author/" target="_blank" rel="noopener noreferrer">沉默王二</a></span><span property="author" content="沉默王二"></span></span><!----><span class="page-date-info" aria-label="写作日期📅" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon calendar-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="calendar icon"><path d="M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.753-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 01-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 01-33.473-33.473V143.657H180.6A134.314 134.314 0 0046.66 277.595v535.756A134.314 134.314 0 00180.6 947.289h669.74a134.36 134.36 0 00133.94-133.938V277.595a134.314 134.314 0 00-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 01-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 01-33.472 33.473z"></path></svg><span><!----></span><meta property="datePublished" content="2022-09-09T08:16:18.000Z"></span><span class="page-category-info" aria-label="分类🌈" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><!--[--><span class="page-category-item category4 clickable" role="navigation">求职面试</span><!--]--><meta property="articleSection" content="求职面试"></span><span class="page-tag-info" aria-label="标签🏷" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon tag-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="tag icon"><path d="M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"></path></svg><!--[--><span class="page-tag-item tag6 clickable" role="navigation">面试题&八股文</span><!--]--><meta property="keywords" content="面试题&八股文"></span><span class="page-word-info" aria-label="字数🔠" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon word-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="word icon"><path d="M518.217 432.64V73.143A73.143 73.143 0 01603.43 1.097a512 512 0 01419.474 419.474 73.143 73.143 0 01-72.046 85.212H591.36a73.143 73.143 0 01-73.143-73.143z"></path><path d="M493.714 566.857h340.297a73.143 73.143 0 0173.143 85.577A457.143 457.143 0 11371.566 117.76a73.143 73.143 0 0185.577 73.143v339.383a36.571 36.571 0 0036.571 36.571z"></path></svg><span>约 5788 字</span><meta property="wordCount" content="5788"></span><span class="page-reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 19 分钟</span><meta property="timeRequired" content="PT19M"></span></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述java内存模型-jmm">简述Java内存模型(JMM)</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述as-if-serial">简述as-if-serial</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述happens-before八大规则">简述happens-before八大规则</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#as-if-serial-和-happens-before-的区别">as-if-serial 和 happens-before 的区别</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述原子性操作">简述原子性操作</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述线程的可见性">简述线程的可见性</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述有序性">简述有序性</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述java中volatile关键字作用">简述Java中volatile关键字作用</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#java线程的实现方式">Java线程的实现方式</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述java线程的状态">简述Java线程的状态</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述线程通信的方式">简述线程通信的方式</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述线程池">简述线程池</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述executor框架">简述Executor框架</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述executor的继承关系">简述Executor的继承关系</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述线程池的状态">简述线程池的状态</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述线程池类型">简述线程池类型</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述阻塞队列">简述阻塞队列</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#谈一谈threadlocal">谈一谈ThreadLocal</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#聊聊你对java并发包下unsafe类的理解">聊聊你对Java并发包下unsafe类的理解</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#java中的乐观锁与cas算法">Java中的乐观锁与CAS算法</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#aba问题及解决方法简述">ABA问题及解决方法简述</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述常见的atomic类">简述常见的Atomic类</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述atomic类基本实现原理">简述Atomic类基本实现原理</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述countdownlatch">简述CountDownLatch</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述cyclicbarrier">简述CyclicBarrier</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述semaphore">简述Semaphore</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述exchanger">简述Exchanger</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述concurrenthashmap">简述ConcurrentHashMap</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#synchronized底层实现原理">synchronized底层实现原理</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#synchronized关键词使用方法">synchronized关键词使用方法</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述java偏向锁">简述Java偏向锁</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述轻量级锁">简述轻量级锁</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述锁优化策略">简述锁优化策略</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述java的自旋锁">简述Java的自旋锁</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述自适应自旋锁">简述自适应自旋锁</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述锁粗化">简述锁粗化</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述锁消除">简述锁消除</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述lock与reentrantlock">简述Lock与ReentrantLock</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简述aqs">简述AQS</a></li><!----><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><h1 id="java-并发编程八股文-背诵版-必看" tabindex="-1"><a class="header-anchor" href="#java-并发编程八股文-背诵版-必看" aria-hidden="true">#</a> Java 并发编程八股文(背诵版)必看👍</h1><h3 id="简述java内存模型-jmm" tabindex="-1"><a class="header-anchor" href="#简述java内存模型-jmm" aria-hidden="true">#</a> 简述Java内存模型(JMM)</h3><p>Java内存模型定义了程序中各种变量的访问规则:</p><ul><li>所有变量都存储在主存,每个线程都有自己的工作内存。</li><li>工作内存中保存了被该线程使用的变量的主存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。</li><li>操作完成后,线程的工作内存通过缓存一致性协议将操作完的数据刷回主存。</li></ul><h3 id="简述as-if-serial" tabindex="-1"><a class="header-anchor" href="#简述as-if-serial" aria-hidden="true">#</a> 简述as-if-serial</h3><p>编译器会对原始的程序进行指令重排序和优化。但不管怎么重排序,其结果都必须和用户原始程序输出的预定结果保持一致。</p><h3 id="简述happens-before八大规则" tabindex="-1"><a class="header-anchor" href="#简述happens-before八大规则" aria-hidden="true">#</a> 简述happens-before八大规则</h3><ul><li>程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;</li><li>锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作;</li><li>volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;</li><li>传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;</li><li>线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;</li><li>线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;</li><li>线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;</li><li>对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;</li></ul><h3 id="as-if-serial-和-happens-before-的区别" tabindex="-1"><a class="header-anchor" href="#as-if-serial-和-happens-before-的区别" aria-hidden="true">#</a> as-if-serial 和 happens-before 的区别</h3><p>as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不变。</p><h3 id="简述原子性操作" tabindex="-1"><a class="header-anchor" href="#简述原子性操作" aria-hidden="true">#</a> 简述原子性操作</h3><p>一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行,这就是原子性操作。</p><h3 id="简述线程的可见性" tabindex="-1"><a class="header-anchor" href="#简述线程的可见性" aria-hidden="true">#</a> 简述线程的可见性</h3><p>可见性指当一个线程修改了共享变量时,其他线程能够立即得知修改。volatile、synchronized、final 关键字都能保证可见性。</p><h3 id="简述有序性" tabindex="-1"><a class="header-anchor" href="#简述有序性" aria-hidden="true">#</a> 简述有序性</h3><p>虽然多线程存在并发和指令优化等操作,但在本线程内观察该线程的所有执行操作是有序的。</p><h3 id="简述java中volatile关键字作用" tabindex="-1"><a class="header-anchor" href="#简述java中volatile关键字作用" aria-hidden="true">#</a> 简述Java中volatile关键字作用</h3><ul><li>保证变量对所有线程的可见性。当一个线程修改了变量值,新值对于其他线程来说是立即可以得知的。</li><li>禁止指令重排。使用 volatile 变量进行写操作,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器进行重排序。</li></ul><h3 id="java线程的实现方式" tabindex="-1"><a class="header-anchor" href="#java线程的实现方式" aria-hidden="true">#</a> Java线程的实现方式</h3><ul><li>实现Runnable接口</li><li>继承Thread类</li><li>实现Callable接口</li></ul><h3 id="简述java线程的状态" tabindex="-1"><a class="header-anchor" href="#简述java线程的状态" aria-hidden="true">#</a> 简述Java线程的状态</h3><p>线程状态有 NEW、RUNNABLE、BLOCK、WAITING、TIMED_WAITING、THERMINATED</p><ul><li>NEW:新建状态,线程被创建且未启动,此时还未调用 start 方法。</li><li>RUNNABLE:运行状态。表示线程正在JVM中执行,但是这个执行,不一定真的在跑,也可能在排队等CPU。</li><li>BLOCKED:阻塞状态。线程等待获取锁,锁还没获得。</li><li>WAITING:等待状态。线程内run方法执行完Object.wait()/Thread.join()进入该状态。</li><li>TIMED_WAITING:限期等待。在一定时间之后跳出状态。调用Thread.sleep(long) Object.wait(long) Thread.join(long)进入状态。其中这些参数代表等待的时间。</li><li>TERMINATED:结束状态。线程调用完run方法进入该状态。</li></ul><h3 id="简述线程通信的方式" tabindex="-1"><a class="header-anchor" href="#简述线程通信的方式" aria-hidden="true">#</a> 简述线程通信的方式</h3><ul><li>volatile 关键词修饰变量,保证所有线程对变量访问的可见性。</li><li>synchronized关键词。确保多个线程在同一时刻只能有一个处于方法或同步块中。</li><li>wait/notify方法</li><li>IO通信</li></ul><h3 id="简述线程池" tabindex="-1"><a class="header-anchor" href="#简述线程池" aria-hidden="true">#</a> 简述线程池</h3><p>没有线程池的情况下,多次创建,销毁线程开销比较大。如果在开辟的线程执行完当前任务后复用已创建的线程,可以降低开销、控制最大并发数。</p><p>线程池创建线程时,会将线程封装成工作线程 Worker,Worker 在执行完任务后还会循环获取工作队列中的任务来执行。</p><p>将任务派发给线程池时,会出现以下几种情况</p><ul><li>核心线程池未满,创建一个新的线程执行任务。</li><li>如果核心线程池已满,工作队列未满,将线程存储在工作队列。</li><li>如果工作队列已满,线程数小于最大线程数就创建一个新线程处理任务。</li><li>如果超过大小线程数,按照拒绝策略来处理任务。</li></ul><p>线程池参数:</p><ul><li>corePoolSize:常驻核心线程数。超过该值后如果线程空闲会被销毁。</li><li>maximumPoolSize:线程池能够容纳同时执行的线程最大数。</li><li>keepAliveTime:线程空闲时间,线程空闲时间达到该值后会被销毁,直到只剩下 corePoolSize 个线程为止,避免浪费内存资源。</li><li>workQueue:工作队列。</li><li>threadFactory:线程工厂,用来生产一组相同任务的线程。</li><li>handler:拒绝策略。</li></ul><p>拒绝策略有以下几种:</p><ul><li>AbortPolicy:丢弃任务并抛出异常</li><li>CallerRunsPolicy:重新尝试提交该任务</li><li>DiscardOldestPolicy 抛弃队列里等待最久的任务并把当前任务加入队列</li><li>DiscardPolicy 表示直接抛弃当前任务但不抛出异常。</li></ul><h3 id="简述executor框架" tabindex="-1"><a class="header-anchor" href="#简述executor框架" aria-hidden="true">#</a> 简述Executor框架</h3><p>Executor框架目的是将任务提交和任务如何运行分离开来的机制。用户不再需要从代码层考虑设计任务的提交运行,只需要调用Executor框架实现类的Execute方法就可以提交任务。</p><h3 id="简述executor的继承关系" tabindex="-1"><a class="header-anchor" href="#简述executor的继承关系" aria-hidden="true">#</a> 简述Executor的继承关系</h3><ul><li>Executor:一个接口,其定义了一个接收Runnable对象的方法executor,该方法接收一个Runable实例执行这个任务。</li><li>ExecutorService:Executor的子类接口,其定义了一个接收Callable对象的方法,返回 Future 对象,同时提供execute方法。</li><li>ScheduledExecutorService:ExecutorService的子类接口,支持定期执行任务。</li><li>AbstractExecutorService:抽象类,提供 ExecutorService 执行方法的默认实现。</li><li>Executors:实现ExecutorService接口的静态工厂类,提供了一系列工厂方法用于创建线程池。</li><li>ThreadPoolExecutor:继承AbstractExecutorService,用于创建线程池。</li><li>ForkJoinPool: 继承AbstractExecutorService,Fork 将大任务分叉为多个小任务,然后让小任务执行,Join 是获得小任务的结果,类似于map reduce。</li><li>ThreadPoolExecutor:继承ThreadPoolExecutor,实现ScheduledExecutorService,用于创建带定时任务的线程池。</li></ul><h3 id="简述线程池的状态" tabindex="-1"><a class="header-anchor" href="#简述线程池的状态" aria-hidden="true">#</a> 简述线程池的状态</h3><ul><li>Running:能接受新提交的任务,也可以处理阻塞队列的任务。</li><li>Shutdown:不再接受新提交的任务,但可以处理存量任务,线程池处于running时调用shutdown方法,会进入该状态。</li><li>Stop:不接受新任务,不处理存量任务,调用shutdownnow进入该状态。</li><li>Tidying:所有任务已经终止了,worker_count(有效线程数)为0。</li><li>Terminated:线程池彻底终止。在tidying模式下调用terminated方法会进入该状态。</li></ul><h3 id="简述线程池类型" tabindex="-1"><a class="header-anchor" href="#简述线程池类型" aria-hidden="true">#</a> 简述线程池类型</h3><ul><li>newCachedThreadPool 可缓存线程池,可设置最小线程数和最大线程数,线程空闲1分钟后自动销毁。</li><li>newFixedThreadPool 指定工作线程数量线程池。</li><li>newSingleThreadExecutor 单线程Executor。</li><li>newScheduleThreadPool 支持定时任务的指定工作线程数量线程池。</li><li>newSingleThreadScheduledExecutor 支持定时任务的单线程Executor。</li></ul><h3 id="简述阻塞队列" tabindex="-1"><a class="header-anchor" href="#简述阻塞队列" aria-hidden="true">#</a> 简述阻塞队列</h3><p>阻塞队列是生产者消费者的实现具体组件之一。当阻塞队列为空时,从队列中获取元素的操作将会被阻塞,当阻塞队列满了,往队列添加元素的操作将会被阻塞。具体实现有:</p><ul><li>ArrayBlockingQueue:底层是由数组组成的有界阻塞队列。</li><li>LinkedBlockingQueue:底层是由链表组成的有界阻塞队列。</li><li>PriorityBlockingQueue:阻塞优先队列。</li><li>DelayQueue:创建元素时可以指定多久才能从队列中获取当前元素</li><li>SynchronousQueue:不存储元素的阻塞队列,每一个存储必须等待一个取出操作</li><li>LinkedTransferQueue:与LinkedBlockingQueue相比多一个transfer方法,即如果当前有消费者正等待接收元素,可以把生产者传入的元素立刻传输给消费者。</li><li>LinkedBlockingDeque:双向阻塞队列。</li></ul><h3 id="谈一谈threadlocal" tabindex="-1"><a class="header-anchor" href="#谈一谈threadlocal" aria-hidden="true">#</a> 谈一谈ThreadLocal</h3><p>ThreadLocal 是线程共享变量。ThreadLoacl 有一个静态内部类 ThreadLocalMap,其 Key 是 ThreadLocal 对象,值是 Entry 对象,ThreadLocalMap是每个线程私有的。</p><ul><li>set 给ThreadLocalMap设置值。</li><li>get 获取ThreadLocalMap。</li><li>remove 删除ThreadLocalMap类型的对象。</li></ul><p>存在的问题:对于线程池,由于线程池会重用 Thread 对象,因此与 Thread 绑定的 ThreadLocal 也会被重用,造成一系列问题。</p><p>比如说内存泄漏。由于 ThreadLocal 是弱引用,但 Entry 的 value 是强引用,因此当 ThreadLocal 被垃圾回收后,value 依旧不会被释放,产生内存泄漏。</p><h3 id="聊聊你对java并发包下unsafe类的理解" tabindex="-1"><a class="header-anchor" href="#聊聊你对java并发包下unsafe类的理解" aria-hidden="true">#</a> 聊聊你对Java并发包下unsafe类的理解</h3><p>对于 Java 语言,没有直接的指针组件,一般也不能使用偏移量对某块内存进行操作。这些操作相对来讲是安全(safe)的。</p><p>Java 有个类叫 Unsafe 类,这个类使 Java 拥有了像 C 语言的指针一样操作内存空间的能力,同时也带来了指针的问题。这个类可以说是 Java 并发开发的基础。</p><h3 id="java中的乐观锁与cas算法" tabindex="-1"><a class="header-anchor" href="#java中的乐观锁与cas算法" aria-hidden="true">#</a> Java中的乐观锁与CAS算法</h3><p>乐观锁认为数据发送时发生并发冲突的概率不大,所以读操作前不上锁。</p><p>到了写操作时才会进行判断,数据在此期间是否被其他线程修改。如果发生修改,那就返回写入失败;如果没有被修改,那就执行修改操作,返回修改成功。</p><p>乐观锁一般都采用 Compare And Swap(CAS)算法进行实现。顾名思义,该算法涉及到了两个操作,比较(Compare)和交换(Swap)。</p><p>CAS 算法的思路如下:</p><ul><li>该算法认为不同线程对变量的操作时产生竞争的情况比较少。</li><li>该算法的核心是对当前读取变量值 E 和内存中的变量旧值 V 进行比较。</li><li>如果相等,就代表其他线程没有对该变量进行修改,就将变量值更新为新值 N。</li><li>如果不等,就认为在读取值 E 到比较阶段,有其他线程对变量进行过修改,不进行任何操作。</li></ul><h3 id="aba问题及解决方法简述" tabindex="-1"><a class="header-anchor" href="#aba问题及解决方法简述" aria-hidden="true">#</a> ABA问题及解决方法简述</h3><p>CAS 算法是基于值来做比较的,如果当前有两个线程,一个线程将变量值从 A 改为 B ,再由 B 改回为 A ,当前线程开始执行 CAS 算法时,就很容易认为值没有变化,误认为读取数据到执行 CAS 算法的期间,没有线程修改过数据。</p><p>juc 包提供了一个 AtomicStampedReference,即在原始的版本下加入版本号戳,解决 ABA 问题。</p><h3 id="简述常见的atomic类" tabindex="-1"><a class="header-anchor" href="#简述常见的atomic类" aria-hidden="true">#</a> 简述常见的Atomic类</h3><p>在很多时候,我们需要的仅仅是一个简单的、高效的、线程安全的++或者--方案,使用synchronized关键字和lock固然可以实现,但代价比较大,此时用原子类更加方便。基本数据类型的原子类有:</p><ul><li>AtomicInteger 原子更新整型</li><li>AtomicLong 原子更新长整型</li><li>AtomicBoolean 原子更新布尔类型</li></ul><p>Atomic数组类型有:</p><ul><li>AtomicIntegerArray 原子更新整型数组里的元素</li><li>AtomicLongArray 原子更新长整型数组里的元素</li><li>AtomicReferenceArray 原子更新引用类型数组里的元素。</li></ul><p>Atomic引用类型有:</p><ul><li>AtomicReference 原子更新引用类型</li><li>AtomicMarkableReference 原子更新带有标记位的引用类型,可以绑定一个 boolean 标记</li><li>AtomicStampedReference 原子更新带有版本号的引用类型</li></ul><p>FieldUpdater类型:</p><ul><li>AtomicIntegerFieldUpdater 原子更新整型字段的更新器</li><li>AtomicLongFieldUpdater 原子更新长整型字段的更新器</li><li>AtomicReferenceFieldUpdater 原子更新引用类型字段的更新器</li></ul><h3 id="简述atomic类基本实现原理" tabindex="-1"><a class="header-anchor" href="#简述atomic类基本实现原理" aria-hidden="true">#</a> 简述Atomic类基本实现原理</h3><p>以AtomicIntger 为例。</p><p>方法getAndIncrement,以原子方式将当前的值加1,具体实现为:</p><ul><li>在 for 死循环中取得 AtomicInteger 里存储的数值</li><li>对 AtomicInteger 当前的值加 1</li><li>调用 compareAndSet 方法进行原子更新</li><li>先检查当前数值是否等于 expect</li><li>如果等于则说明当前值没有被其他线程修改,则将值更新为 next,</li><li>如果不是会更新失败返回 false,程序会进入 for 循环重新进行 compareAndSet 操作。</li></ul><h3 id="简述countdownlatch" tabindex="-1"><a class="header-anchor" href="#简述countdownlatch" aria-hidden="true">#</a> 简述CountDownLatch</h3><p>CountDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,调用countDown方法,计数器的值就减1,当计数器的值为0时,表示所有线程都执行完毕,然后在等待的线程就可以恢复工作了。只能一次性使用,不能reset。</p><h3 id="简述cyclicbarrier" tabindex="-1"><a class="header-anchor" href="#简述cyclicbarrier" aria-hidden="true">#</a> 简述CyclicBarrier</h3><p>CyclicBarrier 主要功能和CountDownLatch类似,也是通过一个计数器,使一个线程等待其他线程各自执行完毕后再执行。但是其可以重复使用(reset)。</p><h3 id="简述semaphore" tabindex="-1"><a class="header-anchor" href="#简述semaphore" aria-hidden="true">#</a> 简述Semaphore</h3><p>Semaphore即信号量。Semaphore 的构造方法参数接收一个 int 值,设置一个计数器,表示可用的许可数量即最大并发数。使用 acquire 方法获得一个许可证,计数器减一,使用 release 方法归还许可,计数器加一。如果此时计数器值为0,线程进入休眠。</p><h3 id="简述exchanger" tabindex="-1"><a class="header-anchor" href="#简述exchanger" aria-hidden="true">#</a> 简述Exchanger</h3><p>Exchanger类可用于两个线程之间交换信息。可简单地将Exchanger对象理解为一个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。线程通过exchange 方法交换数据,第一个线程执行 exchange 方法后会阻塞等待第二个线程执行该方法。当两个线程都到达同步点时这两个线程就可以交换数据当两个格子中的均被填充时,该对象会自动将两个格子的信息交换,然后返回给线程,从而实现两个线程的信息交换。</p><h3 id="简述concurrenthashmap" tabindex="-1"><a class="header-anchor" href="#简述concurrenthashmap" aria-hidden="true">#</a> 简述ConcurrentHashMap</h3><p>JDK7采用锁分段技术。首先将数据分成 Segment 数据段,然后给每一个数据段配一把锁,当一个线程占用锁访问其中一个段的数据时,其他段的数据也能被其他线程访问。</p><p>get 除读到空值不需要加锁。该方法先经过一次再散列,再用这个散列值通过散列运算定位到 Segment,最后通过散列算法定位到元素。put 须加锁,首先定位到 Segment,然后进行插入操作,第一步判断是否需要对 Segment 里的 HashEntry 数组进行扩容,第二步定位添加元素的位置,然后将其放入数组。</p><p>JDK8的改进</p><ul><li>取消分段锁机制,采用CAS算法进行值的设置,如果CAS失败再使用 synchronized 加锁添加元素</li><li>引入红黑树结构,当某个槽内的元素个数超过8且 Node数组 容量大于 64 时,链表转为红黑树。</li><li>使用了更加优化的方式统计集合内的元素数量。</li></ul><h3 id="synchronized底层实现原理" tabindex="-1"><a class="header-anchor" href="#synchronized底层实现原理" aria-hidden="true">#</a> synchronized底层实现原理</h3><p>Java 对象底层都会关联一个 monitor,使用 synchronized 时 JVM 会根据使用环境找到对象的 monitor,根据 monitor 的状态进行加解锁的判断。如果成功加锁就成为该 monitor 的唯一持有者,monitor 在被释放前不能再被其他线程获取。</p><p>synchronized在JVM编译后会产生monitorenter 和 monitorexit 这两个字节码指令,获取和释放 monitor。这两个字节码指令都需要一个引用类型的参数指明要锁定和解锁的对象,对于同步普通方法,锁是当前实例对象;对于静态同步方法,锁是当前类的 Class 对象;对于同步方法块,锁是 synchronized 括号里的对象。</p><p>执行 monitorenter 指令时,首先尝试获取对象锁。如果这个对象没有被锁定,或当前线程已经持有锁,就把锁的计数器加 1,执行 monitorexit 指令时会将锁计数器减 1。一旦计数器为 0 锁随即就被释放。</p><h3 id="synchronized关键词使用方法" tabindex="-1"><a class="header-anchor" href="#synchronized关键词使用方法" aria-hidden="true">#</a> synchronized关键词使用方法</h3><ul><li>直接修饰某个实例方法</li><li>直接修饰某个静态方法</li><li>修饰代码块</li></ul><h3 id="简述java偏向锁" tabindex="-1"><a class="header-anchor" href="#简述java偏向锁" aria-hidden="true">#</a> 简述Java偏向锁</h3><p>JDK 1.6 中提出了偏向锁的概念。该锁提出的原因是,开发者发现多数情况下锁并不存在竞争,一把锁往往是由同一个线程获得的。偏向锁并不会主动释放,这样每次偏向锁进入的时候都会判断该资源是否是偏向自己的,如果是偏向自己的则不需要进行额外的操作,直接可以进入同步操作。</p><p>其申请流程为:</p><ul><li>首先需要判断对象的 Mark Word 是否属于偏向模式,如果不属于,那就进入轻量级锁判断逻辑。否则继续下一步判断;</li><li>判断目前请求锁的线程 ID 是否和偏向锁本身记录的线程 ID 一致。如果一致,继续下一步的判断,如果不一致,跳转到步骤4;</li><li>判断是否需要重偏向。如果不用的话,直接获得偏向锁;</li><li>利用 CAS 算法将对象的 Mark Word 进行更改,使线程 ID 部分换成本线程 ID。如果更换成功,则重偏向完成,获得偏向锁。如果失败,则说明有多线程竞争,升级为轻量级锁。</li></ul><h3 id="简述轻量级锁" tabindex="-1"><a class="header-anchor" href="#简述轻量级锁" aria-hidden="true">#</a> 简述轻量级锁</h3><p>轻量级锁是为了在没有竞争的前提下减少重量级锁出现并导致的性能消耗。</p><p>其申请流程为:</p><ul><li>如果同步对象没有被锁定,虚拟机将在当前线程的栈帧中建立一个锁记录空间,存储锁对象目前 Mark Word 的拷贝。</li><li>虚拟机使用 CAS 尝试把对象的 Mark Word 更新为指向锁记录的指针</li><li>如果更新成功即代表该线程拥有了锁,锁标志位将转变为 00,表示处于轻量级锁定状态。</li><li>如果更新失败就意味着至少存在一条线程与当前线程竞争。虚拟机检查对象的 Mark Word 是否指向当前线程的栈帧</li><li>如果指向当前线程的栈帧,说明当前线程已经拥有了锁,直接进入同步块继续执行</li><li>如果不是则说明锁对象已经被其他线程抢占。</li><li>如果出现两条以上线程争用同一个锁,轻量级锁就不再有效,将膨胀为重量级锁,锁标志状态变为 10,此时Mark Word 存储的就是指向重量级锁的指针,后面等待锁的线程也必须阻塞。</li></ul><h3 id="简述锁优化策略" tabindex="-1"><a class="header-anchor" href="#简述锁优化策略" aria-hidden="true">#</a> 简述锁优化策略</h3><p>即自适应自旋、锁消除、锁粗化、锁升级等策略偏。</p><h3 id="简述java的自旋锁" tabindex="-1"><a class="header-anchor" href="#简述java的自旋锁" aria-hidden="true">#</a> 简述Java的自旋锁</h3><p>线程获取锁失败后,可以采用这样的策略,可以不放弃 CPU ,不停的重试内重试,这种操作也称为自旋锁。</p><h3 id="简述自适应自旋锁" tabindex="-1"><a class="header-anchor" href="#简述自适应自旋锁" aria-hidden="true">#</a> 简述自适应自旋锁</h3><p>自适应自旋锁自旋次数不再人为设定,通常由前一次在同一个锁上的自旋时间及锁的拥有者的状态决定。</p><h3 id="简述锁粗化" tabindex="-1"><a class="header-anchor" href="#简述锁粗化" aria-hidden="true">#</a> 简述锁粗化</h3><p>锁粗化的思想就是扩大加锁范围,避免反复的加锁和解锁。</p><h3 id="简述锁消除" tabindex="-1"><a class="header-anchor" href="#简述锁消除" aria-hidden="true">#</a> 简述锁消除</h3><p>锁消除是一种更为彻底的优化,在编译时,Java编译器对运行上下文进行扫描,去除不可能存在共享资源竞争的锁。</p><h3 id="简述lock与reentrantlock" tabindex="-1"><a class="header-anchor" href="#简述lock与reentrantlock" aria-hidden="true">#</a> 简述Lock与ReentrantLock</h3><p>Lock接口是 Java并发包的顶层接口。</p><p>可重入锁 ReentrantLock 是 Lock 最常见的实现,与 synchronized 一样可重入。ReentrantLock 在默认情况下是非公平的,可以通过构造方法指定公平锁。一旦使用了公平锁,性能会下降。</p><h3 id="简述aqs" tabindex="-1"><a class="header-anchor" href="#简述aqs" aria-hidden="true">#</a> 简述AQS</h3><p>AQS(AbstractQuenedSynchronizer)抽象的队列式同步器。AQS是将每一条请求共享资源的线程封装成一个锁队列的一个结点(Node),来实现锁的分配。AQS是用来构建锁或其他同步组件的基础框架,它使用一个 volatile int state 变量作为共享资源,如果线程获取资源失败,则进入同步队列等待;如果获取成功就执行临界区代码,释放资源时会通知同步队列中的等待线程。</p><p>子类通过继承同步器并实现它的抽象方法getState、setState 和 compareAndSetState对同步状态进行更改。</p><p>AQS获取独占锁/释放独占锁原理:</p><p>获取:(acquire)</p><ul><li>调用 tryAcquire 方法安全地获取线程同步状态,获取失败的线程会被构造同步节点并通过 addWaiter 方法加入到同步队列的尾部,在队列中自旋。</li><li>调用 acquireQueued 方法使得该节点以死循环的方式获取同步状态,如果获取不到则阻塞。</li></ul><p>释放:(release)</p><ul><li>调用 tryRelease 方法释放同步状态</li><li>调用 unparkSuccessor 方法唤醒头节点的后继节点,使后继节点重新尝试获取同步状态。</li></ul><p>AQS获取共享锁/释放共享锁原理</p><p>获取锁(acquireShared)</p><ul><li>调用 tryAcquireShared 方法尝试获取同步状态,返回值不小于 0 表示能获取同步状态。</li><li>释放(releaseShared),并唤醒后续处于等待状态的节点。</li></ul><hr><p>投稿作者:后端技术小牛说<br> 转载链接:<a href="https://mp.weixin.qq.com/s/PmeH38qWVxyIhBpsAsjG7w" target="_blank" rel="noopener noreferrer">https://mp.weixin.qq.com/s/PmeH38qWVxyIhBpsAsjG7w<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></p><hr><p>GitHub 上标星 9300+ 的开源知识库《<a href="https://github.com/itwanger/toBeBetterJavaer" target="_blank" rel="noopener noreferrer">二哥的 Java 进阶之路<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>》第一版 PDF 终于来了!包括Java基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:<a href="https://javabetter.cn/overview/" target="_blank" rel="noopener noreferrer">太赞了,GitHub 上标星 9300+ 的 Java 教程<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></p><p>微信搜 <strong>沉默王二</strong> 或扫描下方二维码关注二哥的原创公众号沉默王二,回复 <strong>222</strong> 即可免费领取。</p><figure><img src="https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/gongzhonghao.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/itwanger/toBeBetterJavaer/edit/master/docs/interview/java-thread-baguwen.md" rel="noopener noreferrer" target="_blank" aria-label="编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><div class="update-time"><span class="label">上次编辑于: </span><!----></div><div class="contributors"><span class="label">贡献者: </span><!--[--><!--[--><span class="contributor" title="email: www.qing_gee@163.com">itwanger</span>,<!--]--><!--[--><span class="contributor" title="email: www.qing_gee@163.com">沉默王二</span><!--]--><!--]--></div></div></footer><nav class="vp-page-nav"><a class="vp-link nav-link prev" href="/interview/java-basic-baguwen.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><!---->Java基础背诵版八股文🍉</div></a><a class="vp-link nav-link next" href="/interview/java-jvm-baguwen.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">JVM背诵版八股文🍉<!----></div></a></nav><div id="comment" class="giscus-wrapper input-top" style="display:block;"><div class="loading-icon-wrapper" style="display:flex;align-items:center;justify-content:center;height:96px"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" preserveAspectRatio="xMidYMid" viewBox="25 25 50 50"><animateTransform attributeName="transform" type="rotate" dur="2s" keyTimes="0;1" repeatCount="indefinite" values="0;360"></animateTransform><circle cx="50" cy="50" r="20" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"><animate attributeName="stroke-dasharray" dur="1.5s" keyTimes="0;0.5;1" repeatCount="indefinite" values="1,200;90,200;1,200"></animate><animate attributeName="stroke-dashoffset" dur="1.5s" keyTimes="0;0.5;1" repeatCount="indefinite" values="0;-35px;-125px"></animate></circle></svg></div></div><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper"><div class="vp-footer"><a href="https://beian.miit.gov.cn/" target="_blank">豫ICP备2021038026号-4</a><img src="https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/beian.png" height="15px" width="15px" /><a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=41030502000411"><span>豫公网安备 41030502000411号</span></a></div><div class="vp-copyright">Copyright © 2023 沉默王二</div></footer></div><!--]--><!----><!----><!--]--></div>
<script type="module" src="/assets/app-a425eb61.js" defer></script>
</body>
</html>