<?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>JDK on 蓝尾蜂鸟</title><link>https://clibing.com/posts/java/jdk/</link><description>Recent content in JDK on 蓝尾蜂鸟</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Copyright © 2011-2026 clibing. All Rights Reserved.</copyright><atom:link href="https://clibing.com/posts/java/jdk/index.xml" rel="self" type="application/rss+xml"/><item><title>Synchronizd Lock 锁升级 AQS</title><link>https://clibing.com/posts/java/jdk/synchronizd_lock/</link><pubDate>Fri, 21 Aug 2020 10:06:07 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/synchronizd_lock/</guid><description><![CDATA[<h3 id="synchronized" data-numberify>Synchronized<a class="anchor ms-1" href="#synchronized"></a></h3>
<p>在1.5以前是重量级锁，当遇到synchronzed时，其他线程需要等待并进入blocked状态。</p>
<p>在1.6以后，经过大量的测试发现加锁的地方经常被一个线程访问。所以对synchronized进行了锁的粒度优化，主要在对象头增加标记位因此有了偏向锁、轻量级锁、重量级锁。</p>]]></description></item><item><title>Java 基础技</title><link>https://clibing.com/posts/java/jdk/java_base/</link><pubDate>Thu, 16 Apr 2020 17:31:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java_base/</guid><description><![CDATA[<h2 id="java-基础技能" data-numberify>Java 基础技能<a class="anchor ms-1" href="#java-基础技能"></a></h2>
<p>包括以下大致内容</p>
<ul>
<li>Object类的常用方法</li>
<li>常用反射方法</li>
<li>常用字段处理</li>
<li>枚举处理</li>
<li>泛型的获取</li>
<li>基本类型的判断</li>
</ul>

<h3 id="1-isassignablefrom与instanceof" data-numberify>1. isAssignableFrom()与instanceof<a class="anchor ms-1" href="#1-isassignablefrom与instanceof"></a></h3>
<ul>
<li><code>isAssignableFrom()</code>
<ul>
<li>描述：判断目标类是否为父类的子类</li>
<li>使用：父类.class.isAssignableFrom(子类.class)</li>
</ul>
</li>
<li><code>instanceof</code>
<ul>
<li>描述：判断实例是否为父类的子类</li>
<li>描述：(new)实例 instanceof 父类</li>
</ul>
</li>
</ul>
<p>具体的demo如下</p>]]></description></item><item><title>Java基本类型</title><link>https://clibing.com/posts/java/jdk/basic_types/</link><pubDate>Fri, 10 Apr 2020 15:46:22 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/basic_types/</guid><description><![CDATA[<h3 id="一java基础类型" data-numberify>一、Java基础类型<a class="anchor ms-1" href="#一java基础类型"></a></h3>
<table>
  <thead>
      <tr>
          <th>名字</th>
          <th>默认值</th>
          <th>占用空间</th>
          <th>最大值</th>
          <th>最小值</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>byte</td>
          <td>0</td>
          <td>8位</td>
          <td>127(2^7-1)</td>
          <td>-128(-2^7)</td>
      </tr>
      <tr>
          <td>chat</td>
          <td>&lsquo;u0000&rsquo;</td>
          <td>16 位 Unicode 字符</td>
          <td>\uffff (65535)</td>
          <td>\u0000 (0)</td>
      </tr>
      <tr>
          <td>boolean</td>
          <td>false</td>
          <td>1位</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>short</td>
          <td>0</td>
          <td>16位</td>
          <td>32767（2^15 - 1）</td>
          <td>-32768（-2^15）</td>
      </tr>
      <tr>
          <td>int</td>
          <td>0</td>
          <td>32 位</td>
          <td>2,147,483,647(2^31 - 1)</td>
          <td>-2,147,483,648（-2^31）</td>
      </tr>
      <tr>
          <td>float</td>
          <td>0.0f</td>
          <td>32位</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>long</td>
          <td>0L</td>
          <td>64 位</td>
          <td>9,223,372,036,854,775,807(2^63 -1)</td>
          <td>-9,223,372,036,854,775,808(-2^63)</td>
      </tr>
      <tr>
          <td>double</td>
          <td>0.0d</td>
          <td>64位</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>String</td>
          <td>null</td>
          <td>-</td>
          <td>-</td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<p><code>占用空间: 位/8=字节</code></p>]]></description></item><item><title>Java中init和clinit方法的区别</title><link>https://clibing.com/posts/java/jdk/clinit-and-init-diffent/</link><pubDate>Mon, 06 Apr 2020 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/clinit-and-init-diffent/</guid><description><![CDATA[<h3 id="调用时机" data-numberify>调用时机<a class="anchor ms-1" href="#调用时机"></a></h3>
<p>clinit在jvm第一次加载class时调用，init在实例创建出来的时候调用</p>
<ul>
<li>clinit在jvm第一次加载class文件时调用，包括<code>静态变量初始化语句和静态块的执行</code></li>
<li>init在实例创建出来的时候调用，包括调用new操作符；调用Class或java.lang.reflect.Constructor对象的newInstance()方法；调用任何现有对象的clone()方法；通过java.io.ObjectInputStream类的getObject()方法反序列化。</li>
</ul>

<h3 id="详情" data-numberify>详情<a class="anchor ms-1" href="#详情"></a></h3>
<ol>
<li>clinit方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块（static）中的语句合并产生的，编译器收集的顺序是由语句在源文件中出现的顺序所决定的，静态语句块只能访问到定义在静态语句块之前的变量，点贵在他之后的变量，在前面的静态语句块中可以赋值但不能访问。
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Test</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">  </span><span class="kd">static</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">    </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="c1">//给变量赋值可以正常通过</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">    </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">i</span><span class="p">);</span><span class="c1">//这句编译器会提示“非法向前引用”</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="w">  </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div></li>
<li>clinit方法与类的构造函数（或者说实例构造器中的<!-- raw HTML omitted -->()方法）不同， 它不需要显示的调用父类构造器，虚拟机会保证在<code>子类的&lt;init&gt;()方法执行之前，父类的&lt;clinit&gt;()方法已经执行完毕</code>。因为在虚拟机中第一个被执行的<!-- raw HTML omitted -->()方法的类肯定是java.lang.Object</li>
<li>由于父类的clinit方法先执行，也就意味着父类中定义的静态语句块要优先于子类类的变量赋值操作。</li>
<li>clinit方法对于类或者接口来说并不是必须的，如果一个类没有静态语句块，也就没有变量的赋值操作，那么编译器可以不为这个类生成<!-- raw HTML omitted -->()方法。</li>
<li>接口中不能使用静态语句块，但仍然可以有变量初始化的赋值操作，因此接口与类一样都会生成<!-- raw HTML omitted -->()方法。但接口与类不同，执行接口的<!-- raw HTML omitted -->()方法不需要先执行父接口的<!-- raw HTML omitted -->()方法。只有当父接口中定义的变量使用时，父接口才会初始化。另外，接口的实现类在初始化时也一样不会执行接口的<!-- raw HTML omitted -->()方法。</li>
<li>虚拟机会保证一个类的<!-- raw HTML omitted -->()方法在多线程环境中被正确地加锁、同步，如果多个线程同时去初始化一个类，那么只有一个线程去执行这个类的<!-- raw HTML omitted -->()方法中有耗时很长的操作，就可能造成多个线程阻塞。</li>
</ol>

<h3 id="举例" data-numberify>举例<a class="anchor ms-1" href="#举例"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="w">    </span><span class="kd">class</span> <span class="nc">Single</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Single</span><span class="w"> </span><span class="n">single</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Single</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="nf">Single</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">            </span><span class="n">count1</span><span class="o">++</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">            </span><span class="n">count2</span><span class="o">++</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Single</span><span class="w"> </span><span class="nf">getInstance</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">single</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Test</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="w">            </span><span class="n">Single</span><span class="w"> </span><span class="n">single</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Single</span><span class="p">.</span><span class="na">getInstance</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;count1=&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">single</span><span class="p">.</span><span class="na">count1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;count2=&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">single</span><span class="p">.</span><span class="na">count2</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>输出结果：</p>]]></description></item><item><title>Java内存优化之Reference分析</title><link>https://clibing.com/posts/java/jdk/reference/</link><pubDate>Tue, 27 Feb 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/reference/</guid><description><![CDATA[<p>Java的内存优化之Reference，SoftReference、WeakReference、StrongReference</p>

<h3 id="引用对象类型定义" data-numberify>引用对象类型定义<a class="anchor ms-1" href="#引用对象类型定义"></a></h3>
<p>首先，引用对象在Java定义中有三种类型，从弱到强依次为：软引用、弱引用与虚引用，三种级别也各有所不同(软引用&gt;弱引用)。本文浅析下软引用与弱引用。大概的解释，软引用适合应用在需要cache的场景，一般面向实现内存敏感的缓存；弱引用则是适用在某些场景为了无法防止被回收的规范性映射，它优先级最低，一般与引用队列联合使用。</p>]]></description></item><item><title>Deque双向队列之ArrayDeque</title><link>https://clibing.com/posts/java/jdk/array-deque/</link><pubDate>Tue, 06 Feb 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/array-deque/</guid><description><![CDATA[<h3 id="概述" data-numberify>概述<a class="anchor ms-1" href="#概述"></a></h3>
<p><picture><img class="img-fluid " alt="" src="https://clibing.com/images/java/ArrayDeque.png?v=fba7934f280e05fe331658c7d7767396" loading="lazy" width="480" height="372" />
</picture>

</p>
<p>Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者
ArrayDeque实现了Deque的接口以及上图其他的接口，因此ArrayDeque支持序列化、克隆、迭代器操作、队列特性并且扩展了AbstractCollection抽象类</p>]]></description></item><item><title>Java 8中的常用函数式接口</title><link>https://clibing.com/posts/java/jdk/java8-functional-interface/</link><pubDate>Mon, 29 Jan 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java8-functional-interface/</guid><description><![CDATA[<h3 id="java-8中的常用函数式接口" data-numberify>Java 8中的常用函数式接口<a class="anchor ms-1" href="#java-8中的常用函数式接口"></a></h3>
<table>
  <thead>
      <tr>
          <th style="text-align: center">函数式接口</th>
          <th style="text-align: center">函数描述符</th>
          <th style="text-align: left">原始类型特化</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center">Predicate<!-- raw HTML omitted --></td>
          <td style="text-align: center">T-&gt;boolean</td>
          <td style="text-align: left">IntPredicate, LongPredicate, DoublePredicate</td>
      </tr>
      <tr>
          <td style="text-align: center">Consumer<!-- raw HTML omitted --></td>
          <td style="text-align: center">T-&gt;void</td>
          <td style="text-align: left">IntConsumer,LongConsumer, DoubleConsumer</td>
      </tr>
      <tr>
          <td style="text-align: center">Function&lt;T,R&gt;</td>
          <td style="text-align: center">T-&gt;R</td>
          <td style="text-align: left">IntFunction<!-- raw HTML omitted -->, IntToDoubleFunction, IntToLongFunction,<!-- raw HTML omitted --> LongFunction<!-- raw HTML omitted -->, LongToDoubleFunction, LongToIntFunction,<!-- raw HTML omitted --> DoubleFunction<!-- raw HTML omitted -->, ToIntFunction<!-- raw HTML omitted -->, ToDoubleFunction<!-- raw HTML omitted -->,<!-- raw HTML omitted --> ToLongFunction<!-- raw HTML omitted --></td>
      </tr>
      <tr>
          <td style="text-align: center">Supplier<!-- raw HTML omitted --></td>
          <td style="text-align: center">()-&gt;T</td>
          <td style="text-align: left">BooleanSupplier,IntSupplier, LongSupplier, DoubleSupplier</td>
      </tr>
      <tr>
          <td style="text-align: center">UnaryOperator<!-- raw HTML omitted --></td>
          <td style="text-align: center">T-&gt;T</td>
          <td style="text-align: left">IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator</td>
      </tr>
      <tr>
          <td style="text-align: center">BinaryOperator<!-- raw HTML omitted --></td>
          <td style="text-align: center">(T,T)-&gt;T</td>
          <td style="text-align: left">IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator</td>
      </tr>
      <tr>
          <td style="text-align: center">BiPredicate&lt;L,R&gt;</td>
          <td style="text-align: center">(L,R)-&gt;boolean</td>
          <td style="text-align: left"></td>
      </tr>
      <tr>
          <td style="text-align: center">BiConsumer&lt;T,U&gt;</td>
          <td style="text-align: center">(T,U)-&gt;void</td>
          <td style="text-align: left">ObjIntConsumer<!-- raw HTML omitted -->, ObjLongConsumer<!-- raw HTML omitted -->, ObjDoubleConsumer<!-- raw HTML omitted --></td>
      </tr>
      <tr>
          <td style="text-align: center">BiFunction&lt;T,U,R&gt;</td>
          <td style="text-align: center">(T,U)-&gt;R</td>
          <td style="text-align: left">ToIntBiFunction&lt;T,U&gt;, ToLongBiFunction&lt;T,U&gt;, ToDoubleBiFunction&lt;T,U&gt;</td>
      </tr>
  </tbody>
</table>

<h3 id="测试" data-numberify>测试<a class="anchor ms-1" href="#测试"></a></h3>
<p>对于下列函数描述符(即Lambda表达式的签名),你会使用哪些函数式接口?在上表中
可以找到大部分答案。作为进一步练习,请构造一个可以利用这些函数式接口的有效Lambda</p>]]></description></item><item><title>Java 类加载机制</title><link>https://clibing.com/posts/java/jdk/java-classloader/</link><pubDate>Mon, 22 Jan 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java-classloader/</guid><description><![CDATA[<h3 id="java-类的加载机制" data-numberify>Java 类的加载机制<a class="anchor ms-1" href="#java-类的加载机制"></a></h3>
<p><picture><img class="img-fluid " alt="" src="https://clibing.com/images/java/class_loading.png?v=fba7934f280e05fe331658c7d7767396" loading="lazy" width="695" height="279" />
</picture>

</p>
<p>大致流程: <code>读取.class文件二进制文件</code>&ndash;&gt;<code>验证与解析(格式 关键字 关键词 语法 引用 类型转化等等)</code> &ndash;&gt; <code>初始化</code> &ndash;&gt; <code>使用</code> &ndash;&gt; <code>卸载</code></p>]]></description></item><item><title>Java CAS 理解</title><link>https://clibing.com/posts/java/jdk/java-cas/</link><pubDate>Mon, 06 Feb 2017 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java-cas/</guid><description>&lt;blockquote>
&lt;p>CAS(Compare and Swap) 是利用底层硬件平台特性，实现原子性操作的算法，Java 1.5 以后 JUC(java.util.concurrent) 实现主要以此为基础；找了不少资料以下记录一下个人对于 CAS 的理解(部分资料 copy 的)&lt;/p></description></item><item><title>Java内存之直接内存</title><link>https://clibing.com/posts/java/jdk/direct_buffer/</link><pubDate>Mon, 06 Feb 2017 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/direct_buffer/</guid><description><![CDATA[<h3 id="一概念和特征" data-numberify>一、概念和特征<a class="anchor ms-1" href="#一概念和特征"></a></h3>
<ul>
<li>直接内存并非 JVMS 定义的标准 Java 运行时内存。</li>
<li>JDK1.4 加入了新的 NIO 机制，目的是防止 Java 堆 和 Native 堆之间往复的数据复制带来的性能损耗，此后 NIO 可以使用 Native 的方式直接在 Native 堆分配内存。</li>
<li>直接内存区域是全局共享的内存区域。</li>
<li>直接内存区域可以进行自动内存管理(GC)，但机制并不完善。</li>
<li>本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。</li>
<li>可能出现 OutOfMemoryError 异常。</li>
</ul>

<h3 id="二异常演示" data-numberify>二、异常演示<a class="anchor ms-1" href="#二异常演示"></a></h3>
<p>测试代码：</p>]]></description></item></channel></rss>