-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
62 lines (53 loc) · 43.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!-- build time:Sun Jan 13 2019 23:05:58 GMT+0800 (China Standard Time) --><!DOCTYPE html><html class="theme-next pisces use-motion" lang="zh-Hans"><head><meta name="generator" content="Hexo 3.8.0"><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=2"><meta name="theme-color" content="#222"><meta http-equiv="Cache-Control" content="no-transform"><meta http-equiv="Cache-Control" content="no-siteapp"><link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css"><link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic|Roboto Slab:300,300italic,400,400italic,700,700italic|Roboto Slab:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css"><link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css"><link href="/css/main.css?v=6.5.0" rel="stylesheet" type="text/css"><link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.5.0"><link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=6.5.0"><link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=6.5.0"><link rel="mask-icon" href="/images/logo.svg?v=6.5.0" color="#222"><script type="text/javascript" id="hexo.configurations">var NexT=window.NexT||{},CONFIG={root:"/",scheme:"Pisces",version:"6.5.0",sidebar:{position:"left",display:"post",offset:12,b2t:!1,scrollpercent:!1,onmobile:!1},fancybox:!0,fastclick:!1,lazyload:!1,tabs:!0,motion:{enable:!0,async:!1,transition:{post_block:"fadeIn",post_header:"slideDownIn",post_body:"slideDownIn",coll_header:"slideLeftIn",sidebar:"slideUpIn"}},algolia:{applicationID:"",apiKey:"",indexName:"",hits:{per_page:10},labels:{input_placeholder:"Search for Posts",hits_empty:"We didn't find any results for the search: ${query}",hits_stats:"${hits} results found in ${time} ms"}}}</script><meta name="description" content="You don't have to be great to start, but you have to start to be great!"><meta property="og:type" content="website"><meta property="og:title" content="mars Blog"><meta property="og:url" content="https://www.hcyhj.cn/index.html"><meta property="og:site_name" content="mars Blog"><meta property="og:description" content="You don't have to be great to start, but you have to start to be great!"><meta property="og:locale" content="zh-Hans"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="mars Blog"><meta name="twitter:description" content="You don't have to be great to start, but you have to start to be great!"><link rel="alternate" href="/atom.xml" title="mars Blog" type="application/atom+xml"><link rel="canonical" href="https://www.hcyhj.cn/"><script type="text/javascript" id="page.configurations">CONFIG.page={sidebar:""}</script><title>mars Blog</title><noscript><style type="text/css">.sidebar-inner,.use-motion .brand,.use-motion .collection-title,.use-motion .comments,.use-motion .menu-item,.use-motion .motion-element,.use-motion .pagination,.use-motion .post-block,.use-motion .post-body,.use-motion .post-header{opacity:initial}.use-motion .logo,.use-motion .site-subtitle,.use-motion .site-title{opacity:initial;top:initial}</style></noscript></head><body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans"><div class="container sidebar-position-left page-home"><div class="headband"></div><header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="header-inner"><div class="site-brand-wrapper"><div class="site-meta"><div class="custom-logo-site-title"><a href="/" class="brand" rel="start"><span class="logo-line-before"><i></i></span> <span class="site-title">mars Blog</span> <span class="logo-line-after"><i></i></span></a></div><p class="site-subtitle">learner</p></div><div class="site-nav-toggle"><button aria-label="Toggle navigation bar"><span class="btn-bar"></span> <span class="btn-bar"></span> <span class="btn-bar"></span></button></div></div><nav class="site-nav"><ul id="menu" class="menu"><li class="menu-item menu-item-home menu-item-active"><a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i><br>Home</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i><br>Tags</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-th"></i><br>Categories</a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i><br>Archives</a></li></ul></nav></div></header><main id="main" class="main"><div class="main-inner"><div class="content-wrap"><div id="content" class="content"><section id="posts" class="posts-expand"><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2019/01/13/netty-NioEventLoopGroup/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2019/01/13/netty-NioEventLoopGroup/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">Netty系列(一):NioEventLoopGroup源码解析</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2019-01-13 23:04:11 / Modified: 23:05:45" itemprop="dateCreated datePublished" datetime="2019-01-13T23:04:11+08:00">2019-01-13</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/netty/" itemprop="url" rel="index"><span itemprop="name">netty</span></a></span> </span><span id="/2019/01/13/netty-NioEventLoopGroup/" class="leancloud_visitors" data-flag-title="Netty系列(一):NioEventLoopGroup源码解析"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>对于<code>NioEventLoopGroup</code>这个对象,在我的理解里面它就和<code>ThreadGroup</code>类似,<code>NioEventLoopGroup</code>中有一堆<code>NioEventLoop</code>小弟,<code>ThreadGroup</code>中有一堆<code>Thread</code>小弟,真正意义上干活的都是<code>NioEventLoop</code>和<code>Thread</code>这两个小弟。下面的文章大家可以类比下进行阅读,应该会很容易弄懂的。</p><div class="post-button text-center"><a class="btn" href="/2019/01/13/netty-NioEventLoopGroup/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2019/01/08/faslesharing/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2019/01/08/faslesharing/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">并发不得不说的伪共享</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2019-01-08 23:46:03 / Modified: 23:50:35" itemprop="dateCreated datePublished" datetime="2019-01-08T23:46:03+08:00">2019-01-08</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2019/01/08/faslesharing/" class="leancloud_visitors" data-flag-title="并发不得不说的伪共享"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>可谓是一入<strong>并发</strong>深似海,看得越多,发现自己懂的越少,总感觉自己只是了解了其冰山一角。但是在研究的过程中越来越感受到一些框架的设计之美,很细腻的赶脚。同时也让我get到了新的知识点。</p><div class="post-button text-center"><a class="btn" href="/2019/01/08/faslesharing/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/12/30/thread-cache/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/12/30/thread-cache/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">线程的缓存何时刷新?</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-12-30 21:55:45 / Modified: 22:00:15" itemprop="dateCreated datePublished" datetime="2018-12-30T21:55:45+08:00">2018-12-30</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2018/12/30/thread-cache/" class="leancloud_visitors" data-flag-title="线程的缓存何时刷新?"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>曾经有遇到过这样一个问题,有一个共享变量<code>keepRunning=true</code>,线程A中执行<code>while (keepRunning);</code>,线程B中执行<code>keepRunning = false;</code>,在main函数中同时开启A,B线程,然后会发现程序会一直运行且不会退出。说白了这其实就是一个典型的可见性问题,A线程并不知道<code>keepRunning</code>已经被修改过了,故未将修改后的<code>keepRunning</code>变量的值从主内存中读取到线程缓存中来。</p><div class="post-button text-center"><a class="btn" href="/2018/12/30/thread-cache/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/12/19/doget/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/12/19/doget/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">GetBean源码全面解读</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-12-19 18:37:20 / Modified: 18:42:10" itemprop="dateCreated datePublished" datetime="2018-12-19T18:37:20+08:00">2018-12-19</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2018/12/19/doget/" class="leancloud_visitors" data-flag-title="GetBean源码全面解读"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>在上篇文章刨坑的过程中,顺便研究了一波spring源码,初始看的也是头晕,后面逐渐捋好了思路。个人感觉spring还是个大工程的,这篇文章解读的肯定也有自己理解不到位的部分,希望各位看官能多讨论讨论。最后会附上一副getBean方法的流程图,希望能打开大家看这部分源码的思路。(本文基于spring 5.1.2版本)</p><div class="post-button text-center"><a class="btn" href="/2018/12/19/doget/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/12/13/springcloud/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/12/13/springcloud/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">记一次spring cloud踩坑</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-12-13 20:42:32 / Modified: 22:08:48" itemprop="dateCreated datePublished" datetime="2018-12-13T20:42:32+08:00">2018-12-13</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2018/12/13/springcloud/" class="leancloud_visitors" data-flag-title="记一次spring cloud踩坑"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>最近自己尝试着搭建springcloud项目,果不其然,刚开始就踩坑了,还是那种一脸懵逼的坑。搭建后程序能正常运行注册到eureka注册中心,但注册好之后便会立即注销掉。刚开始认为是线程抛异常挂掉了,便导致服务注销了。然后各种debug排查,最后发现是正常退出。至于具体原因,我下面做个详细解释。</p><hr><h4 id="eureka注册中心"><a href="#eureka注册中心" class="headerlink" title="eureka注册中心"></a>eureka注册中心</h4><div class="post-button text-center"><a class="btn" href="/2018/12/13/springcloud/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/11/30/ngrok/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/11/30/ngrok/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">一分钟教你学会搭建ngrok内网穿透</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-11-30 14:30:22 / Modified: 14:45:45" itemprop="dateCreated datePublished" datetime="2018-11-30T14:30:22+08:00">2018-11-30</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/ngrok/" itemprop="url" rel="index"><span itemprop="name">ngrok</span></a></span> </span><span id="/2018/11/30/ngrok/" class="leancloud_visitors" data-flag-title="一分钟教你学会搭建ngrok内网穿透"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>最近由于项目开发的需要,要和第三方对接一些接口。最开始是想直接部署在公网进行对接,后面发现重复部署以及不利于调试太浪费时间,对接过程中甚至会堵塞在某个地方许久。最后还是决定通过代理映射到内网,方便调试和对接。</p><hr><h4 id="搭建前提"><a href="#搭建前提" class="headerlink" title="搭建前提"></a>搭建前提</h4><p>1.需要一台公网服务器。这个可以租一台云服务器来解决。<br>2.需要一个域名。本人租个.cn的域名一年也只要个30块钱左右。</p><hr><h4 id="环境依赖"><a href="#环境依赖" class="headerlink" title="环境依赖"></a>环境依赖</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">yum <span class="keyword">install</span> <span class="keyword">build</span>-essential golang mercurial git</span><br><span class="line">git <span class="keyword">clone</span> https://github.com/tutumcloud/ngrok.git ngrok</span><br><span class="line">//安装nginx你也可以选择自己编译</span><br><span class="line">yum <span class="keyword">install</span> -y nginx </span><br><span class="line">//设置环境变量,这里的hcyhj.cn是你的域名,需要自己修改</span><br><span class="line"><span class="keyword">export</span> NGROK_DOMAIN=<span class="string">"hcyhj.cn"</span></span><br></pre></td></tr></table></figure><div class="post-button text-center"><a class="btn" href="/2018/11/30/ngrok/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/11/24/reentrantlock/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/11/24/reentrantlock/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">ReentrantLock源码解读</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-11-24 16:06:42" itemprop="dateCreated datePublished" datetime="2018-11-24T16:06:42+08:00">2018-11-24</time> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-calendar-check-o"></i> </span><span class="post-meta-item-text">Edited on</span> <time title="Modified: 2018-12-16 00:08:36" itemprop="dateModified" datetime="2018-12-16T00:08:36+08:00">2018-12-16</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2018/11/24/reentrantlock/" class="leancloud_visitors" data-flag-title="ReentrantLock源码解读"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>写这篇文章之前,还是先安利一本书:<a href="https://book.douban.com/subject/26591326/" target="_blank" rel="noopener">《java并发编程的艺术》</a>。这本书对锁的实现的很多细节都解释的还是很清楚的,加上自己配合源码进行理解,读懂ReentrantLock这个类的实现应该不是那么困难。本文只对<strong>独占模式</strong>进行分析。</p><hr><h4 id="一行行分析ReentrantLock源码"><a href="#一行行分析ReentrantLock源码" class="headerlink" title="一行行分析ReentrantLock源码"></a>一行行分析ReentrantLock源码</h4><p>直接步入正题,先贴一段代码看看如何使用ReentrantLock:<br></p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">ReentrantLockTest</span> {</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span>(<span class="params">String[] args</span>)</span> {</span><br><span class="line"> ReentrantLock <span class="keyword">lock</span> = <span class="keyword">new</span> ReentrantLock(<span class="literal">true</span>); <span class="comment">//1</span></span><br><span class="line"> <span class="keyword">lock</span>.<span class="keyword">lock</span>(); <span class="comment">//2</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//do something</span></span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">lock</span>.unlock(); <span class="comment">//3</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p><h5 id="ReentrantLock的构造"><a href="#ReentrantLock的构造" class="headerlink" title="ReentrantLock的构造"></a>ReentrantLock的构造</h5><p>上面代码的步骤1是调用ReentrantLock构造方法进行初始化,这里ReentrantLock给我们提供了两种锁的实现,一个是公平锁,一个是非公平锁。这两种锁顾名思义,一个排队干活,一个抢着干~~</p><div class="post-button text-center"><a class="btn" href="/2018/11/24/reentrantlock/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/11/21/delay-load/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/11/21/delay-load/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">延迟加载的一些知识和误区</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-11-21 11:57:39" itemprop="dateCreated datePublished" datetime="2018-11-21T11:57:39+08:00">2018-11-21</time> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-calendar-check-o"></i> </span><span class="post-meta-item-text">Edited on</span> <time title="Modified: 2018-12-02 20:09:37" itemprop="dateModified" datetime="2018-12-02T20:09:37+08:00">2018-12-02</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2018/11/21/delay-load/" class="leancloud_visitors" data-flag-title="延迟加载的一些知识和误区"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><p>最近开始看<a href="https://book.douban.com/subject/26591326/" target="_blank" rel="noopener">《java并发编程的艺术》</a>一书,从里面get到了好些知识上的盲点,下面就延迟加载这个问题来分析一波~~</p><hr><h3 id="首先咱们来看一段简单的代码"><a href="#首先咱们来看一段简单的代码" class="headerlink" title="首先咱们来看一段简单的代码:"></a>首先咱们来看一段简单的代码:</h3><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">public class DelayLoad {</span><br><span class="line"></span><br><span class="line"> <span class="keyword"> private</span> DelayLoad() {</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword"> private</span><span class="keyword"> static</span> Delay<span class="class">Load instance;</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword"> public</span><span class="keyword"> static</span> DelayLoad getInstance() {</span><br><span class="line"> <span class="built_in"> if </span>(instance == null) { //步骤1</span><br><span class="line"> <span class="built_in"> instance </span>=<span class="built_in"> new </span>DelayLoad(); //步骤2</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in"> return </span>instance;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>从上面的代码片段里,很容易发现在多线程并发情况下去调用getInstance是会出问题的.当A线程和B线程同时进入到步骤1处,便会实例化两个对象出来,A和B访问到的对象就不会是同一个。</p><div class="post-button text-center"><a class="btn" href="/2018/11/21/delay-load/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/11/17/volatile/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/11/17/volatile/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">浅析volatile原理及其使用</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-11-17 19:13:54" itemprop="dateCreated datePublished" datetime="2018-11-17T19:13:54+08:00">2018-11-17</time> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-calendar-check-o"></i> </span><span class="post-meta-item-text">Edited on</span> <time title="Modified: 2018-11-18 19:53:20" itemprop="dateModified" datetime="2018-11-18T19:53:20+08:00">2018-11-18</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/java/" itemprop="url" rel="index"><span itemprop="name">java</span></a></span> </span><span id="/2018/11/17/volatile/" class="leancloud_visitors" data-flag-title="浅析volatile原理及其使用"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a><strong>前言</strong></h4><p>经常在网上看一些大牛们的博客,从中收获到一些东西的同时会产生一种崇拜感,从而萌发了自己写写博客的念头.然而已经有这个念头很久,却始终不敢下手开始写.今天算是迈出了人生的一大步^_^!</p><hr><h4 id="volatile的定义及其实现"><a href="#volatile的定义及其实现" class="headerlink" title="volatile的定义及其实现"></a><strong>volatile的定义及其实现</strong></h4><p>定义:如果一个字段被声明成volatile,那么java线程内存模型将确保所有线程看到的这个变量的值都是一致的.</p><p>从它的定义当中咱们也可以了解到volatile具有可见性的特性.但它具体是如何保证其可见性的呢?</p><div class="post-button text-center"><a class="btn" href="/2018/11/17/volatile/#more" rel="contents">Read more »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://www.hcyhj.cn/2018/11/17/start-a-journey/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="mars"><meta itemprop="description" content="You don't have to be great to start, but you have to start to be great!"><meta itemprop="image" content="/images/head.jpg"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="mars Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline"><a href="/2018/11/17/start-a-journey/" class="post-title-link" itemprop="https://www.hcyhj.cn/index.html">start a journey</a></h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><span class="post-meta-item-text">Posted on</span> <time title="Created: 2018-11-17 15:56:35" itemprop="dateCreated datePublished" datetime="2018-11-17T15:56:35+08:00">2018-11-17</time> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-calendar-check-o"></i> </span><span class="post-meta-item-text">Edited on</span> <time title="Modified: 2018-11-18 17:05:28" itemprop="dateModified" datetime="2018-11-18T17:05:28+08:00">2018-11-18</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span class="post-meta-item-text">In</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/person/" itemprop="url" rel="index"><span itemprop="name">person</span></a></span> </span><span id="/2018/11/17/start-a-journey/" class="leancloud_visitors" data-flag-title="start a journey"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-eye"></i> </span><span class="post-meta-item-text">Views: </span><span class="leancloud-visitors-count"></span></span></div></header><div class="post-body" itemprop="articleBody"><p><img src="/images/jounery.jpg" alt=""><br>2018年11月17日,开始blog漫漫旅途~<strong>fighting</strong><br></p><div class="post-button text-center"><a class="btn" href="/2018/11/17/start-a-journey/#more" rel="contents">Read more »</a></div><p></p></div><footer class="post-footer"><div class="post-eof"></div></footer></div></article></section></div></div><div class="sidebar-toggle"><div class="sidebar-toggle-line-wrap"><span class="sidebar-toggle-line sidebar-toggle-line-first"></span> <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span> <span class="sidebar-toggle-line sidebar-toggle-line-last"></span></div></div><aside id="sidebar" class="sidebar"><div class="sidebar-inner"><section class="site-overview-wrap sidebar-panel sidebar-panel-active"><div class="site-overview"><div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"><img class="site-author-image" itemprop="image" src="/images/head.jpg" alt="mars"><p class="site-author-name" itemprop="name">mars</p><p class="site-description motion-element" itemprop="description">You don't have to be great to start, but you have to start to be great!</p></div><nav class="site-state motion-element"><div class="site-state-item site-state-posts"><a href="/archives/"><span class="site-state-item-count">10</span> <span class="site-state-item-name">posts</span></a></div><div class="site-state-item site-state-categories"><a href="/categories/index.html"><span class="site-state-item-count">4</span> <span class="site-state-item-name">categories</span></a></div><div class="site-state-item site-state-tags"><a href="/tags/index.html"><span class="site-state-item-count">10</span> <span class="site-state-item-name">tags</span></a></div></nav><div class="feed-link motion-element"><a href="/atom.xml" rel="alternate"><i class="fa fa-rss"></i> RSS</a></div><div class="links-of-author motion-element"><span class="links-of-author-item"><a href="https://github.com/crazyStrongboy" title="GitHub → https://github.com/crazyStrongboy" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a> </span><span class="links-of-author-item"><a href="https://www.cnblogs.com/itjun" title="cnblog → https://www.cnblogs.com/itjun" rel="noopener" target="_blank"><i class="fa fa-fw fa-globe"></i>cnblog</a> </span><span class="links-of-author-item"><a href="https://www.jianshu.com/u/55f7b32e6cfa" title="简书 → https://www.jianshu.com/u/55f7b32e6cfa" rel="noopener" target="_blank"><i class="fa fa-fw fa-book"></i>简书</a> </span><span class="links-of-author-item"><a href="https://juejin.im/user/5bf3fb2de51d4553f4271bda" title="掘金 → https://juejin.im/user/5bf3fb2de51d4553f4271bda" rel="noopener" target="_blank"><i class="fa fa-fw fa-vk"></i>掘金</a></span></div></div></section></div></aside></div></main><footer id="footer" class="footer"><div class="footer-inner"><div class="copyright">© <span itemprop="copyrightYear">2019</span> <span class="with-love" id="animate"><i class="fa fa-user"></i> </span><span class="author" itemprop="copyrightHolder">mars</span></div><div class="powered-by">Powered by <a href="https://hexo.io" class="theme-link" rel="noopener" target="_blank">Hexo</a> v3.8.0</div><span class="post-meta-divider">|</span><div class="theme-info">Theme – <a href="https://theme-next.org" class="theme-link" rel="noopener" target="_blank">NexT.Pisces</a> v6.5.0</div><div class="busuanzi-count"><script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><span class="site-uv" title="Total Visitors"><i class="fa fa-user"></i> <span class="busuanzi-value" id="busuanzi_value_site_uv"></span> </span><span class="site-pv" title="Total Views"><i class="fa fa-eye"></i> <span class="busuanzi-value" id="busuanzi_value_site_pv"></span></span></div></div></footer><div class="back-to-top"><i class="fa fa-arrow-up"></i></div></div><script type="text/javascript">"[object Function]"!==Object.prototype.toString.call(window.Promise)&&(window.Promise=null)</script><script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script><script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script><script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script><script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script><script type="text/javascript" src="/js/src/utils.js?v=6.5.0"></script><script type="text/javascript" src="/js/src/motion.js?v=6.5.0"></script><script type="text/javascript" src="/js/src/affix.js?v=6.5.0"></script><script type="text/javascript" src="/js/src/schemes/pisces.js?v=6.5.0"></script><script type="text/javascript" src="/js/src/bootstrap.js?v=6.5.0"></script><script>function showTime(Counter) {
var entries = [];
var $visitors = $(".leancloud_visitors");
$visitors.each(function () {
entries.push( $(this).attr("id").trim() );
});
Counter('get', '/classes/Counter', { where: JSON.stringify({ url: { "$in": entries } }) })
.done(function ({ results }) {
var COUNT_CONTAINER_REF = '.leancloud-visitors-count';
if (results.length === 0) {
$visitors.find(COUNT_CONTAINER_REF).text(0);
return;
}
for (var i = 0; i < results.length; i++) {
var item = results[i];
var url = item.url;
var time = item.time;
var element = document.getElementById(url);
$(element).find(COUNT_CONTAINER_REF).text(time);
}
for(var i = 0; i < entries.length; i++) {
var url = entries[i];
var element = document.getElementById(url);
var countSpan = $(element).find(COUNT_CONTAINER_REF);
if( countSpan.text() == '') {
countSpan.text(0);
}
}
})
.fail(function ({ responseJSON }) {
console.log("LeanCloud Counter Error: " + responseJSON.code + " " + responseJSON.error);
});
}
$(function() {
$.get('https://app-router.leancloud.cn/2/route?appId=' + "M7HOd7GinhikCfKrppNT4BsI-gzGzoHsz")
.done(function ({ api_server }) {
var Counter = function (method, url, data) {
return $.ajax({
method: method,
url: `https://${api_server}/1.1${url}`,
headers: {
'X-LC-Id': "M7HOd7GinhikCfKrppNT4BsI-gzGzoHsz",
'X-LC-Key': "fYcxkUFYa2Esa3qfsRmWmUhf",
'Content-Type': 'application/json',
},
data: data,
});
};
if ($('.post-title-link').length >= 1) {
showTime(Counter);
}
})
});</script></body></html><!-- rebuild by neat -->