<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[end's coding life]]></title><description><![CDATA[赤子之心]]></description><link>https://blog.youkuaiyun.com/wl6965307</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wl6965307]]></copyright><item><title><![CDATA[Golang中error的一个坑]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/102801361</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/102801361</guid><author>wl6965307</author><pubDate>Tue, 29 Oct 2019 16:01:51 +0800</pubDate><description><![CDATA[err != nil

第一个问题是：为什么值为 nil 的 error 却不等于 nil？

思考如下代码：



package main

import (
    "errors"
    "fmt"
)

type Err struct {
    err string
}

func (e *Err) Error() string {
    return e.err
}

func ...]]></description><category></category></item><item><title><![CDATA[Golang中Channel详解]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/100085315</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/100085315</guid><author>wl6965307</author><pubDate>Mon, 26 Aug 2019 20:32:40 +0800</pubDate><description><![CDATA[Channel是Go中的一个核心类型，你可以把它看成一个管道，通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。

它的操作符是箭头 &lt;-


ch &lt;- v // 发送值v到Channel ch中
v := &lt;-ch // 从Channel ch中接收数据，并将数据赋值给v

(箭头的指向就是数据的流向)

就像 map 和 slice 数据类型一...]]></description><category></category></item><item><title><![CDATA[Go工程单元测试覆盖率]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/97615798</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/97615798</guid><author>wl6965307</author><pubDate>Sun, 28 Jul 2019 16:10:51 +0800</pubDate><description><![CDATA[在go test命令后面添加 -cover参数开启测试覆盖率统计，其结果如下：ok models 0.012s coverage: 71.4% of statements in models
-coverpkg 标记来指定要被统计的代码包之后，未被指定的代码则肯定不会被统计，即使是被直接测试的那个代码包。go test -coverpkg=./... pkg2可以跑pkg2下的所有单元测试及pkg...]]></description><category></category></item><item><title><![CDATA[java并发编程--线程中断]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89847420</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89847420</guid><author>wl6965307</author><pubDate>Sun, 05 May 2019 15:49:54 +0800</pubDate><description><![CDATA[使用interrupt（）中断线程
当一个线程运行时，另一个线程可以调用对应的Thread对象的interrupt（）方法来中断它，该方法只是在目标线程中设置一个标志，表示它已经被中断，并立即返回。这里需要注意的是，如果只是单纯的调用interrupt（）方法，线程并没有实际被中断，会继续往下执行。

下面一段代码演示了休眠线程的中断:


public class SleepIn...]]></description><category></category></item><item><title><![CDATA[源码|并发一枝花之ConcurrentLinkedQueue]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89527139</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89527139</guid><author>wl6965307</author><pubDate>Sun, 05 May 2019 11:07:57 +0800</pubDate><description><![CDATA[首先声明，本文是伪源码分析。主要是基于状态机自己实现一个简化的并发队列，有助于读者掌握并发程序设计的核心——状态机；最后对源码实现略有提及。


ConcurrentLinkedQueue不支持阻塞，没有BlockingQueue那么易用；但在中等规模的并发场景下，其性能却比BlockingQueue高不少，而且相当稳定。同时，ConcurrentLinkedQueue是学习CAS的经典案例。根...]]></description><category></category></item><item><title><![CDATA[源码|并发一枝花之BlockingQueue]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89516370</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89516370</guid><author>wl6965307</author><pubDate>Thu, 25 Apr 2019 15:03:34 +0800</pubDate><description><![CDATA[今天来介绍Java并发编程中最受欢迎的同步类——堪称并发一枝花之BlockingQueue。




JDK版本：oracle java 1.8.0_102


继续阅读之前，需确保你对锁和条件队列的使用方法烂熟于心，特别是条件队列，否则你可能无法理解以下源码的精妙之处，甚至基本的正确性。本篇暂不涉及此部分内容，需读者自行准备。

接口定义

BlockingQueue继承自Queue，增加了阻塞...]]></description><category></category></item><item><title><![CDATA[Java实现生产者-消费者模型]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89499376</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89499376</guid><author>wl6965307</author><pubDate>Wed, 24 Apr 2019 17:47:10 +0800</pubDate><description><![CDATA[考查Java的并发编程时，手写“生产者-消费者模型”是一个经典问题。有如下几个考点：

对Java并发模型的理解
	对Java并发编程接口的熟练程度
	bug free
	coding style



JDK版本：oracle java 1.8.0_102


本文主要归纳了4种写法，阅读后，最好在白板上练习几遍，检查自己是否掌握。这4种写法或者编程接口不同，或者并发粒度不同，但本质是相同的——...]]></description><category></category></item><item><title><![CDATA[wait/notify/notifyAll使用]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89497621</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89497621</guid><author>wl6965307</author><pubDate>Wed, 24 Apr 2019 16:54:23 +0800</pubDate><description><![CDATA[在Java中，可以通过配合调用Object对象的wait（）方法和notify（）方法或notifyAll（）方法来实现线程间的通信。在线程中调用wait（）方法，将阻塞等待其他线程的通知（其他线程调用notify（）方法或notifyAll（）方法），在线程中调用notify（）方法或notifyAll（）方法，将通知其他线程从wait（）方法处返回。

   Object是所有类的超类...]]></description><category></category></item><item><title><![CDATA[源码|并发一枝花之ReentrantLock与AQS（3）：Condition]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89495773</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89495773</guid><author>wl6965307</author><pubDate>Wed, 24 Apr 2019 16:03:53 +0800</pubDate><description><![CDATA[JDK版本：oracle java 1.8.0_102


接口声明


public interface Lock {
    ...
    Condition newCondition();
    ...
}
public interface Condition {
    ...
    void await() throws InterruptedException;
    bo...]]></description><category></category></item><item><title><![CDATA[源码|并发一枝花之ReentrantLock与AQS（2）：lockInterruptibly]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89483196</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89483196</guid><author>wl6965307</author><pubDate>Tue, 23 Apr 2019 22:55:58 +0800</pubDate><description><![CDATA[JDK版本：oracle java 1.8.0_102


接口声明


public interface Lock {

...

void lock();

void lockInterruptibly() throws InterruptedException;

void unlock();

...

}

Lock#lockInterruptibly()是Lock#lock()的一个...]]></description><category></category></item><item><title><![CDATA[源码|并发一枝花之ReentrantLock与AQS（1）：lock、unlock]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89469503</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89469503</guid><author>wl6965307</author><pubDate>Tue, 23 Apr 2019 11:52:56 +0800</pubDate><description><![CDATA[显示锁ReentrantLock的内部同步依赖于AQS（AbstractQueuedSynchronizer），因此，分析ReentrantLock必然涉及AQS。

本文假设读者已熟练掌握AQS的基本原理（参考AQS的基本原理），通过分析ReentrantLock#lock()与ReentrantLock#unlock()的实现原理，用实例帮助读者理解AQS的等待队列模型。




JDK版本：...]]></description><category></category></item><item><title><![CDATA[浅谈偏向锁、轻量级锁、重量级锁]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89469446</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89469446</guid><author>wl6965307</author><pubDate>Tue, 23 Apr 2019 11:50:05 +0800</pubDate><description><![CDATA[为了换取性能，JVM在内置锁上做了非常多的优化，膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题，几种锁的分配和膨胀过程，有助于编写并优化基于锁的并发程序。




内置锁的分配和膨胀过程较为复杂，限于时间和精力，文中该部分内容是根据网上的多方资料整合而来；仅为方便查阅，后面继续分析JVM源码的时候也有个参考。如果对各级锁已经有了基本了解，读者大可跳过此文。


隐藏在...]]></description><category></category></item><item><title><![CDATA[求质数算法----层层递进的N种算法]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/89434937</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/89434937</guid><author>wl6965307</author><pubDate>Sun, 21 Apr 2019 18:51:02 +0800</pubDate><description><![CDATA[题目1：给出一个正整数n，打印出所有从1~n的素数(即质数);

题目2：给出一个正整数n，打印出自然数中最小的n个素数(即质数);

先讨论问题1.

普通解法

傻瓜法
对于每个数m，逐个去除以小于它的数，看是否只有1能够整除。

优化
对于每个数m，逐个去除以小于等于sqrt(m)的数，看是否只有1能够整除。

进一步优化
对于每个数m，其实只需要对小于m的已经求出来的质数进行试除，直到sq...]]></description><category></category></item><item><title><![CDATA[正确理解Thread Local的原理与适用场景]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/88250790</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/88250790</guid><author>wl6965307</author><pubDate>Wed, 06 Mar 2019 19:23:13 +0800</pubDate><description><![CDATA[ThreadLocal解决什么问题

由于 ThreadLocal 支持范型，如 ThreadLocal&amp;lt; StringBuilder &amp;gt;，为表述方便，后文用变量代表 ThreadLocal 本身，而用实例代表具体类型（如 StringBuidler ）的实例。

不恰当的理解

写这篇文章的一个原因在于，网上很多博客关于 ThreadLocal 的适用场景以及解决的问题，描述...]]></description><category></category></item><item><title><![CDATA[HTTP和WebSocket协议的区别与联系]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/87800803</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/87800803</guid><author>wl6965307</author><pubDate>Wed, 20 Feb 2019 15:39:48 +0800</pubDate><description><![CDATA[那天和boss聊天，不经意间提到了Meteor，然后聊到了WebSocket，然后就有了以下对话，不得不说，看问题的方式不同，看到的东西也会大不相同。
A：Meteor是一个很新的开发框架，我觉得它设计得十分巧妙。
B：怎么个巧妙之处？
A：它的前后端全部使用JS，做到了真正的前后端统一；前端浏览器里存有一份后台开放出来的数据库的拷贝，快；使用WebSocket协议来做数据传输协议，来同步前后端的...]]></description><category></category></item><item><title><![CDATA[JPA 已作废的SQLQuery.class、setResultTransformer方法替换]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/86640910</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/86640910</guid><author>wl6965307</author><pubDate>Fri, 25 Jan 2019 11:23:19 +0800</pubDate><description><![CDATA[jpa可以使用setResultTransformer，将查询结果以map返回，key为字段名全大写。

hibernate 5.2 之后，SQLQuery.class、setResultTransformer方法已作废，其用法如下:


Query query = entityManager.createNativeQuery(sql, clazz);
query.unwrap(SQLQuery...]]></description><category></category></item><item><title><![CDATA[ES官方说明：Removal of mapping types]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/85230792</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/85230792</guid><author>wl6965307</author><pubDate>Mon, 24 Dec 2018 11:22:29 +0800</pubDate><description><![CDATA[Indices created in Elasticsearch 6.0.0 or later may only contain a single mapping type. Indices created in 5.x with multiple mapping types will continue to function as before in Elasticsearch 6.x. Map...]]></description><category></category></item><item><title><![CDATA[Elasticsearch 连接查询]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/85139214</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/85139214</guid><author>wl6965307</author><pubDate>Thu, 20 Dec 2018 20:48:41 +0800</pubDate><description><![CDATA[ES中的连接

在ES中支持两种连接方式：嵌套查询 和 has_child、has_parent父子查询

嵌套查询：

文档中包含嵌套的字段，这些字段以数组的形式保存对象，这样每个嵌套的子对象都可以被搜索。

has_child、has_parent父子查询：

父子文档是存储在同一个索引中的不同类型，在索引数据前定义父子关系。在父子查询中，父子关系通过类型引用。

嵌套查询

嵌套类型需要实现...]]></description><category></category></item><item><title><![CDATA[Elasticsearch DSL介绍]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/85138494</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/85138494</guid><author>wl6965307</author><pubDate>Thu, 20 Dec 2018 20:35:47 +0800</pubDate><description><![CDATA[ES支持一种JSON格式的查询，叫做DSL，domain specific language。这门语言刚开始比较难理解，因此通过几个简单的例子开始：

下面的命令，可以搜索全部的文档：


{
  &quot;query&quot;: { &quot;match_all&quot;: {} }
}

query定义了查询，match_all声明了查询的类型。还有其他的参数可以控制返回的结果：


curl -XPOST 'localho...]]></description><category></category></item><item><title><![CDATA[ElasticSearch DSL中Query Filter的区别]]></title><link>https://blog.youkuaiyun.com/wl6965307/article/details/85138057</link><guid>https://blog.youkuaiyun.com/wl6965307/article/details/85138057</guid><author>wl6965307</author><pubDate>Thu, 20 Dec 2018 20:27:23 +0800</pubDate><description><![CDATA[举个DSL例子




GET _search
{
  &quot;query&quot;: { 
    &quot;bool&quot;: { 
      &quot;must&quot;: [
        { &quot;match&quot;: { &quot;title&quot;:   &quot;Search&quot;        }}, 
        { &quot;match&quot;: { &quot;content&quot;: &quot;Elasticsearch&]]></description><category></category></item></channel></rss>