<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Java on Micah&#39;s Space</title>
    <link>https://micah.wiki/posts/1.learning/a3.reflections/java/</link>
    <description>Recent content in Java on Micah&#39;s Space</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 14 Oct 2023 21:43:48 +0800</lastBuildDate>
    <atom:link href="https://micah.wiki/posts/1.learning/a3.reflections/java/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Springboot问题汇总</title>
      <link>https://micah.wiki/posts/1.learning/a3.reflections/java/springboot-problem/</link>
      <pubDate>Sat, 14 Oct 2023 21:43:48 +0800</pubDate>
      <guid>https://micah.wiki/posts/1.learning/a3.reflections/java/springboot-problem/</guid>
      <description>&lt;h3 id=&#34;1-编写starter时引用后无法获取到bean&#34;&gt;1. 编写starter时，引用后无法获取到bean&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;环境：使用版本Springboot3.1.4版本&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;问题：之前写starter的时候，一直是按照网上的教程，大部分是Springboot2.x版本，但自己使用了最新版本Springboot3.1.4版本，所以一直不成功。&lt;/p&gt;&#xA;&lt;p&gt;深入代码查看后，发现以下跟老版本不一致。&lt;/p&gt;&#xA;&lt;p&gt;新版本：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SpringBootApplication --&amp;gt; EnableAutoConfiguration --&amp;gt; AutoConfigurationImportSelector.getCandidateConfigurations --&amp;gt; ImportCandidates.load --&amp;gt; LOCATION --&amp;gt; &amp;#34;META-INF/spring/%s.imports&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;老版本：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SpringBootApplication --&amp;gt; EnableAutoConfiguration --&amp;gt; AutoConfigurationImportSelector.getCandidateConfigurations --&amp;gt; SpringFactoriesLoader.loadFactoryNames --&amp;gt; Factories_RESOURCE_LOCATION --&amp;gt; &amp;#34;META-INF/spring.factories&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;所以按照新版 &lt;code&gt; META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports&lt;/code&gt; 进行编写的，可以正常识别。&lt;/p&gt;&#xA;&lt;p&gt;注意：&lt;/p&gt;&#xA;&lt;p&gt;这里的内容也不一样了，之前是需要写入一行，新版本支持多行格式&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enumeration&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;URL&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; urls &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; findUrlsInClasspath(classLoaderToUse, location);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; importCandidates &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (urls.&lt;span style=&#34;color:#a6e22e&#34;&gt;hasMoreElements&lt;/span&gt;()) { &lt;span style=&#34;color:#75715e&#34;&gt;// 如果有多行，直接支持了，把所有的都加入到importCandidates中去了&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;URL url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urls.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextElement&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;importCandidates.&lt;span style=&#34;color:#a6e22e&#34;&gt;addAll&lt;/span&gt;(readCandidateConfigurations(url));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>SpringSecurity</title>
      <link>https://micah.wiki/posts/1.learning/a3.reflections/java/spring-security/</link>
      <pubDate>Sun, 08 Oct 2023 11:02:46 +0800</pubDate>
      <guid>https://micah.wiki/posts/1.learning/a3.reflections/java/spring-security/</guid>
      <description>&lt;h1 id=&#34;springsecurity从入门到精通&#34;&gt;SpringSecurity从入门到精通&lt;/h1&gt;&#xA;&lt;h2 id=&#34;课程介绍&#34;&gt;课程介绍&lt;/h2&gt;&#xA;&lt;p&gt;本课件由&lt;a href=&#34;https://www.bilibili.com/video/BV1mm4y1X7Hc/?p=41&amp;amp;spm_id_from=pageDriver&amp;amp;vd_source=067df4c4078ab51487a2fc9a2d763ceb&#34;&gt;三更草堂&lt;/a&gt;录制， 如果侵权，请联系&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;mailto:micah.shi@gmail.com&#34;&gt;micah.shi@gmail.com&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202310081104919.png&#34; alt=&#34;image-20211219121555979&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;0-简介&#34;&gt;0. 简介&lt;/h2&gt;&#xA;&lt;p&gt;​&#x9;&lt;strong&gt;Spring Security&lt;/strong&gt; 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架&lt;strong&gt;Shiro&lt;/strong&gt;，它提供了更丰富的功能，社区资源也比Shiro丰富。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;一般来说中大型的项目都是使用&lt;strong&gt;SpringSecurity&lt;/strong&gt; 来做安全框架。小项目有Shiro的比较多，因为相比与SpringSecurity，Shiro的上手更加的简单。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9; 一般Web应用的需要进行&lt;strong&gt;认证&lt;/strong&gt;和&lt;strong&gt;授权&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;&#x9;&lt;strong&gt;认证：验证当前访问系统的是不是本系统的用户，并且要确认具体是哪个用户&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;&#x9;&lt;strong&gt;授权：经过认证后判断当前用户是否有权限进行某个操作&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;​&#x9;而认证和授权也是SpringSecurity作为安全框架的核心功能。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-快速入门&#34;&gt;1. 快速入门&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-准备工作&#34;&gt;1.1 准备工作&lt;/h3&gt;&#xA;&lt;p&gt;​&#x9;我们先要搭建一个简单的SpringBoot工程&lt;/p&gt;&#xA;&lt;p&gt;① 设置父工程 添加依赖&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-parent&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.5.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.projectlombok&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;lombok&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/optional&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;② 创建启动类&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@SpringBootApplication&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SecurityApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        SpringApplication.&lt;span style=&#34;color:#a6e22e&#34;&gt;run&lt;/span&gt;(SecurityApplication.&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;,args);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;③ 创建Controller&lt;/p&gt;</description>
    </item>
    <item>
      <title>JavaAtomic工具类</title>
      <link>https://micah.wiki/posts/1.learning/a3.reflections/java/java-atomic/</link>
      <pubDate>Fri, 25 Aug 2023 22:21:01 +0800</pubDate>
      <guid>https://micah.wiki/posts/1.learning/a3.reflections/java/java-atomic/</guid>
      <description>&lt;h1 id=&#34;atomic工具类&#34;&gt;Atomic*工具类&lt;/h1&gt;&#xA;&lt;h2 id=&#34;atomicboolean&#34;&gt;AtomicBoolean&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-成员变量&#34;&gt;1. 成员变量&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 对应的类中的成员变量句柄&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; VarHandle VALUE;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 存储变量的值&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-核心&#34;&gt;2. 核心&lt;/h3&gt;&#xA;&lt;p&gt;set时使用句柄（VarHandle）来进行设置value，获取时使用value进行获取&lt;/p&gt;&#xA;&lt;h2 id=&#34;atomicinteger&#34;&gt;AtomicInteger&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-成员变量-1&#34;&gt;1. 成员变量&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; Unsafe U &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Unsafe.&lt;span style=&#34;color:#a6e22e&#34;&gt;getUnsafe&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; VALUE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; U.&lt;span style=&#34;color:#a6e22e&#34;&gt;objectFieldOffset&lt;/span&gt;(AtomicInteger.&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2核心&#34;&gt;2.核心&lt;/h3&gt;&#xA;&lt;p&gt;与Boolean类似&lt;/p&gt;&#xA;&lt;h2 id=&#34;atomiclong&#34;&gt;AtomicLong&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-成员变量-2&#34;&gt;1. 成员变量&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;atomicarray工具类&#34;&gt;Atomic*Array工具类&lt;/h1&gt;&#xA;&lt;h2 id=&#34;atomicintegerarray&#34;&gt;AtomicIntegerArray&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-成员变量-3&#34;&gt;1. 成员变量&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; VarHandle AA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; MethodHandles.&lt;span style=&#34;color:#a6e22e&#34;&gt;arrayElementVarHandle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; array;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Java线程</title>
      <link>https://micah.wiki/posts/1.learning/a3.reflections/java/java-thread/</link>
      <pubDate>Thu, 02 Jun 2022 10:22:45 +0800</pubDate>
      <guid>https://micah.wiki/posts/1.learning/a3.reflections/java/java-thread/</guid>
      <description>&lt;h1 id=&#34;线程&#34;&gt;线程&lt;/h1&gt;&#xA;&lt;h2 id=&#34;概念&#34;&gt;概念&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Java线程是什么&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Java的线程，是运行在JVM的程序上的基本执行单元， Java针对线程抽象出Thread对象的概念。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Java线程分类&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Thread分为守护线程和非守护线程，当JVM启动时，伴随一个非守护线程的运行，我们称之为主线程/main函数，当JVM所有的非守护线程都销毁时，JVM实例也会销毁；&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Java线程生命周期&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Java线程包含6个状态：NEW，RUNNABLE，BLOCKED，WAITING，TIMED_WAITING，TERMINATED&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;多线程优缺点&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;JVM支持多线程，正确使用多线程能大大提高程序的服务能力，同时也引入程序的复杂度和线程安全问题(不正确使用)。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;状态threadstate&#34;&gt;状态&lt;code&gt;Thread.State&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;一个线程在指定的时刻上，只能存在一个状态；JVM的线程状态和操作系统的线程状态不是一一对应的。了解线程状态可用于分析线程问题/监控，不建议通过判断线程状态来进行逻辑处理&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202206021024473.png&#34; alt=&#34;Thread-20b08934&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;NEW&lt;/code&gt; (新建)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;一个尚未启动的线程处于这一状态。(A thread that has not yet started is in this state.)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;尚未启动的线程处于这一状态，即尚未调用start()&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Theard t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Theard();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;RUNNABLE&lt;/code&gt; (可运行)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;一个正在 Java 虚拟机中执行的线程处于这一状态。(A thread executing in the Java virtual machine is in this state.)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;JVM中可执行的线程处于这一状态&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Theard t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Theard();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t.&lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;BLOCKED&lt;/code&gt; (阻塞)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;一个正在阻塞等待一个监视器锁的线程处于这一状态。(A thread that is blocked waiting for a monitor lock is in this state.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Java内存模型</title>
      <link>https://micah.wiki/posts/1.learning/a3.reflections/java/java-jmm/</link>
      <pubDate>Thu, 02 Jun 2022 10:21:01 +0800</pubDate>
      <guid>https://micah.wiki/posts/1.learning/a3.reflections/java/java-jmm/</guid>
      <description>&lt;h1 id=&#34;java内存模型jmm&#34;&gt;Java内存模型（JMM）&lt;/h1&gt;&#xA;&lt;h2 id=&#34;概念&#34;&gt;概念&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Java内存模型（Java Memory Model，JMM），用于屏蔽掉各种硬件和操作系统的内存访问差异，以实现让Java程序在各种平台下都能达到一致的并发效果，JMM规范了Java虚拟机与计算机内存是如何协同工作的：规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值，以及在必须时如何同步的访问共享变量。&lt;/p&gt;&#xA;&lt;p&gt;Java内存模型（不仅仅是JVM内存分区）：调用栈和本地变量存放在线程栈上，对象存放在堆上。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;堆栈存放规则&#34;&gt;堆栈存放规则&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202206021021081.jpg&#34; alt=&#34;JMM-ae7349b6&#34;&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一个本地变量可能是原始类型，在这种情况下，它总是“呆在”线程栈上。&lt;/li&gt;&#xA;&lt;li&gt;一个本地变量也可能是指向一个对象的一个引用。在这种情况下，引用（这个本地变量）存放在线程栈上，但是对象本身存放在堆上。&lt;/li&gt;&#xA;&lt;li&gt;一个对象可能包含方法，这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上，即使这些方法所属的对象存放在堆上。&lt;/li&gt;&#xA;&lt;li&gt;一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。&lt;/li&gt;&#xA;&lt;li&gt;静态成员变量跟随着类定义一起也存放在堆上。&lt;/li&gt;&#xA;&lt;li&gt;存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时，它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法，它们将会都访问这个对象的成员变量，但是每一个线程都拥有这个成员变量的私有拷贝。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;资料地址&#34;&gt;资料地址&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://zhuanlan.zhihu.com/p/29881777&#34;&gt;EnjoyMoving&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
  </channel>
</rss>
