<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[九里的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/a2524289</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; a2524289]]></copyright><item><title><![CDATA[Java并发编程（二）如何保证线程同时/交替执行]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/116976054</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/116976054</guid><author>a2524289</author><pubDate>Tue, 18 May 2021 09:35:40 +0800</pubDate><description><![CDATA[第一篇文章中，我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜。本篇我们依然不会有源码分析，而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法。
系列文章
Java并发编程（一）如何保证线程顺序执行
一、如何保证多个线程同时执行
保证多个线程同时执行，指的是多个线程在同一时间开始执行内部run()方法。
经过第一篇的学习，你应该能理解到，让线程能按我们的意志来运行其实是需要用一些手段（信号量、并发工具、线程池等）来实现的。常用的并发工具一般有CountD]]></description><category></category></item><item><title><![CDATA[Java并发编程（一）如何保证线程顺序执行]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/116792303</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/116792303</guid><author>a2524289</author><pubDate>Fri, 14 May 2021 15:04:58 +0800</pubDate><description><![CDATA[只要了解过多线程，我们就知道线程开始的顺序跟执行的顺序是不一样的。如果只是创建三个线程然后执行，最后的执行顺序是不可预期的。这是因为在创建完线程之后，线程执行的开始时间取决于CPU何时分配时间片，线程可以看成是相对于的主线程的一个异步操作。
public class FIFOThreadExample {
    public synchronized static void foo(String name) {
        System.out.print(name);
    }

    publ]]></description><category></category></item><item><title><![CDATA[[翻译]Java 8 并行流 – 自定义线程池示例]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/116750554</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/116750554</guid><author>a2524289</author><pubDate>Thu, 13 May 2021 14:59:11 +0800</pubDate><description><![CDATA[本篇是简单介绍如何自定义线程池并在Java 8 的Parallel Streams中使用线程池。并举例介绍如何不使用普通线程池而是使用自定义线程池来调用Parallel streams API。
1. 介绍
在本篇教程中，您将学习如何使用强大的并行流API（在Java8中）创建用于批量数据处理的自定义线程池。
并行流可以在并发环境中运行，这是以多线程开销为代价的streams性能的改进版本。
本文重点关注Stream API的最大限制并举例说明如何将并行流与自定义线程池结合使用。
public class ]]></description><category></category></item><item><title><![CDATA[每个产品经理都该懂点技术（二）：接口文档的作用]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109644057</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109644057</guid><author>a2524289</author><pubDate>Thu, 12 Nov 2020 14:57:43 +0800</pubDate><description><![CDATA[两年前写了每个产品经理都该懂点技术的第一篇。我以为我能坚持写个七八篇这个系列的文章，结果两年过去了第二篇都没写完。其实并不是没写，而是自己对产品和技术之间的关系的理解确实浅薄。今天发表这篇主要是因为我没预料到第一篇能有将近5000的阅读（考虑到很多我认真写的技术文章阅读不过百，5000阅读数已经是我的人生巅峰了），其次是今年三月份有个读者评论让我续写。所以我就把之前写的这篇加上这两年的思考重新整理了一下。望各位喜欢。

上一篇提到，前后端合作开发的时候需要用到接口文档。那么本篇就说说接口文档在产品中究竟有什]]></description><category></category></item><item><title><![CDATA[探索Java8：(四)DateTime API的使用]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109582258</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109582258</guid><author>a2524289</author><pubDate>Mon, 09 Nov 2020 17:40:30 +0800</pubDate><description><![CDATA[感谢
千呼万唤始出来，探索Java8系列第四篇闪亮登场。探索Java8第一篇是2018年4月9号发布的，也就是说本篇距离探索Java8第一篇发布已经整整过去了两年半的时间。前三篇我发布到了简书、博客园、优快云、掘金、SegmentFault，累计阅读量估计在10W左右。正是因为这个，所以我才有动力写下本系列的第四篇。非常感谢有这么多人阅读我的文章，如果对你有任何的帮助那真是我的荣幸。

Java8中的一个新特性是就是对老旧的时间API的改进，Java8中引入了全新的DateTime API。分别为Loca]]></description><category></category></item><item><title><![CDATA[Cron表达式详解和表达式的验证]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109177764</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109177764</guid><author>a2524289</author><pubDate>Tue, 20 Oct 2020 11:27:44 +0800</pubDate><description><![CDATA[本篇不算原创，因为主要内容来自网上的博客，所以给出我参考文章的链接。
本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结、Cron表达式 这两篇文章。
cron校验的内容参考了 判断cron表达式输入是否有效的正则表达式 和Verifying a cron expression is valid in Java 这两篇文章。

一、表达式组成
Cron表达式是一个字符串，字符串以5或6个空格隔开，分为6或7个域，每一个域代表一个含义，Cron有如下两种语法格式：
Secon]]></description><category></category></item><item><title><![CDATA[探索Java8：(三)Predicate接口的使用]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109109714</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109109714</guid><author>a2524289</author><pubDate>Fri, 16 Oct 2020 09:08:51 +0800</pubDate><description><![CDATA[上一篇学习了下Function接口的使用，本篇我们学习下另一个实用的函数式接口Predicate。
Predicate的源码跟Function的很像，我们可以对比这两个来分析下。直接上Predicate的源码：
public interface Predicate&lt;T&gt; {
    /**
     * Evaluates this predicate on the given argument.
     */
    boolean test(T t);

    /**
     * Re]]></description><category></category></item><item><title><![CDATA[面试题：Java回形数组]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109065276</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109065276</guid><author>a2524289</author><pubDate>Wed, 14 Oct 2020 09:03:40 +0800</pubDate><description><![CDATA[最近遇到一个面试题。
给定一个数字n，输出一个n阶矩阵。矩阵中的元素为1到n²。按回形排列
eg1 :

输入：n=2
输出:
1  2
4  3

eg2:

输入：n=3
输出：
1  2  3
8  9  4
7  6  5

思路：
这个题属于现实中遇到很简单，但是程序实现还是有些难度的问题。
面试的时候面试官让我手写出这个问题的解法，无奈最后实在没写出来。纸上写代码太难了。
这个问题其实需要分成三个层次去看。
第一层看出来，此问题需要一个二维数组解决
第二层看出来，此问题一个有四种操作数组的情况
]]></description><category></category></item><item><title><![CDATA[探索Java8：(二)Function接口的使用]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109029881</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109029881</guid><author>a2524289</author><pubDate>Mon, 12 Oct 2020 16:09:06 +0800</pubDate><description><![CDATA[Java8 添加了一个新的特性Function，顾名思义这一定是一个函数式的操作。我们知道Java8的最大特性就是函数式接口。所有标注了@FunctionalInterface注解的接口都是函数式接口，具体来说，所有标注了该注解的接口都将能用在lambda表达式上。
标注了@FunctionalInterface的接口有很多，但此篇我们主要讲Function，了解了Function其他的操作也就很容易理解了。
@FunctionalInterface
public interface Function&lt]]></description><category></category></item><item><title><![CDATA[今后文章也要同步发到优快云了]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109028595</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109028595</guid><author>a2524289</author><pubDate>Mon, 12 Oct 2020 15:30:12 +0800</pubDate><description><![CDATA[我的技术博客一直是发在简书、博客园和我的个人网站上面。曾经我也在优快云上发表文章，但是后来因为口味不太符合后来就不在优快云上发表了。
今天重新登上优快云发现上面的技术氛围和活跃度竟然比博客园和简书（简书真的是一手好牌打的稀烂）好很多。所以决定以后的文章要优先发到优快云，但是简书和博客园我也会同步发表。
欢迎评论区交流哦

...]]></description><category></category></item><item><title><![CDATA[小工具：word表格文字转化成insert语句]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/109028443</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/109028443</guid><author>a2524289</author><pubDate>Mon, 12 Oct 2020 15:23:52 +0800</pubDate><description><![CDATA[群里的一个朋友有个需要，要让把word里的表格数据插入到数据库里面。

我的思路是，把格式化的数据转成insert语句，然后去执行就可以了。
要求的insert语句格式是：'insert into xxx values(“字段1”,“字段2”,“字段3”);"
public class WordsProcessor {
	public static void main(String[] args) {
		String strings="Col1  Col2 Col3 Col4 Col5\r\n" + 
	]]></description><category></category></item><item><title><![CDATA[探索Java8：Stream的使用]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/79880254</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/79880254</guid><author>a2524289</author><pubDate>Tue, 10 Apr 2018 13:55:24 +0800</pubDate><description><![CDATA[Java 8 API添加了一个新的抽象称为流Stream，可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力，让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流， 流在管道中传输， 并且可以在管道的节点上进行...]]></description><category></category></item><item><title><![CDATA[如何写出格式优美的javadoc？]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/79357699</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/79357699</guid><author>a2524289</author><pubDate>Fri, 23 Feb 2018 23:16:45 +0800</pubDate><description><![CDATA[如果你读过Java源码，那你应该已经见到了源码中优美的javadoc。在eclipse 中鼠标指向任何的公有方法都会显示出详细的描述，例如返回值、作用、异常类型等等。

本文主要来自《Thinking in java》的内容以及我在工作中写javadoc的经验。



三种类型的注释文档

注释文档有三种类型，分别对应于注释位置后面的三种元素：类、域和方法。也就说类注释正好位于类定义之前；域注释位...]]></description><category></category></item><item><title><![CDATA[《设计模式之禅》读书笔记(五)之代理模式]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/79259767</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/79259767</guid><author>a2524289</author><pubDate>Mon, 05 Feb 2018 14:28:10 +0800</pubDate><description><![CDATA[1. 代理模式的定义和应用



1.1 代理模式的定义

Provide a surrogate or placeholder for another object to control access to it .(为其他对象提供一种代理以控制对这个对象的访问)

代理模式的类图如下：



代理模式也叫做委托模式，是一种基本设计技巧。许多其他的模式，如状态模式、策略模式、访问者模式本质上是在]]></description><category></category></item><item><title><![CDATA[从一个审批需求看数据库设计——联合主键的使用]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/79175697</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/79175697</guid><author>a2524289</author><pubDate>Fri, 26 Jan 2018 18:45:43 +0800</pubDate><description><![CDATA[最近工作挺忙，已经接近996了，所以博客更新也少了。今天忙里偷闲，分享一个最近遇到的一个数据库设计问题。业务需求是：


  
  针对一条人员信息的数据进行审批操作
  在进行审批时要看到审批前后数据的修改
  同一人员的审批数据只能存在一条
  审批通过后数据在正式表中生效
  审批通过后保存审批结果数据
  


业务逻辑本身并不复杂，我们可以建一个跟正式表完全相同的临时表来存储修改的数据，]]></description><category></category></item><item><title><![CDATA[「翻译」一篇redis文章引发的翻译——JVM能支持多少线程？]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/79043640</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/79043640</guid><author>a2524289</author><pubDate>Fri, 12 Jan 2018 14:27:33 +0800</pubDate><description><![CDATA[昨天看了一篇关于redis 的文。

https://www.cnblogs.com/fanwencong/p/5782860.html

作者说他模拟了100万线程的并发，我对这个有一些怀疑，看了评论也有很多质疑的声音。当然我这篇不是要批评作者对线程的模拟，事实上作者写的对redis的使用是很不错的，我们本篇主要针对个人电脑上的JVM最多能支持多少个线程。以下是StackOverflow上的一个]]></description><category></category></item><item><title><![CDATA[深入解析Java AtomicInteger 原子类型]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/78992516</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/78992516</guid><author>a2524289</author><pubDate>Sat, 06 Jan 2018 23:38:16 +0800</pubDate><description><![CDATA[在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果，也就是实现线程安全。线程安全的定义如下：


  当多个线程访问某个类时，不管运行时环境采用何种调度方式或者这些线程将如何交替执行，并且在主调代码中不需要任何额外的同步或协同，这个类都能表现出正确的行为，那么这个类就是线程安全的。


举个线程不安全的例子。假如我们想实现一个功能来统计网页访问量，你可能想到用count+]]></description><category></category></item><item><title><![CDATA[ConcurrentHashMap——浅谈实现原理及源码]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/78907552</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/78907552</guid><author>a2524289</author><pubDate>Tue, 26 Dec 2017 23:04:33 +0800</pubDate><description><![CDATA[HashMap 在高并发下会出现链表环，从而导致程序出现死循环。高并发下避免HashMap 出问题的方法有两种。一是使用HashTable，二是使用Collections.syncronizedMap但是这两种方法的性能都能差。因为这两个在执行读写操作时都是将整个集合加锁，导致多个线程无法同时读写]]></description><category></category></item><item><title><![CDATA[浅谈HashMap 的底层原理]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/78888480</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/78888480</guid><author>a2524289</author><pubDate>Sun, 24 Dec 2017 23:28:14 +0800</pubDate><description><![CDATA[本文整理自漫画：什么是HashMap? -小灰的文章 。已获得作者授权。HashMap 是一个用于存储Key-Value 键值对的集合，每一个键值对也叫做Entry。这些个Entry 分散存储在一个数组当中，这个数组就是HashMap 的主干。 
HashMap 数组每一个元素的初始值都是Null。 
1. Put 方法的原理调用Put方法的时候发生了什么呢？ 
比如调用 hashMap.put(“]]></description><category></category></item><item><title><![CDATA[如何在命令提示符下编译运行含有Package的java文件]]></title><link>https://blog.youkuaiyun.com/a2524289/article/details/78815142</link><guid>https://blog.youkuaiyun.com/a2524289/article/details/78815142</guid><author>a2524289</author><pubDate>Fri, 15 Dec 2017 17:21:28 +0800</pubDate><description><![CDATA[这篇是大二自学Java的时候记下的笔记，中午回顾印象笔记的时候意外看到了这篇。看到多年前写下的文字，我想起那时候我对Java的懵懵懂懂，每天晚上在图书馆照着书写书上的示例代码，为一个中文分号绞尽脑汁，为命令提示符上打印出的图案而兴奋。到现在我依然觉得，一个从没有过编程经验的人在屏幕上打印出Hello World 的时候，他真的感觉是对一个全新的世界说了句“你好，我来了”。尽管现在来看那时候遇到的问题]]></description><category></category></item></channel></rss>