<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>知行</title>
  <id>http://pipe.b3log.org/blogs/ibut</id>
  <updated></updated>
  <subtitle>总结之后必有收获</subtitle>
  <link href="http://pipe.b3log.org/blogs/ibut"></link>
  <entry>
    <title>用Redis构建分布式锁</title>
    <updated>2018-11-12T16:36:09+08:00</updated>
    <id>tag:pipe.b3log.org,2018-11-12:/blogs/ibut/articles/2018/11/12/1542011769069</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/11/12/1542011769069" rel="alternate"></link>
    <summary type="html">用 Redis 构建分布式锁在不同进程需要互斥地访问共享资源时，分布式锁是一种非常有用的技术手段。有很多三方库和文章描述如何用 Redis 实现一个分布式锁管理器，但是这些库实现的方式差别很大，而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可以获得更好的可靠性。最近自己基于 Redis 做了一个实现，发出来希望大家一起讨论下，看是否还有不可靠情况，能否再完善。@Value(&#34;${配置服务器标识}&#34;)pr</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>Linux的基本IO模型</title>
    <updated>2019-05-01T20:11:12+08:00</updated>
    <id>tag:pipe.b3log.org,2019-05-01:/blogs/ibut/articles/2019/05/01/1611647819846</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2019/05/01/1611647819846" rel="alternate"></link>
    <summary type="html">在 Java 中，主要有三种 IO 模型，分别是阻塞 IO（BIO）、非阻塞 IO（NIO）和异步 IO（AIO）。Java 中提供的 IO 有关的 API，在文件处理的时候，其实依赖操作系统层面的 IO 操作实现的。比如在 Linux2.6 以后，Java 中 NIO 和 AIO 都是通过 epoll 来实现的，而在 Windows 上，AIO 是通过 IOCP 来实现的。在 Linux(UNIX)操作系统中，共有五种 IO 模型，分别是：阻塞 IO 模型、非</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>谈谈强引用、软引用、弱引用、幻象引用？</title>
    <updated>2019-04-28T21:00:27+08:00</updated>
    <id>tag:pipe.b3log.org,2019-04-28:/blogs/ibut/articles/2019/04/28/1604654817446</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2019/04/28/1604654817446" rel="alternate"></link>
    <summary type="html">我们知道在 Java 中除了基础的数据类型以外，其它的都为引用类型。而 Java 根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、幻象引用。正常情况下我们平时基本上我们只用到强引用类型，而其他的引用类型我们也就在面试中，或者平日阅读类库或其他框架源码的时候才能见到。1.强引用我们平日里面的用到的 new 了一个对象就是强引用，例如 Objectobj=newObject();当 JVM 的内存空间不足时，</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>优雅你的代码--Java8 Lambda 场景示例</title>
    <updated>2019-03-31T15:45:55+08:00</updated>
    <id>tag:pipe.b3log.org,2019-03-31:/blogs/ibut/articles/2019/03/31/1554018355189</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2019/03/31/1554018355189" rel="alternate"></link>
    <summary type="html">阅读前提了解 java8 的一些新特性,如:Optional、Stream 背景一切的一切，源于不喜欢在代码中写太多的 ifelse.scene&amp;solution1.Optional 方法描述 of 把指定的值封装为 Optional 对象，如果指定的值为 null，则抛出 NullPointerExceptionempty 创建一个空的 Optional 对象 ofNullable 把指定的值封装为 Optional 对象，如果指定</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>Java并发 - - 锁</title>
    <updated>2019-03-08T11:27:19+08:00</updated>
    <id>tag:pipe.b3log.org,2019-03-08:/blogs/ibut/articles/2019/03/08/1552015638867</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2019/03/08/1552015638867" rel="alternate"></link>
    <summary type="html">昨天有人问到了乐观锁和悲观锁的使用场景，虽然有所了解但是在 java 中关于锁的概念还有很多,今天趁着妇女之友的节日总结一下。CASCAS 全称 CompareAndSwap（比较与交换）是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。AQSAQS 是 AbustactQueuedSynchroniz</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>书看完了，跟没看一样，转头就忘？</title>
    <updated>2019-02-26T22:36:07+08:00</updated>
    <id>tag:pipe.b3log.org,2019-02-26:/blogs/ibut/articles/2019/02/26/1551191767075</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2019/02/26/1551191767075" rel="alternate"></link>
    <summary type="html">为什么有的人看完了书，跟没看差不多，转头就忘记？而有些人看完一本书就像升了一级 Level，这样的人学习能力就很强。差别的重点就是学习方法上的不同，让我们看看那些学习能力强的人是怎么看书的。看书-&amp;gt; 理解-&amp;gt; 思考-&amp;gt; 产生疑问-&amp;gt; 结合工作思考-&amp;gt; 思考改善点（结合实际怎么做）—&amp;gt; 与他人分享和讨论如果大家都能够按照上面这个方法来看书，想忘记都难 ❤️</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>程序设计之SOLID</title>
    <updated>2019-01-27T17:51:10+08:00</updated>
    <id>tag:pipe.b3log.org,2019-01-27:/blogs/ibut/articles/2019/01/27/1548582712515</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2019/01/27/1548582712515" rel="alternate"></link>
    <summary type="html">SOLID 是单一职责原则(SRP)，开闭原则(OCP)，里氏替换原则(LSP)，接口隔离原则(ISP)和依赖倒置原则(DIP)的缩写，指代了面向对象编程和面向对象设计的五个基本原则。原则是要比设计模式更基础更重要的指导准则，是面向对象设计的 Bible。深入理解后，会极大的提升我们的程序设计能力切实提高代码质量。单一职责(S)对象应该仅具有一种功能,单一职责可以看作是低耦合、高内聚在面向对象原则上的引</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>过滤器（Filter）与拦截器（Interceptor )</title>
    <updated>2018-12-15T16:32:11+08:00</updated>
    <id>tag:pipe.b3log.org,2018-12-15:/blogs/ibut/1544862731011</id>
    <link href="http://pipe.b3log.org/blogs/ibut/1544862731011" rel="alternate"></link>
    <summary type="html">总得来说过滤器和拦截器触发时机不一样:过滤器是在请求进入容器后，但请求进入 servlet 之前进行预处理的。请求结束返回也是，是在 servlet 处理完后，返回给前端之前。所以过滤器的 doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)的入参是 ServletRequest，而不是 httpservletreques</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>群分享：不要落入实施细节的陷阱</title>
    <updated>2018-11-09T16:19:16+08:00</updated>
    <id>tag:pipe.b3log.org,2018-11-09:/blogs/ibut/articles/2018/11/09/1541751555817</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/11/09/1541751555817" rel="alternate"></link>
    <summary type="html">分享一下阮一峰的观点：我引用了一个开发者对年轻程序员的告诫。在软件开发中，技术变化如此之快，你花费了大量时间学习技术和工具，一旦这些技术被取代，你的知识将变得毫无价值，因为它们大部分都是实施的细节。我最近总是在想这段话，软件开发算不算是真正的知识？如果它是一种真正的知识，那么理论上，我们学到的东西大部分应该不会过时，就好像微积分不会过时一样。可是实际上，我们都知道，软件开发技能有时效性，十年前学习的</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>java8 List转map</title>
    <updated>2018-10-10T12:43:12+08:00</updated>
    <id>tag:pipe.b3log.org,2018-10-10:/blogs/ibut/articles/2018/10/10/1539146592304</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/10/10/1539146592304" rel="alternate"></link>
    <summary type="html">[Map 的 merge 方法]为了取数据方便，经常会有遇到 List 转 Map 的需求，这是典型的空间换时间做法。Java8 提供了 merge，方便快捷 publicstaticvoidmain(String[]args){Map&amp;lt;Long,List&amp;lt;SpuProduct&amp;gt;&amp;gt;map=New.hashMap();List&amp;lt;SpuProduct&amp;gt;spuList=New.arrayList();spuList.add(</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>领域驱动设计(DDD）- 多研究些架构，少谈些框架</title>
    <updated>2018-08-12T12:52:39+08:00</updated>
    <id>tag:pipe.b3log.org,2018-08-12:/blogs/ibut/articles/2018/08/12/1534049559486</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/08/12/1534049559486" rel="alternate"></link>
    <summary type="html">至少 30 年以前，一些软件设计人员就已经意识到领域建模和设计的重要性，并形成一种思潮，EricEvans 将其定义为领域驱动设计（Domain-DrivenDesign，简称 DDD）。在互联网开发“小步快跑，迭代试错”的大环境下，DDD 似乎是一种比较“古老而缓慢”的思想。然而，由于互联网公司也逐渐深入实体经济，业务日益复杂，我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。本文就先来讲一下这些</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>mysql 8+用户密码设置注意事项</title>
    <updated>2018-06-23T11:29:29+08:00</updated>
    <id>tag:pipe.b3log.org,2018-06-23:/blogs/ibut/articles/2018/06/23/1529724569042</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/06/23/1529724569042" rel="alternate"></link>
    <summary type="html">在 MySQL8.0.11 中，caching_sha2_password 是默认的身份验证插件，而不是以往的 mysql_native_password。(安装的时候可以自主选择为 mysql_native_password 避免客服端连接的麻烦)有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息，请参阅 caching_sha2_password 作为首选的身份验证插件。(翻译自 https:/</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>Twitter的分布式自增ID算法snowflake (Java版)</title>
    <updated>2018-06-03T20:00:02+08:00</updated>
    <id>tag:pipe.b3log.org,2018-06-03:/blogs/ibut/articles/2018/06/03/1532102577381</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/06/03/1532102577381" rel="alternate"></link>
    <summary type="html">分布式系统中，有一些需要使用全局唯一 ID 的场景，这种时候为了防止 ID 冲突可以使用 36 位的 UUID，但是 UUID 有一些缺点，首先他相对比较长，另外 UUID 一般是无序的。有些时候我们希望能使用一种简单一些的 ID，并且希望 ID 能够按照时间有序生成。而 twitter 的 snowflake 解决了这种需求，最初 Twitter 把存储系统从 MySQL 迁移到 Cassandra，因为 Cassandra 没有顺序 ID 生成机制</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>优雅你的实体类 -- Lombok代替Getter/Setter方法</title>
    <updated>2018-02-03T09:32:28+08:00</updated>
    <id>tag:pipe.b3log.org,2018-02-03:/blogs/ibut/articles/2018/02/03/1535419999589</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/02/03/1535419999589" rel="alternate"></link>
    <summary type="html">大家经常在编写实体类 Model 的时候，需要生成 Getter/Setter 方法，如果一个 Model 类很多字段的时候，Model 类的代码将会很多，看起来不清爽，特此引入了 Lombok(lombok.*包)。lombok 的官方网址：http://projectlombok.org/让 IDE 支持 lombok，如果不安装插件，IDE 是无法解析 Lombok 的注解 IDEAFile–&amp;gt;Settings–&amp;gt;Plugi</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>Java Proxy 和 CGLIB 动态代理原理</title>
    <updated>2018-01-22T10:05:49+08:00</updated>
    <id>tag:pipe.b3log.org,2018-01-22:/blogs/ibut/hello-world</id>
    <link href="http://pipe.b3log.org/blogs/ibut/hello-world" rel="alternate"></link>
    <summary type="html">动态代理在 Java 中有着广泛的应用，比如 SpringAOP，Hibernate 数据查询、测试框架的后端 mock、RPC，Java 注解对象获取等。静态代理的代理关系在编译时就确定了，而动态代理的代理关系是在编译期后确定的。静态代理实现简单，适合于代理类较少且确定的情况，而动态代理则给我们提供了更大的灵活性。今天我们来探讨 Java 中两种常见的动态代理方式：JDK 原生动态代理和 CGLIB 动态代理。JDK 原</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>分布式之数据库和缓存双写一致性方案解析</title>
    <updated>2018-01-07T19:24:13+08:00</updated>
    <id>tag:pipe.b3log.org,2018-01-07:/blogs/ibut/articles/2018/01/07/1534051506959</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2018/01/07/1534051506959" rel="alternate"></link>
    <summary type="html">首先，缓存由于其高并发和高性能的特性，已经在项目中被广泛使用。在读取缓存方面，大家没啥疑问，都是按照下图的流程来进行业务操作。但是在更新缓存方面，对于更新完数据库，是更新缓存呢，还是删除缓存。又或者是先删除缓存，再更新数据库，其实大家存在很大的争议。从理论上来说，给缓存设置过期时间，是保证最终一致性的解决方案。这种方案下，我们可以对存入缓存的数据设置过期时间，所有的写操作以数据库为准，对缓存操作只是</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>maven中scope标签详解</title>
    <updated>2017-12-19T16:42:26+08:00</updated>
    <id>tag:pipe.b3log.org,2017-12-19:/blogs/ibut/articles/2017/12/19/1530002880164</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2017/12/19/1530002880164" rel="alternate"></link>
    <summary type="html">最近在做 pom 优化工作，发现对于 maven 依赖管理中的 scope 标签还是有不明白的地方，所以今天就来总结一下这方面的知识，scope 在 maven 的依赖管理中主要负责项目的部署 maven 的哲学在上次技术分享的时候也提到了：约定大于配置，所以在 maven 中，很多内容都有默认值，scope 的默认值是 compile，那么 scope 还能有哪些选项呢？scope 的分类 1.compile：默认值他表示被依赖项目需</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>Socket与WebSocket与http</title>
    <updated>2017-12-15T23:11:00+08:00</updated>
    <id>tag:pipe.b3log.org,2017-12-15:/blogs/ibut/articles/2017/12/15/1525705986282</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2017/12/15/1525705986282" rel="alternate"></link>
    <summary type="html">什么是 Socket？socket 起源于 Unix，而 Unix/Linux 基本哲学之一就是“一切皆文件”，都可以用“打开 open–&amp;gt; 读写 write/read–&amp;gt; 关闭 close”模式来操作。我的理解就是 Socket 就是该模式的一个实现，socket 即是一种特殊的文件，一些 socket 函数就是对其进行的操作（读/写 IO、打开、关闭）。socket 中 TCP 的三次握手建立连接详解我们知道 tcp 建立连接要进行“三</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>java常用框架相关知识 Spring MVC 和 MyBatis</title>
    <updated>2017-12-10T12:50:30+08:00</updated>
    <id>tag:pipe.b3log.org,2017-12-10:/blogs/ibut/articles/2017/12/10/1524905497645</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2017/12/10/1524905497645" rel="alternate"></link>
    <summary type="html">JavaWeb 开发经典的 3 层框架：Web 层、Service 层（业务逻辑层）和 Dao 层（数据访问层）Web 层：包含 JSP 和 Servlet 等与 Web 相关的内容；业务层：只关心业务逻辑；数据层：封装了对数据库的访问细节。Spring 知识点 01.Spring 的 IOC 和 AOP 有了解吗？答：IOC：控制反转，（解耦合）将对象间的依赖关系交给 Spring 容器，使用配置文件来创建所依赖的对象，由主动创建对象改为了被</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
  <entry>
    <title>MYSQL 数据库知识点</title>
    <updated>2017-12-03T15:33:23+08:00</updated>
    <id>tag:pipe.b3log.org,2017-12-03:/blogs/ibut/articles/2017/12/03/1524905181551</id>
    <link href="http://pipe.b3log.org/blogs/ibut/articles/2017/12/03/1524905181551" rel="alternate"></link>
    <summary type="html">**01.**MySQL 和 MongoDB 的区别有哪些？如何选择？关系型数据库和文档型数据库，存储方式数据处理，架构特点。mongoDB 适于事件的记录，内容管理或者博客平台等。**02.**分析一下 Mysql 和 Mongodb 应用场景(*HBase)1.如果需要将 mongodb 作为后端 db 来代替 mysql 使用，即这里 mysql 与 mongodb 属于平行级别，那么，这样的使用可能有以下几种情况的考量：(1)</summary>
    <author>
      <name>ibut</name>
    </author>
  </entry>
</feed>