<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wujingyicode的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wujingyicode</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wujingyicode]]></copyright><item><title><![CDATA[Java泛型其实很简单（二）：泛型，继承，子类型]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/112209548</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/112209548</guid><author>wujingyicode</author><pubDate>Mon, 04 Jan 2021 23:20:47 +0800</pubDate><description><![CDATA[本系列博客：
Java泛型其实很简单（一）：泛型类，泛型接口和泛型方法
文章目录1 一个常见误区2 泛型类与子类型
1 一个常见误区
大家都知道：如果Student是Person的子类，那么我们可以将Children的对象赋值给Father的引用。如下：
Student s = new Student();
Person p = s; // OK.

在面向对象中，Student和Person的关系被称为is-a关系（Studentis a Person）。
因为Integeris a  Number，Do]]></description><category></category></item><item><title><![CDATA[Java泛型其实很简单（一）：泛型类，泛型接口和泛型方法]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/111026285</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/111026285</guid><author>wujingyicode</author><pubDate>Fri, 11 Dec 2020 11:20:57 +0800</pubDate><description><![CDATA[在我的学生时代，Java泛型在我眼里是一个非常难的知识点，看了许多相关的文章，最后都没能学好它。现在回头看，当时犯了两个错：

看的文章不成体系，东讲一点，西讲一点；
死记硬背，没有理解好。

现在工作了，看到了Java官方教程中关于泛型的部分，相见恨晚。讲得真的很好，它用基础简单的例子，成体系的介绍了泛型的使用方法以及简单的原理。推荐英文好的同学可以看看：Lesson: Generics。
我写的这篇博客，可以说是Java官方教程的读后笔记吧。如果有不理解或觉得我说得不准确的，欢迎留言或私信交流，我们共同]]></description><category></category></item><item><title><![CDATA[死锁与哲学家吃饭问题]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/109005775</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/109005775</guid><author>wujingyicode</author><pubDate>Sun, 11 Oct 2020 00:17:23 +0800</pubDate><description><![CDATA[一、死锁情景
有5个哲学家，围坐在一张圆桌子上，桌子上放着5根筷子，分别位于两个哲学家之间，如图所示：
他们有时会吃饭，有时会思考。吃饭时，哲学家会先拿起左手的那根筷子，再去拿右手的那根。当一个哲学家拿到两根筷子时，就可以开始吃饭，吃着吃着，又会放下筷子开始思考。
以上描述的场景，就会出现死锁：在某一时刻，所有的哲学家同时拿起左手边的筷子，再去拿右边的筷子时，发现已经被其他哲学家拿走了。此时，所有的哲学家都在等待另一根永远拿不到的筷子，就形成了死锁。
二、造成死锁的原因
造成死锁有3个条件，如果出现死锁，那]]></description><category></category></item><item><title><![CDATA[Java的volatile关键字]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/108785622</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/108785622</guid><author>wujingyicode</author><pubDate>Fri, 25 Sep 2020 16:05:56 +0800</pubDate><description><![CDATA[一、CPU缓存给多线程带来的挑战
我们先看一段简单的程序：
public class VolatileTest {
    public static void main(String[] args) throws InterruptedException {
        MyThread t = new MyThread();
        t.start();
        Thread.sleep(1000);
        t.stop = true; // 语句1
    }
}

cl]]></description><category></category></item><item><title><![CDATA[聊聊Java线程状态和常见误区]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/108419900</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/108419900</guid><author>wujingyicode</author><pubDate>Sat, 05 Sep 2020 17:22:26 +0800</pubDate><description><![CDATA[一、Java Thread文档
关于Java的线程状态，[Java Thread文档]讲的非常的清楚了，如果英文水平有4级的话，建议直接阅读文档。(https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html)
二、Java线程状态
java的线程一共有6个状态：New，Runnable，Waiting，Timed_Waiting，Blocked，Terminate。
这里Java使用Thread类的内部枚举类进行表示，我删除文档]]></description><category></category></item><item><title><![CDATA[三大线程模型之读者与写者问题（Java版）]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/108331263</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/108331263</guid><author>wujingyicode</author><pubDate>Mon, 31 Aug 2020 23:33:08 +0800</pubDate><description><![CDATA[一、前言
阅读文章的过程中如果碰到不懂的，可以留言或私信我，我会抽空回答。
编程过程中，我们所有遇到的多线程问题，都可以抽象为三种模型：

生产者与消费者；
读者与写者；
哲学家吃饭问题。

能搞清楚这三种模型的实现方式与解决方案，在实际编程中碰到多线程问题处理起来才能得心应手。
二、读者与写者问题
1. 读者与写者问题概述
读者与写者问题描述的是一个多线程问题：假设我们有一个资源，它可以被读或者写，在某一时刻，可能有不同的线程尝试着对这个资源进行操作（读或写）。
2. 读者与写者的线程安全问题
多个线程同]]></description><category></category></item><item><title><![CDATA[三大线程模型之生产者与消费者（Java版）]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/108180841</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/108180841</guid><author>wujingyicode</author><pubDate>Sun, 23 Aug 2020 15:31:58 +0800</pubDate><description><![CDATA[一、前言
阅读文章的过程中如果碰到不懂的，可以留言或私信我，我会抽空回答。
编程过程中，我们所有遇到的多线程问题，都可以抽象为三种模型：

生产者与消费者；
读者与写者；
哲学家吃饭问题。

能搞清楚这三种模型的实现方式与解决方案，在实际编程中碰到多线程问题处理起来才能得心应手。
二、生产者与消费者
1. 什么是生产者消费者？
生产者与消费者描述的是这样一个多线程问题：有一个或多个生产者生产出某种物品，然后加入到某个容器中，有一个或多个消费者，会不断的从容器中取走物品。当容器满了的时候，生产者会暂时停止生产]]></description><category></category></item><item><title><![CDATA[同步，异步和多线程，阻塞和非阻塞的差别。]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/105353112</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/105353112</guid><author>wujingyicode</author><pubDate>Mon, 06 Apr 2020 22:43:07 +0800</pubDate><description><![CDATA[同步，异步和多线程
许多人有一个误区：异步和多线程是一件事情。其实不是。我们用一个生活中的例子来解释一下三者的差别。
假如你现在有三件家务需要做：1. 煎鸡蛋， 2. 煮开水，3. 打扫客厅

同步：你开始煎鸡蛋，等鸡蛋煎完，再去煮开水，开水煮完再去打扫客厅。你得先做完一件事，才会开始做下一件事情，这就是同步；
异步：你把鸡蛋丢进锅了，设置了一个闹钟，就去煮开水了。同样，你在开水这边也设置了一个闹...]]></description><category></category></item><item><title><![CDATA[Java多线程（五）：内存模型]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/104934729</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/104934729</guid><author>wujingyicode</author><pubDate>Tue, 17 Mar 2020 23:51:58 +0800</pubDate><description><![CDATA[Java内存模型

JVM将内存划分为栈和堆。程序运行过程中，一些本地变量与，引用放在栈中，对象放在堆中。栈是线程私有的（线程安全），每一个线程都有一个自己的栈。
硬件内存结构

每个线程（CPU）要执行程序时，会将数据从主内存加载到CPU缓存（寄存器），经过一定时间后再写回主内存。

...]]></description><category></category></item><item><title><![CDATA[Java多线程（四）：竞态和核心代码（Race Conditions and Critical Sections）]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/104911960</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/104911960</guid><author>wujingyicode</author><pubDate>Tue, 17 Mar 2020 00:19:00 +0800</pubDate><description><![CDATA[竞态可能会在核心代码中法师。如果某部分代码被多个线程执行，如果线程执行的顺序不一样，结果不一样，那么这块代码可以被称为核心代码。
核心代码
举个例子：
public class Counter {

     protected long count = 0;

     public void add(long value){
         this.count = this.count +...]]></description><category></category></item><item><title><![CDATA[Java多线程：启动线程（三）]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/104839229</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/104839229</guid><author>wujingyicode</author><pubDate>Fri, 13 Mar 2020 14:19:56 +0800</pubDate><description><![CDATA[Java线程可以执行你写的程序，当你执行main()函数时，JVM会替你创建一个main线程来执行你的程序。
Java线程其实也是对象，我们可以在main()函数中创建一个Thread对象并启动它，这样当main线程在执行时，便会创建另一个线程。
如何创建并启动Java线程
public class JavaThreadTest {
    public static void main(Stri...]]></description><category></category></item><item><title><![CDATA[Java多线程：类单线程模型（Same-Threading）（二）]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/104831824</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/104831824</guid><author>wujingyicode</author><pubDate>Fri, 13 Mar 2020 00:20:40 +0800</pubDate><description><![CDATA[类单线程模型是多线程模型的其中一种，英文为Same-Threading。这样子翻译不知道准不准确。
单线程编码简单，出错几率小，但是有一个很大的缺陷：如果你的服务器有多个CPU，或一个CPU有多个核，单线程只能使用到其中的一个CPU或一个核，造成极大的浪费。
类单线程模型
类单线程模型和单线程类似，，但类单线程模型有多个线程，只是每个线程都在做自己的事情，它们之间没有共享变量，工作起来就像单线程一...]]></description><category></category></item><item><title><![CDATA[Java多线程：（一）并发模型]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/104741150</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/104741150</guid><author>wujingyicode</author><pubDate>Mon, 09 Mar 2020 00:12:51 +0800</pubDate><description><![CDATA[并发系统可以使用不同的并发模型实现，不同的并发模型的线程通过不同的合作方式去处理任务
共享状态和分离状态（shared state and separate state）

共享状态：所有的线程分享某个状态，这个状态可能是一个object，共享状态可能碰到的问题有死锁，竞态等。

非共享状态：不同的线程之间不会有共享的数据，当不同的线程需要交流时，他们通过分享不可变的对象，或copy出一份数据给其...]]></description><category></category></item><item><title><![CDATA[Java：有了Iterator，为何还需要Iterable？]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/104005729</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/104005729</guid><author>wujingyicode</author><pubDate>Thu, 16 Jan 2020 16:05:00 +0800</pubDate><description><![CDATA[一、Iterator简介
直接看源码：
public interface Iterator&lt;E&gt; {

    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    defau...]]></description><category></category></item><item><title><![CDATA[工厂模式]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/103793385</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/103793385</guid><author>wujingyicode</author><pubDate>Wed, 01 Jan 2020 15:44:52 +0800</pubDate><description><![CDATA[一、 简单工厂模式
阿毅经营着一家垃圾回收公司，随着公司业务越做越大，回收垃圾的种类也越来越多，垃圾回收的相关代码如下：
public class RecycleClient {
 
    public void recycle(Thing thing) {
        RecycleHandler recycleHandler;
 
        if ("horse".equals(t...]]></description><category></category></item><item><title><![CDATA[装饰者模式]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/103541882</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/103541882</guid><author>wujingyicode</author><pubDate>Sat, 14 Dec 2019 18:12:14 +0800</pubDate><description><![CDATA[0. 不断拓展的需求
卡牌游戏有着一套严格的战力控制方案。例如我们现在开启一个机关兽活动，为了不让新服务器的玩家拥有机关兽，我们一般会做一个限制：开服天数大于X天的服务器才能开出机关兽活动。
现在让你来实现这个返回活动时间的接口，你会如何设计？
听起来很简单：
public interface Time {
    long[] getActivityTime();
}
 
public clas...]]></description><category></category></item><item><title><![CDATA[MySQL优化：利用索引]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/103335086</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/103335086</guid><author>wujingyicode</author><pubDate>Sun, 01 Dec 2019 18:41:35 +0800</pubDate><description><![CDATA[文章目录0.什么是索引1. MySQL是如何利用索引进行优化2. 优化主键，外键2.1 主键2.2 外键3. 单列索引和多列索引3.1 单列索引（Column Indexes）3.2 多列索引（Multiple-Cloumns Indexes）3.3 如何知道本次查询使用了哪些索引？4. InnoDB索引分析集合（Index Statistics Collection)4.1 前置知识4.2 av...]]></description><category></category></item><item><title><![CDATA[笑谈设计模式：策略模式]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/103325937</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/103325937</guid><author>wujingyicode</author><pubDate>Sat, 30 Nov 2019 16:26:26 +0800</pubDate><description><![CDATA[一、 惊！某程序员手持板砖走向策划，原因竟然是？！
阿毅是某公司的程序员，最近负责项目关于武将模块的开发，需求是这样子的：武将需要有名称，品质，可以进行升级，觉醒，不同武将升级，觉醒的逻辑可能相同也可能不同；目前需要实现刘备和关羽两个武将。
”不就是简单的面向对象吗？我一天就能搞定“，阿毅心里想。一天过后，代码长这样子：
public abstract class Hero {
    prote...]]></description><category></category></item><item><title><![CDATA[记一次SQL优化]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/103232771</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/103232771</guid><author>wujingyicode</author><pubDate>Mon, 25 Nov 2019 10:42:19 +0800</pubDate><description><![CDATA[INDEX：The most important preconditions for using indexes for GROUP BY are that all GROUP BY columns reference attributes from the same index, and that the index stores its keys in order

写了这么一条SQL
EXP...]]></description><category></category></item><item><title><![CDATA[DIY一个Java8的Collector：MyListCollector]]></title><link>https://blog.youkuaiyun.com/wujingyicode/article/details/102535810</link><guid>https://blog.youkuaiyun.com/wujingyicode/article/details/102535810</guid><author>wujingyicode</author><pubDate>Sun, 13 Oct 2019 20:40:19 +0800</pubDate><description><![CDATA[目标
完成一个简单的MyListCollector，能将对应的Stream转换为List
Collector是什么？
举个具体的例子：
list.stream().filter(x -&gt; x &gt; 2).collect(new MyListCollector());

我们想要将一个list中大于2的所有元素都筛选出来，首先list转化为stream，对每一个元素进行判断。但是判断完以后...]]></description><category></category></item></channel></rss>