<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>JMM on pipo&#39;s site</title>
    <link>https://asgpipo.github.io/categories/jmm/</link>
    <description>Recent content in JMM on pipo&#39;s site</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 13 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://asgpipo.github.io/categories/jmm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>volatile &amp; synchronized</title>
      <link>https://asgpipo.github.io/posts/java/concurrency/volatile--synchronized/</link>
      <pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://asgpipo.github.io/posts/java/concurrency/volatile--synchronized/</guid>
      <description>&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 关键字是 Java 并发编程中的一个基础且至关重要的概念。它就像是 Java 虚拟机 ([[JVM]]) 和底层硬件之间立下的一份“契约”，专门用于解决多线程环境下&lt;strong&gt;共享变量的可见性（Visibility）和有序性（Ordering）问题&lt;/strong&gt;。
&lt;img src=&#34;https://asgpipo.github.io/pics/Java/VolatileMindMap.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一-volatile-的含义及在-java-中的作用&#34;&gt;一、 &lt;code&gt;volatile&lt;/code&gt; 的含义及在 Java 中的作用&lt;/h2&gt;
&lt;h3 id=&#34;1-单词的意思literal-meaning&#34;&gt;1. 单词的意思（Literal Meaning）&lt;/h3&gt;
&lt;p&gt;在 Java 中，&lt;code&gt;volatile&lt;/code&gt; 关键字用来标记一个 Java 变量是 &amp;ldquo;&lt;strong&gt;存储在主内存中&lt;/strong&gt;&amp;quot;（&amp;ldquo;being stored in main memory&amp;rdquo;）的。它指示 JVM，这个变量是&lt;strong&gt;共享且不稳定的&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;2-它在-java-中干什么核心机制&#34;&gt;2. 它在 Java 中干什么（核心机制）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 的核心作用是&lt;strong&gt;强制读写操作直接与主内存进行交互&lt;/strong&gt;，从而解决了由于 CPU 缓存和指令重排序带来的并发问题。&lt;/p&gt;
&lt;h4 id=&#34;a-解决可见性问题强制内存访问&#34;&gt;A. 解决可见性问题（强制内存访问）&lt;/h4&gt;
&lt;p&gt;由于现代 CPU 为了性能，会将变量副本存储在 CPU 寄存器或缓存中。如果变量未被声明为 &lt;code&gt;volatile&lt;/code&gt;，线程在操作共享变量时，对主内存的读写时间是不确定的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;读取操作：&lt;/strong&gt; 对 &lt;code&gt;volatile&lt;/code&gt; 变量的每一次读取都将直接从计算机的&lt;strong&gt;主内存&lt;/strong&gt;中读取，而不是从 CPU 寄存器中读取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入操作：&lt;/strong&gt; 对 &lt;code&gt;volatile&lt;/code&gt; 变量的每一次写入都将立即被&lt;strong&gt;写入到主内存&lt;/strong&gt;中，而不仅仅是写入到 CPU 寄存器或写缓冲区中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过这种方式，&lt;code&gt;volatile&lt;/code&gt; 确保了当一个线程更新变量值时，处理器会立即&lt;strong&gt;刷新&lt;/strong&gt;这些更新，保证其他线程随后读取时能看到这个最新值。&lt;/p&gt;
&lt;h4 id=&#34;b-解决有序性问题禁止指令重排序&#34;&gt;B. 解决有序性问题（禁止指令重排序）&lt;/h4&gt;
&lt;p&gt;编译器、运行时环境或处理器可能会对指令进行重排序以优化性能。&lt;code&gt;volatile&lt;/code&gt; 变量是与运行时和处理器进行通信，以&lt;strong&gt;避免重排序任何涉及该 &lt;code&gt;volatile&lt;/code&gt; 变量的指令&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它通过插入&lt;strong&gt;内存屏障 (Memory Barrier)&lt;/strong&gt; 来实现这一目标。内存屏障就像一道墙，禁止某些类型的处理器重排序。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;二-volatile-保证了什么核心承诺&#34;&gt;二、 &lt;code&gt;volatile&lt;/code&gt; 保证了什么？（核心承诺）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 关键字提供了 Java 内存模型 ([[Java/Concurrency/JMM|JMM]]) 规定的两大核心保证：&lt;/p&gt;
&lt;h3 id=&#34;1-内存可见性visibility-guarantee&#34;&gt;1. 内存可见性（Visibility Guarantee）&lt;/h3&gt;
&lt;p&gt;这是 &lt;code&gt;volatile&lt;/code&gt; 最主要也是最基础的保证。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一致性保证：&lt;/strong&gt; &lt;code&gt;volatile&lt;/code&gt; 保证了所有线程看到的共享变量的值是&lt;strong&gt;一致的&lt;/strong&gt;。当对 &lt;code&gt;volatile&lt;/code&gt; 字段进行更新后，&lt;strong&gt;该字段的共享值会立即更新&lt;/strong&gt;，其他线程不会获取到不一致的值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整可见性保证（Full Volatile Visibility Guarantee）：&lt;/strong&gt; &lt;code&gt;volatile&lt;/code&gt; 的可见性保证甚至延伸到了变量本身之外。
&lt;ul&gt;
&lt;li&gt;如果线程 A 写入一个 &lt;code&gt;volatile&lt;/code&gt; 变量，随后线程 B 读取了它，那么&lt;strong&gt;在 A 写入该 &lt;code&gt;volatile&lt;/code&gt; 变量之前对所有其他变量所做的更改，对 B 来说都是可见的&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;类似地，当线程 A 读取 &lt;code&gt;volatile&lt;/code&gt; 变量时，所有对线程 A 可见的变量都会&lt;strong&gt;被强制重新从主内存读取&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-有序性与-happens-before-关系&#34;&gt;2. 有序性与 Happens-Before 关系&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 关键字提供了 Java 内存模型中的 &lt;strong&gt;Happens-Before 保证&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Volatile 变量规则：&lt;/strong&gt; 对一个 &lt;code&gt;volatile&lt;/code&gt; 变量的&lt;strong&gt;写操作 Happens-Before 后面对这个 &lt;code&gt;volatile&lt;/code&gt; 变量的读操作&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重排序约束：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;写入屏障：&lt;/strong&gt; 发生在 &lt;code&gt;volatile&lt;/code&gt; 变量写入&lt;strong&gt;之前&lt;/strong&gt;对其他变量的读写，&lt;strong&gt;不能&lt;/strong&gt;被重排到 &lt;code&gt;volatile&lt;/code&gt; 写入&lt;strong&gt;之后&lt;/strong&gt;发生。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;读取屏障：&lt;/strong&gt; 发生在 &lt;code&gt;volatile&lt;/code&gt; 变量读取&lt;strong&gt;之后&lt;/strong&gt;对其他变量的读写，&lt;strong&gt;不能&lt;/strong&gt;被重排到 &lt;code&gt;volatile&lt;/code&gt; 读取&lt;strong&gt;之前&lt;/strong&gt;发生。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-对-64-位值操作的原子性保障&#34;&gt;3. 对 64 位值操作的原子性保障&lt;/h3&gt;
&lt;p&gt;[[Java/Concurrency/JMM|JMM]] 对 64 位值（如 &lt;code&gt;long&lt;/code&gt; 和 &lt;code&gt;double&lt;/code&gt;）的访问原子性有所放宽，因为在某些 32 位平台上，读写 64 位值可能需要两次内存事务，导致操作非原子。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;volatile&lt;/code&gt; 作为一种&lt;strong&gt;逃生出口（escape hatch）&lt;/strong&gt;，可以用来&lt;strong&gt;强制确保 64 位值的访问原子性&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;如果代码可能在 32 位平台上运行，开发者必须使用 &lt;code&gt;volatile&lt;/code&gt; 关键字来保障 64 位操作的可移植性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三-什么时候使用-volatile适用场景&#34;&gt;三、 什么时候使用 &lt;code&gt;volatile&lt;/code&gt;？（适用场景）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 是一个&lt;strong&gt;轻量级的同步机制&lt;/strong&gt;，适用于只需要保证可见性和有序性，但不需要互斥的场景。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;单写多读场景 (State Flag)&lt;/strong&gt;：当&lt;strong&gt;只有一个线程&lt;/strong&gt;会修改（写入）变量的值，而其他所有线程只负责读取该变量时，&lt;code&gt;volatile&lt;/code&gt; 是足够的。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Server&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 状态标志：只有一个线程会把它设为 true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;volatile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;boolean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isRunning&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;shutdown&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isRunning&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 单写操作&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doWork&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isRunning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 多读操作&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// ... 执行任务&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Server has been shut down.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;值不依赖于旧值：&lt;/strong&gt; 即使有多个线程写入 &lt;code&gt;volatile&lt;/code&gt; 变量，只要写入的新值&lt;strong&gt;不依赖于其旧值&lt;/strong&gt;（例如，设置一个布尔状态标记，而不是计数器递增），&lt;code&gt;volatile&lt;/code&gt; 也是足够的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;替代重量级锁：&lt;/strong&gt; 当应用程序需要确保数据的可见性方面，但同时又希望避免 &lt;code&gt;synchronized&lt;/code&gt; 方法和块带来的性能开销时，&lt;code&gt;volatile&lt;/code&gt; 很有用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;搭便车&amp;quot;技巧 (Piggybacking)&lt;/strong&gt;：利用 &lt;code&gt;volatile&lt;/code&gt; 带来的 happens-before 顺序性，将普通变量的写入放在 &lt;code&gt;volatile&lt;/code&gt; 变量写入之前，可以使普通变量的可见性“搭上” &lt;code&gt;volatile&lt;/code&gt; 变量的便车。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;四-什么时候不使用-volatile局限性与替代方案&#34;&gt;四、 什么时候不使用 &lt;code&gt;volatile&lt;/code&gt;？（局限性与替代方案）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 具有明显的局限性，在需要复杂同步时，不应单独依赖它。&lt;/p&gt;
&lt;h3 id=&#34;1-不能保证互斥性mutual-exclusion&#34;&gt;1. 不能保证互斥性（Mutual Exclusion）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;volatile&lt;/code&gt; 字段的读写&lt;strong&gt;不会阻塞&lt;/strong&gt;其他线程的读写操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;volatile&lt;/code&gt; 关键字&lt;strong&gt;不提供互斥（mutual exclusion）&lt;/strong&gt;，即它不能保证在任何时刻只有一个线程执行关键代码段。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-无法保障复合操作的原子性&#34;&gt;2. 无法保障复合操作的原子性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一旦线程需要&lt;strong&gt;先读取 &lt;code&gt;volatile&lt;/code&gt; 变量的值，然后根据该值生成一个新的值&lt;/strong&gt;（即复合操作，如 &lt;code&gt;i++&lt;/code&gt; 或 &lt;code&gt;count = count + 1&lt;/code&gt;），&lt;strong&gt;单独的 &lt;code&gt;volatile&lt;/code&gt; 就不够了&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在读取和写入新值之间的短暂时间差内，会产生&lt;strong&gt;竞态条件（race condition）&lt;/strong&gt;，多个线程可能读取到相同的值，导致相互覆盖，最终结果错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;替代方案：&lt;/strong&gt; 在这种需要&lt;strong&gt;原子性&lt;/strong&gt;（读取和写入是一个不可分割操作）的情况下，必须使用：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;synchronized&lt;/code&gt; 块或方法&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;java.util.concurrent&lt;/code&gt; 包中的各种&lt;strong&gt;原子数据类型&lt;/strong&gt;，如 &lt;code&gt;AtomicLong&lt;/code&gt; 或 &lt;code&gt;AtomicReference&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-性能考量&#34;&gt;3. 性能考量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;访问 &lt;code&gt;volatile&lt;/code&gt; 变量会将其读写到主内存，这比访问 CPU 寄存器&lt;strong&gt;更昂贵&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;volatile&lt;/code&gt; 还会阻止指令重排序，而指令重排序是&lt;strong&gt;常见的性能增强技术&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;因此，应该&lt;strong&gt;只在真正需要强制变量可见性时&lt;/strong&gt;才使用 &lt;code&gt;volatile&lt;/code&gt; 变量，以避免不必要的同步开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;UnsafeCounter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 即使使用了 volatile，也无法保证正确性&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;volatile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;increment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 这不是原子操作！它包含三步：&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 1. 读取 count 的值&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2. 将值加 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                 &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 3. 写入新值&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getCount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;特性&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;code&gt;synchronized&lt;/code&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;code&gt;AtomicInteger&lt;/code&gt; (原子类)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保证可见性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保证有序性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (禁止重排序)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保证原子性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;❌ &lt;strong&gt;否&lt;/strong&gt; (仅限单次读/写)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (代码块)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (特定操作)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;互斥/阻塞&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;❌ &lt;strong&gt;否&lt;/strong&gt; (非阻塞)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (阻塞)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;❌ &lt;strong&gt;否&lt;/strong&gt; (非阻塞，CAS)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;性能开销&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;较低&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;较高&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;较低 (通常优于 &lt;code&gt;volatile&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;适用场景&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;状态标志、单写多读&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;复杂同步逻辑、临界区保护&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;计数器、累加等复合操作&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; 关键字是 Java 并发编程的基石，它提供了一种强大而直接的同步机制。它就像是为一间“共享资源室”配备的“唯一钥匙”&lt;strong&gt;，专门用于解决多线程环境下的&lt;/strong&gt;原子性、可见性和有序性&lt;strong&gt;问题，其核心是&lt;/strong&gt;互斥访问。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一-synchronized-的含义及在-java-中的作用&#34;&gt;一、 &lt;code&gt;synchronized&lt;/code&gt; 的含义及在 Java 中的作用&lt;/h2&gt;
&lt;h3 id=&#34;1-意思&#34;&gt;1. 意思&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; 的字面意思是“同步的”。在 Java 中，它用于确保一段代码或一个方法在同一时刻&lt;strong&gt;最多只有一个线程&lt;/strong&gt;能执行它。&lt;/p&gt;
&lt;h3 id=&#34;2-它在-java-中干什么核心机制-1&#34;&gt;2. 它在 Java 中干什么（核心机制）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; 的核心作用是实现&lt;strong&gt;线程间的互斥&lt;/strong&gt;，它通过一个叫做&lt;strong&gt;监视器锁&lt;/strong&gt; 的东西来实现。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;监视器锁&lt;/strong&gt;：每个 Java 对象都可以作为一个锁，这个锁就是对象的内置锁或监视器锁。当线程试图进入一个被 &lt;code&gt;synchronized&lt;/code&gt; 保护的代码块时，它必须先获取该代码块所关联对象的锁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锁的获取与释放&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;获取锁&lt;/strong&gt;：如果锁未被其他线程持有，当前线程会获取锁并进入代码块执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阻塞等待&lt;/strong&gt;：如果锁已被其他线程持有，当前线程将被&lt;strong&gt;阻塞&lt;/strong&gt;，并进入锁的等待队列，直到锁被释放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;释放锁&lt;/strong&gt;：当线程执行完 &lt;code&gt;synchronized&lt;/code&gt; 代码块或方法，或者在代码块中抛出异常时，锁会自动被释放。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;二-synchronized-保证了什么核心承诺&#34;&gt;二、 &lt;code&gt;synchronized&lt;/code&gt; 保证了什么？（核心承诺）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; 关键字提供了三大核心保证，比 &lt;code&gt;volatile&lt;/code&gt; 更为强大。&lt;/p&gt;
&lt;h3 id=&#34;1-原子性&#34;&gt;1. 原子性&lt;/h3&gt;
&lt;p&gt;这是 &lt;code&gt;synchronized&lt;/code&gt; 最核心的保证。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;互斥执行&lt;/strong&gt;：&lt;code&gt;synchronized&lt;/code&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;h3 id=&#34;2-内存可见性&#34;&gt;2. 内存可见性&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 保证可见性，&lt;code&gt;synchronized&lt;/code&gt; 同样保证，而且更强。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Happens-Before 保证&lt;/strong&gt;：[[Java/Concurrency/JMM|JMM]] 规定，对一个锁的&lt;strong&gt;解锁操作 [[Java/Concurrency/JMM#^444be5|Happens-Before]] 后面对同一个锁的加锁操作&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强制刷新&lt;/strong&gt;：这意味着，当线程 A 释放锁时，[[Java/Concurrency/JMM|JMM]] 会强制将该线程工作内存中的所有共享变量的最新值&lt;strong&gt;刷新到主内存&lt;/strong&gt;。而当线程 B 随后获取同一个锁时，[[Java/Concurrency/JMM|JMM]] 会强制将该线程的工作内存置为无效，使其必须&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;h3 id=&#34;3-有序性&#34;&gt;3. 有序性&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;volatile&lt;/code&gt; 通过内存屏障禁止指令重排，&lt;code&gt;synchronized&lt;/code&gt; 通过其“原子性”隐式地保证了有序性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;隐式保证&lt;/strong&gt;：由于 &lt;code&gt;synchronized&lt;/code&gt; 块内的代码与块外的代码是互斥执行的，一个线程在 &lt;code&gt;synchronized&lt;/code&gt; 块内观察到的状态，一定是另一个线程在之前或之后同步块内操作的结果。[[Java/Concurrency/JMM|JMM]] 可以在保证最终结果正确性的前提下，对 &lt;code&gt;synchronized&lt;/code&gt; 块内的代码进行重排序，但它绝不会允许块内的代码“[[Runtime Data Area#Escape|逃逸]]”到块外，从而破坏整体的同步语义。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-可重入性&#34;&gt;4. 可重入性&lt;/h3&gt;
&lt;p&gt;这是 &lt;code&gt;synchronized&lt;/code&gt; 一个非常重要的特性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：一个已经获取到锁的线程，可以&lt;strong&gt;再次进入&lt;/strong&gt;由它自己持有的锁所保护的任何代码块，而不会造成死锁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;机制&lt;/strong&gt;：JVM 会为每个锁关联一个持有计数器和一个持有线程。当一个线程获取锁时，计数器加一。当同一线程再次获取时，计数器再次加一。当线程退出同步块时，计数器减一。直到计数器为 0 时，锁才被真正释放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;意义&lt;/strong&gt;：可重入性极大地简化了代码编写，避免了因在同步方法中调用另一个同步方法而导致的自我死锁。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三-什么时候使用-synchronized适用场景&#34;&gt;三、 什么时候使用 &lt;code&gt;synchronized&lt;/code&gt;？（适用场景）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; 是一个重量级的同步工具，适用于需要强一致性保证的场景。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;保护临界区&lt;/strong&gt;：当多个线程需要访问和修改&lt;strong&gt;共享资源&lt;/strong&gt;（如共享的数据结构、文件、设备等）时，必须使用 &lt;code&gt;synchronized&lt;/code&gt; 来保护访问这些资源的代码块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保证复合操作的原子性&lt;/strong&gt;：对于像 &lt;code&gt;check-then-act&lt;/code&gt;（检查再操作，如单例模式的懒加载）或 &lt;code&gt;read-modify-write&lt;/code&gt;（读取再修改，如 &lt;code&gt;i++&lt;/code&gt;）这样的复合操作，&lt;code&gt;volatile&lt;/code&gt; 无能为力，&lt;code&gt;synchronized&lt;/code&gt; 是最直接的解决方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实现简单的线程安全类&lt;/strong&gt;：在创建自定义的线程安全容器或工具类时，&lt;code&gt;synchronized&lt;/code&gt; 是最基础、最可靠的实现手段。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;三种使用方式&#34;&gt;&lt;strong&gt;三种使用方式&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MySynchronizedClass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 1. 修饰实例方法，锁是当前实例对象 (this)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;synchronized&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;instanceMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 临界区代码&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Instance method. Lock on: &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2. 修饰静态方法，锁是当前类的 Class 对象 (MySynchronizedClass.class)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;synchronized&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;staticMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 临界区代码&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Static method. Lock on: &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MySynchronizedClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lockObject&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 专用锁对象&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;blockMethod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 3. 修饰代码块，锁是指定的对象 (lockObject)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;synchronized&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lockObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 临界区代码&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Code block. Lock on: &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lockObject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;四-什么时候不使用-synchronized局限性与替代方案&#34;&gt;四、 什么时候不使用 &lt;code&gt;synchronized&lt;/code&gt;？（局限性与替代方案）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;synchronized&lt;/code&gt; 虽然强大，但其“重量级”的特性也带来了局限。&lt;/p&gt;
&lt;h3 id=&#34;1-性能开销&#34;&gt;1. 性能开销&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;线程阻塞与上下文切换&lt;/strong&gt;：当锁竞争激烈时，无法获取锁的线程会被阻塞，涉及从用户态到内核态的切换，这是一个&lt;strong&gt;非常昂贵的操作&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能瓶颈&lt;/strong&gt;：在高并发场景下，&lt;code&gt;synchronized&lt;/code&gt; 容易成为系统的性能瓶颈。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-灵活性不足&#34;&gt;2. 灵活性不足&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不可中断&lt;/strong&gt;：一个线程在等待获取 &lt;code&gt;synchronized&lt;/code&gt; 锁时，不能被中断。&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;code&gt;synchronized&lt;/code&gt; 是非公平的，即等待时间长的线程不一定能优先获取锁。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-替代方案&#34;&gt;3. 替代方案&lt;/h3&gt;
&lt;p&gt;为了克服 &lt;code&gt;synchronized&lt;/code&gt; 的局限性，Java 提供了更灵活、更高效的并发工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/strong&gt;：当只需要保证可见性和有序性，而不需要互斥访问时，&lt;code&gt;volatile&lt;/code&gt; 是更轻量级的选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;java.util.concurrent.atomic&lt;/code&gt; 包&lt;/strong&gt;：对于单个变量的原子性复合操作（如计数器），&lt;code&gt;AtomicInteger&lt;/code&gt; 等原子类基于 CAS（Compare-And-Swap）操作，通常比 &lt;code&gt;synchronized&lt;/code&gt; 性能更好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;java.util.concurrent.locks.Lock&lt;/code&gt; 接口&lt;/strong&gt;：提供了更高级的锁功能，如可中断的锁获取（&lt;code&gt;lockInterruptibly()&lt;/code&gt;）、可超时的锁获取（&lt;code&gt;tryLock()&lt;/code&gt;）和公平锁（&lt;code&gt;ReentrantLock&lt;/code&gt; 的构造函数参数）。它为复杂并发场景提供了更精细的控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;核心要点总结一图流&#34;&gt;&lt;strong&gt;核心要点总结（一图流）&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;特性&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;code&gt;synchronized&lt;/code&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;code&gt;java.util.concurrent.locks.Lock&lt;/code&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保证原子性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保证可见性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;保证有序性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;互斥/阻塞&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (阻塞)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (阻塞)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;可重入&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (如 &lt;code&gt;ReentrantLock&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;可中断&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;❌ &lt;strong&gt;否&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (&lt;code&gt;lockInterruptibly()&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;可超时&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;❌ &lt;strong&gt;否&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (&lt;code&gt;tryLock()&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;公平性&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;❌ &lt;strong&gt;否&lt;/strong&gt; (仅非公平)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;✅ &lt;strong&gt;是&lt;/strong&gt; (可选公平/非公平)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;使用方式&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;关键字 (JVM 实现，自动释放)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;接口 (API 调用，需手动 &lt;code&gt;unlock()&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;性能开销&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;较高 (JDK 6 后大幅优化)&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;通常较低，但依赖具体实现&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
    </item>
    
  </channel>
</rss>
