<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>并发编程 on BIT &amp; 42</title><link>https://CoderAmedal.github.io/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/</link><description>Recent content in 并发编程 on BIT &amp; 42</description><generator>Hugo -- 0.160.1</generator><language>zh-CN</language><copyright>2025 Bit &amp;amp; 42. 这是生命、宇宙以及一切的终极版权声明</copyright><lastBuildDate>Sat, 23 Mar 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://CoderAmedal.github.io/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 并发编程的艺术》个人总结</title><link>https://CoderAmedal.github.io/posts/java-concurrency-art-summary/</link><pubDate>Sat, 23 Mar 2024 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/java-concurrency-art-summary/</guid><description>&lt;h1 id="java-并发编程的艺术个人总结"&gt;《Java 并发编程的艺术》个人总结&lt;/h1&gt;
&lt;h2 id="为什么读这本书"&gt;为什么读这本书&lt;/h2&gt;
&lt;p&gt;工作中写并发代码的机会不少——线程池、缓存、异步处理——但遇到诡异的可见性问题或死锁时，往往只能靠加 &lt;code&gt;synchronized&lt;/code&gt; 碰运气。这本书系统地梳理了 Java 内存模型和并发工具的设计原理，读完确实对调试并发问题有了更清晰的思路。&lt;/p&gt;
&lt;h2 id="核心知识点梳理"&gt;核心知识点梳理&lt;/h2&gt;
&lt;h3 id="1-并发编程的挑战"&gt;1. 并发编程的挑战&lt;/h3&gt;
&lt;p&gt;书中开篇说的三个核心问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文切换&lt;/strong&gt;：线程多了，CPU 花在切换上的时间比干活还多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死锁&lt;/strong&gt;：互相等对方的锁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源限制&lt;/strong&gt;：硬件瓶颈不解决，加再多线程也没用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经验上，&lt;strong&gt;线程数 ≈ CPU 核数 × 2（取决于 IO 密集还是计算密集）&lt;/strong&gt; 是一个比较可靠的起点。&lt;/p&gt;
&lt;h3 id="2-java-内存模型jmm"&gt;2. Java 内存模型（JMM）&lt;/h3&gt;
&lt;p&gt;这是全书最重要的一章。JMM 控制的是&lt;strong&gt;一个线程对共享变量的写入何时对另一个线程可见&lt;/strong&gt;。核心概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;happens-before 规则&lt;/strong&gt;：程序顺序、volatile、锁、传递性等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;volatile&lt;/strong&gt;：保证可见性和禁止指令重排序，但不保证原子性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锁&lt;/strong&gt;：&lt;code&gt;synchronized&lt;/code&gt; 和 &lt;code&gt;ReentrantLock&lt;/code&gt; 同时保证原子性和可见性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;并发编程中大部分诡异 bug 的根因都是&lt;strong&gt;对 JMM 的理解不到位&lt;/strong&gt;——以为一个线程写完了另一个线程就一定能读到。&lt;/p&gt;
&lt;h3 id="3-并发基础组件"&gt;3. 并发基础组件&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;核心作用&lt;/th&gt;
&lt;th&gt;使用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;轻量级可见性保证&lt;/td&gt;
&lt;td&gt;状态标识位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;synchronized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;互斥 + 可见性&lt;/td&gt;
&lt;td&gt;临界区保护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ReentrantLock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可中断/超时/公平锁&lt;/td&gt;
&lt;td&gt;需要灵活锁控制的场景&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AtomicInteger/Long/Reference&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CAS 无锁原子操作&lt;/td&gt;
&lt;td&gt;计数器、状态机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CountDownLatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;等待多个线程完成&lt;/td&gt;
&lt;td&gt;并行任务汇总&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CyclicBarrier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多个线程互相等待&lt;/td&gt;
&lt;td&gt;分阶段并行计算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Semaphore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;流量控制&lt;/td&gt;
&lt;td&gt;限流、资源池&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="4-线程池"&gt;4. 线程池&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ThreadPoolExecutor&lt;/code&gt; 的核心参数关系：&lt;/p&gt;</description></item></channel></rss>