Skip to content

Commit

Permalink
Site updated: 2024-07-31 08:54:47
Browse files Browse the repository at this point in the history
  • Loading branch information
YeQiuO committed Jul 31, 2024
1 parent c25a63e commit 4c09267
Show file tree
Hide file tree
Showing 14 changed files with 834 additions and 834 deletions.
4 changes: 2 additions & 2 deletions JUC-Lock/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ <h1 id="reentrantlock"><a class="markdownIt-Anchor" href="#reentrantlock"></a> R
<p>源码结构:</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReentrantLock</span> <span class="keyword">implements</span> <span class="title class_">Lock</span> &#123;</span><br><span class="line"> <span class="comment">// 同步控制器(指向公平锁或非公平锁)</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Sync sync;</span><br><span class="line"> <span class="keyword">abstract</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Sync</span> <span class="keyword">extends</span> <span class="title class_">AbstractQueuedSynchronizer</span>&#123;</span><br><span class="line"> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">nonfairTryAcquire</span><span class="params">(<span class="type">int</span> acquires)</span> &#123;...&#125;</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">tryRelease</span><span class="params">(<span class="type">int</span> releases)</span> &#123;...&#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="comment">// 不公平锁</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">NonfairSync</span> <span class="keyword">extends</span> <span class="title class_">Sync</span>&#123;</span><br><span class="line"> <span class="keyword">final</span> <span class="keyword">void</span> <span class="title function_">lock</span><span class="params">()</span> &#123;...&#125;</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">tryAcquire</span><span class="params">(<span class="type">int</span> acquires)</span> &#123;...&#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="comment">// 公平锁</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">FairSync</span> <span class="keyword">extends</span> <span class="title class_">Sync</span> &#123;</span><br><span class="line"> <span class="keyword">final</span> <span class="keyword">void</span> <span class="title function_">lock</span><span class="params">()</span> &#123;...&#125;</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">tryAcquire</span><span class="params">(<span class="type">int</span> acquires)</span> &#123;...&#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="comment">// 实现 Lock 接口</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">lock</span><span class="params">()</span> &#123;</span><br><span class="line"> sync.lock();</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">tryLock</span><span class="params">()</span> &#123;</span><br><span class="line"> <span class="keyword">return</span> sync.nonfairTryAcquire(<span class="number">1</span>);</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">unlock</span><span class="params">()</span> &#123;</span><br><span class="line"> sync.release(<span class="number">1</span>);</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p><code>ReentrantLock</code>独占锁运行过程(可重入锁的 <code>state</code> 表示<mark>重入的次数</mark>,会大于1)</p>
<style>.dtrmcdhpworv{}</style><img data-src="/JUC-Lock/aqs-exclusive-mode-acquire-lock.png" class="dtrmcdhpworv" alt="AQS 独占模式获取锁">
<style>.jykurcrjqfnq{}</style><img data-src="/JUC-Lock/aqs-exclusive-mode-acquire-lock.png" class="jykurcrjqfnq" alt="AQS 独占模式获取锁">
<h2 id="加锁失败时阻塞"><a class="markdownIt-Anchor" href="#加锁失败时阻塞"></a> 加锁失败时阻塞</h2>
<p><code>ReentrantLock</code>在 CAS 加锁失败之后会将 Thread 封装成一个<code>Node</code>类型的对象加入<code>CLH</code>队列中</p>
<p>然后调用<code>LockSupport.park(this)</code>进行阻塞(<code>LockSupport</code>是一个 native 方法实现的工具类,在 hotspot 源码中通过<code>mutex</code>来实现的)</p>
Expand Down Expand Up @@ -386,7 +386,7 @@ <h1 id="abstractqueuedsynchronizer-抽象类"><a class="markdownIt-Anchor" href=
</ul>
<p><strong>线程调度逻辑</strong><br />
当线程尝试获取资源失败时,会创建一个<mark>Node节点</mark>并将当前线程包装进去,然后利用<mark>CAS算法</mark>将其安全地加入到<mark>等待队列的尾部</mark>,并阻塞。<a target="_blank" rel="noopener" href="https://www.bilibili.com/video/BV1mP4y1i7Vm/?p=6&amp;spm_id_from=pageDriver">Link</a></p>
<style>.vwsokhsypdke{zoom:67%;}</style><img data-src="/JUC-Lock/image-20240415164535374.png" class="vwsokhsypdke" alt="image-20240415164535374">
<style>.cxnonivycirc{zoom:67%;}</style><img data-src="/JUC-Lock/image-20240415164535374.png" class="cxnonivycirc" alt="image-20240415164535374">
<p>在释放资源时,AQS会根据资源管理策略从队列中选择合适的节点并唤醒对应线程。</p>
<h2 id="clh-锁"><a class="markdownIt-Anchor" href="#clh-锁"></a> CLH 锁</h2>
<blockquote>
Expand Down
4 changes: 2 additions & 2 deletions JUC/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -268,9 +268,9 @@ <h1 id="threadlocal"><a class="markdownIt-Anchor" href="#threadlocal"></a> Threa
<p><strong>原理</strong></p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ThreadLocal</span>&lt;T&gt; &#123;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">ThreadLocalMap</span> &#123;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Entry</span> <span class="keyword">extends</span> <span class="title class_">WeakReference</span>&lt;ThreadLocal&lt;?&gt;&gt; &#123;</span><br><span class="line"> Object value;</span><br><span class="line"> Entry(ThreadLocal&lt;?&gt; k, Object v) &#123;</span><br><span class="line"> <span class="built_in">super</span>(k);</span><br><span class="line"> value = v;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="comment">// 存放数据</span></span><br><span class="line"> <span class="keyword">private</span> Entry[] table;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>整体结构图</p>
<style>.ebpgbsjdkntg{zoom:50%;}</style><img data-src="/JUC/v2-ce5b8a32cd1245c7c8af5fc15ffcc39f_1440w.webp" class="ebpgbsjdkntg" alt="img">
<style>.wdxbtxxqhxlx{zoom:50%;}</style><img data-src="/JUC/v2-ce5b8a32cd1245c7c8af5fc15ffcc39f_1440w.webp" class="wdxbtxxqhxlx" alt="img">
<p>引用关系图</p>
<style>.kwxadiwfwrcy{zoom:50%;}</style><img data-src="/JUC/v2-6875e31029e2c834cce5feb04bc22474_1440w.webp" class="kwxadiwfwrcy" alt="img">
<style>.gerprjhgtxyi{zoom:50%;}</style><img data-src="/JUC/v2-6875e31029e2c834cce5feb04bc22474_1440w.webp" class="gerprjhgtxyi" alt="img">
<h2 id="qa"><a class="markdownIt-Anchor" href="#qa"></a> Q&amp;A</h2>
<p><strong>Entry的key为什么设计成弱引用?</strong></p>
<p>ThreadLocal 变量生命周期结束后,ThreadLocal 对象就可以被回收;</p>
Expand Down
6 changes: 3 additions & 3 deletions JVM/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -332,11 +332,11 @@ <h2 id="对象访问定位"><a class="markdownIt-Anchor" href="#对象访问定
<ul>
<li>Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。在对象被移动时(垃圾收集时移动对象是非常普遍的行为)只会改变句柄中的实例数据指针。</li>
</ul>
<style>.tvplyoxgzgag{zoom:50%;}</style><img data-src="/JVM/image-20240429100643112.png" class="tvplyoxgzgag" alt="image-20240429100643112">
<style>.ptzyqliiggip{zoom:50%;}</style><img data-src="/JVM/image-20240429100643112.png" class="ptzyqliiggip" alt="image-20240429100643112">
<ul>
<li>直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销,HotSpot 采用的是直接指针</li>
</ul>
<style>.qkfhmkytdhiu{zoom:50%;}</style><img data-src="/JVM/image-20240429100908916.png" class="qkfhmkytdhiu" alt="image-20240429100908916">
<style>.gpdtqqkihfnh{zoom:50%;}</style><img data-src="/JVM/image-20240429100908916.png" class="gpdtqqkihfnh" alt="image-20240429100908916">
<h2 id="对象的内存布局"><a class="markdownIt-Anchor" href="#对象的内存布局"></a> 对象的内存布局</h2>
<p>Mark Word 是一个具有动态定义的数据结构,以便在极小的空间内存储尽量多的数据,根据对象的状态复用自己的存储空间。</p>
<img data-src="/JVM/1161857-20200427173120968-675206595.png" class="" title="img">
Expand Down Expand Up @@ -492,7 +492,7 @@ <h3 id="g1"><a class="markdownIt-Anchor" href="#g1"></a> <a target="_blank" rel=
GC 回收问题:<a target="_blank" rel="noopener" href="https://heapdump.cn/article/1661497">YGC</a><a target="_blank" rel="noopener" href="https://heapdump.cn/article/1870333">FGC</a></p>
<h1 id="类加载过程"><a class="markdownIt-Anchor" href="#类加载过程"></a> 类加载过程</h1>
<p><strong>类的生命周期</strong>:加载、连接、初始化、使用、卸载</p>
<style>.ddsttfxotaxj{zoom:67%;}</style><img data-src="/JVM/image-20240429095206248.png" class="ddsttfxotaxj" alt="image-20240429095206248">
<style>.nhdiquwvjzcs{zoom:67%;}</style><img data-src="/JVM/image-20240429095206248.png" class="nhdiquwvjzcs" alt="image-20240429095206248">
<ul>
<li>加载:通过全类名获取定义此类的二进制字节流;将字节流所代表的静态存储结构转换为方法区的运行时数据结构;在内存中生成一个代表该类的 <code>Class</code> 对象,作为方法区这些数据的访问入口;【通过类加载器实现加载,通过双亲委派模型决定采用哪个类加载器】</li>
<li>验证:确保 Class 文件的字节流中包含的信息无误</li>
Expand Down
2 changes: 1 addition & 1 deletion Java-DataStructure/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ <h1 id="hashmap"><a class="markdownIt-Anchor" href="#hashmap"></a> HashMap</h1>
<blockquote>
<p>JDK1.8 之前 HashMap 采用“拉链法”处理冲突,由 数组+链表 组成; JDK1.8 以后,若Table长度大于 64,会将链表转化为红黑树。</p>
</blockquote>
<style>.ktyieliyzvxp{zoom:50%;}</style><img data-src="/Java-DataStructure/image-20240425212527868.png" class="ktyieliyzvxp" alt="image-20240425212527868">
<style>.nbhgmokgmbou{zoom:50%;}</style><img data-src="/Java-DataStructure/image-20240425212527868.png" class="nbhgmokgmbou" alt="image-20240425212527868">
<ul>
<li>key 和 value 可以为 null,但 null 作为 key 只能有一个,而 null 作为 value 可以有多个</li>
<li>非线程安全的</li>
Expand Down
2 changes: 1 addition & 1 deletion LLM-Application/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ <h2 id="解决思路-2"><a class="markdownIt-Anchor" href="#解决思路-2"></a>
<li>chunk_size 指每个块包含的字符或 Token(如单词、句子等)的数量</li>
<li>chunk_overlap 指两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息</li>
</ul>
<style>.kjwextgcdiyb{zoom:50%;}</style><img data-src="/LLM-Application/image-20240424102824838.png" class="kjwextgcdiyb" alt="langchain.text_splitter">
<style>.vobiremzakzp{zoom:50%;}</style><img data-src="/LLM-Application/image-20240424102824838.png" class="vobiremzakzp" alt="langchain.text_splitter">
<p><strong>Q1</strong>:如何加强搜索结果的多样性?</p>
<p><strong>A1</strong>:最大边际相关性 <code>Maximum marginal relevance</code> ,过滤搜索结果中相似度很高的文档,可以同时满足查询的相关性和结果的多样性</p>
<p><strong>Q2</strong>:如何将查询限定在某些文档中?如 LLM 在查询时可能同时查找 浙江省财政报告、江苏省财政报告,但问题只与浙江省相关</p>
Expand Down
Loading

0 comments on commit 4c09267

Please sign in to comment.