<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[AnnotationZZ的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/AnnotationZZ</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; AnnotationZZ]]></copyright><item><title><![CDATA[设计模式Demo之简单工厂模式（含代码）]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/124069196</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/124069196</guid><author>AnnotationZZ</author><pubDate>Sat, 09 Apr 2022 22:08:41 +0800</pubDate><description><![CDATA[简单工厂模式

主要优点 简单工厂模式的主要优点如下：
(1) 工厂类包含必要的判断逻辑，可以决定在什么时候创建哪一个产品类的实例，客户端可以 免除直接创建产品对象的职责，而仅仅“消费”产品，简单工厂模式实现了对象创建和使用的分 离。  工厂三兄弟之简单工厂模式（四）
(2) 客户端无须知道所创建的具体产品类的类名，只需要知道具体产品类所对应的参数即可， 对于一些复杂的类名，通过简单工厂模式可以在一定程度减少使用者的记忆量。
(3) 通过引入配置文件，可以在不修改任何客户端代码的情况下更换和增加新的具体产.]]></description><category></category></item><item><title><![CDATA[spring线程池的使用示例，测试拒绝任务和任务装饰器]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/124027990</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/124027990</guid><author>AnnotationZZ</author><pubDate>Thu, 07 Apr 2022 22:07:08 +0800</pubDate><description><![CDATA[corePoolSize：核心线程数。 maximumPoolSize：最大线程数。表明线程中最多能够创建的线程数量。
keepAliveTime：空闲的线程保留的时间。 unit：空闲线程的保留时间单位。 BlockingQueue
workQueue：用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列。
1、ArrayBlockingQueue：是一个基于数组结构的有界阻塞队列，此队列按 FIFO（先进先出）原则对元素进行排序。
2、LinkedBlockingQueue：一个基于链表结构的阻.]]></description><category></category></item><item><title><![CDATA[ThreadLocal使用包括子线程传递实例]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/124002044</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/124002044</guid><author>AnnotationZZ</author><pubDate>Wed, 06 Apr 2022 22:44:22 +0800</pubDate><description><![CDATA[1.ThreadLocal的使用主要用于不同线程操作不安全变量时的线程保护 2.ThreadLocal=为Thread提供独有的ThreadLocalMap变量，通过Entry[] table方式存储线程本地变量 3.Thread持有ThreadLocal的引用，所以ThreadLocal需要设置成虚引用避免内存溢出，同时提供删除entry操作避免value值的内存溢出
代码示例
package com.myzy.auth.reetrantlock;

public class TestThreadLoca]]></description><category></category></item><item><title><![CDATA[ReetrantReadWriteLock源码要点（面试必备）]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/123962356</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/123962356</guid><author>AnnotationZZ</author><pubDate>Mon, 04 Apr 2022 22:49:52 +0800</pubDate><description><![CDATA[**
1.writeLock
**
只需要判断状态C是否有读锁或者写锁
**
2.readLock
**
判断是否拿到锁，有一下几点：

是否有写锁
是否有写锁在排队首（为了防止写锁被饿死，因为读锁一般可以获取到锁）
是否达到读锁最大限制
抢锁修改高16位，读锁状态，是否成功？





读写锁使用同一个队列，状态C高16位记录读锁状态也是读锁个数，低16位记录写锁状态




**
*

以上是本人在学习过程中记录的东西，希望对你有用！！！！！




**

...]]></description><category></category></item><item><title><![CDATA[java 线程wait()与notify()和notifyAll做生产者消费者模式]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/123808141</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/123808141</guid><author>AnnotationZZ</author><pubDate>Mon, 28 Mar 2022 22:21:37 +0800</pubDate><description><![CDATA[代码如下

package com.myzy.auth.reetrantlock;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 场景介绍：
 *  一个生产者  120个消费者
 *  生产者生产目标是100个，到了100个就不生产了；同时生产者在存在可以卖的茶大于5个同时已经生产了大于10个的情况下可以休息，然后等待消费者的唤醒
 *  消费者只要有茶叶都可以买，没有茶叶可以唤醒生产者，然后等待生产，除非生产者已经生产了100个而.]]></description><category></category></item><item><title><![CDATA[使用ReentrantLock+Condition实现的单个生产者多个消费者模式]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/123774663</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/123774663</guid><author>AnnotationZZ</author><pubDate>Sun, 27 Mar 2022 15:38:43 +0800</pubDate><description><![CDATA[代码如下

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 场景介绍：
 *  一个生产者  120个消费者
 *  生产者生产目标是100个，到了100个就不生产了；同时生.]]></description><category></category></item><item><title><![CDATA[hashcode（） equals（）看懂一片够了]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/119743308</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/119743308</guid><author>AnnotationZZ</author><pubDate>Mon, 16 Aug 2021 22:05:42 +0800</pubDate><description><![CDATA[1 3 5 存map  实现有序存取
Map&lt;Test, Integer&gt; map = new HashMap&lt;&gt;();
        Test test1 = new com.myzy.auth.controller.Test();
        test1.setCode(1);
        Test test2 = new com.myzy.auth.controller.Test();
        test2.setCode(2);
        Test te]]></description><category></category></item><item><title><![CDATA[从jvm看String（应对面试）]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/117003129</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/117003129</guid><author>AnnotationZZ</author><pubDate>Tue, 18 May 2021 23:15:49 +0800</pubDate><description><![CDATA[从jvm看String（应对面试…(一）)

首先String是我们开发中很常用的引用类型，同时也很重要。
位置：
我们在使用String的时候可以使用字面量直接使用（String a = “abc”），也可以通过new对象来创建一个String对象来使用。那这不同的使用方式他到底放在那里呢？
1.通过字面量来使用字符串，jvm会先从字符串常量池中查找是否有相同的（equals），如果有就直接从常量池中返回字符串的地址，如果没有就会在常量池中创建当前字符串然后返回地址。所以这个时候我们的字符串是放在常量池中]]></description><category></category></item><item><title><![CDATA[方法区的GC回收为什么那么难]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/117002945</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/117002945</guid><author>AnnotationZZ</author><pubDate>Tue, 18 May 2021 23:00:22 +0800</pubDate><description><![CDATA[方法区的GC回收为什么那么难

背景：hotspotjvm，在jdk1.7之前，方法区的回收


回收方法区主要回收的是不使用的常量以及类型。
如果要回收不使用的类型首先要满足这个类以及这个类的派生类的实例在堆中没有
然后加载这个类的类加载器已经被回收
然后这个类的class没有被任何地方引用，就是无法在任何地方使用这个类的class

所以砸门方法区的回收要求是很严格的，所以方法区也会出现很多问题，导致垃圾回收的效果不是太好。做不到方法去永久代的说法。
所以java8之后取消永久代也是对整个jvm的提升，]]></description><category></category></item><item><title><![CDATA[jvm学习记录二（包会）]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/116890512</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/116890512</guid><author>AnnotationZZ</author><pubDate>Sun, 16 May 2021 15:17:25 +0800</pubDate><description><![CDATA[上一章大致介绍了jvm内存模型，下来接着各区的详细内容




先从最不熟悉的来，虚拟机栈。
虚拟机栈都知道是运行咱们方法的，实际上他的里面放了一个一个的栈针，同时每一个线程中都会独有一份虚拟机栈的内存空间。这是为什么呢？可以想一想，如何不是每个线程独有一份，那栈里面的栈针（每一个栈针就是一个方法）谁知道是哪个线程的，jvm也不是上帝（QUQ）.所以我们的jvm大佬在设计jvm的时候每一个线程都会有一根栈资源和对应的程序计数器（各自记录自己的垃圾代码执行到哪里了）。
我们的每一个栈针（就是每一个java方法]]></description><category></category></item><item><title><![CDATA[jvm学习笔记]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/116809339</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/116809339</guid><author>AnnotationZZ</author><pubDate>Fri, 14 May 2021 23:28:55 +0800</pubDate><description><![CDATA[## 本文主要记录学习jvm中的要点笔记供以后参考

1.jvm整体设计架构
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210514225218457.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Fubm90YXRpb25aWg==,size_16,color_FFFFFF,t_70
以上图秒速了jvm]]></description><category></category></item><item><title><![CDATA[源码阅读List]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/113486110</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/113486110</guid><author>AnnotationZZ</author><pubDate>Sun, 31 Jan 2021 21:59:58 +0800</pubDate><description><![CDATA[源码阅读-JDK list(一)

首先查看List接口的上下继承关系。
查看第一个方法：

1.通过其实现类来学习这个方法：

实现类方法很多，首先通过常用的arrayList来学size()方法

arraylist中返回的是这个size属性值
在arraylist发生crud的时候会对这个值进行同步修改。
**1.
**add方法，调用重载的add方法，传入添加的新元素，当前数组引用，当前数组长度，
然后通过grow()方法后添加元素，然后容量 size=s+1，自增。
2.remove(int in]]></description><category></category></item><item><title><![CDATA[分库分表]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/97979717</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/97979717</guid><author>AnnotationZZ</author><pubDate>Mon, 02 Mar 2020 21:20:46 +0800</pubDate><description><![CDATA[分库分表
package com.lyz.sharding.algorithm;
import java.util.Collection;  
import java.util.LinkedHashSet;  
  
import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;  
import com.dangdang.ddframe.r...]]></description><category></category></item><item><title><![CDATA[位运算基础]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/94414294</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/94414294</guid><author>AnnotationZZ</author><pubDate>Mon, 01 Jul 2019 23:36:50 +0800</pubDate><description><![CDATA[位运算基础
位运算基础
&amp;
按位与
如果两个相应的二进制位都为1，则该位的结果值为1，否则为0
|
按位或
两个相应的二进制位中只要有一个为1，该位的结果值为1
^
按位异或
若参加运算的两个二进制位值相同则为0，否则为1
~
取反
~是一元运算符，用来对一个二进制数按位取反，即将0变1，将1
&lt;&lt;
左移
用来将一个数的各二进制位全部左移N位，右补0
&gt;&gt;
右移
将...]]></description><category></category></item><item><title><![CDATA[ant的安装、使用，build.xml简单编写]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/94412738</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/94412738</guid><author>AnnotationZZ</author><pubDate>Mon, 01 Jul 2019 23:00:58 +0800</pubDate><description><![CDATA[ant的安装、使用，build.xml简单编写
下载ant
解压ant 后设置ANT_HOME, PATH中添加ANT_HOME目录下的bin目录(如:ANT_HOME:,PATH:D:\apache-ant-1.9.2%ANT_HOME%\bin)
测试方法:开始–&gt;运行–&gt;cmd进入命令行–&gt;键入 ant 回车,如果看到
Buildfile: build.xml does n...]]></description><category></category></item><item><title><![CDATA[AtomicInteger的使用（高并发）]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/94230226</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/94230226</guid><author>AnnotationZZ</author><pubDate>Sun, 30 Jun 2019 00:39:03 +0800</pubDate><description><![CDATA[AtomicInteger的使用（高并发）
普通代码处理高并发，对count进行++操作：
public class MyAtomicInteger {
    private static final Integer threadCount = 20;
    private static Integer num = 0;
    private static void increase() {...]]></description><category></category></item><item><title><![CDATA[threadLocal简单使用]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93929924</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93929924</guid><author>AnnotationZZ</author><pubDate>Fri, 28 Jun 2019 00:05:22 +0800</pubDate><description><![CDATA[threadLocal简单使用
简单代码及注释如下：
public class MyThreadLocal {
    //每个线程独有threadLocal
    static ThreadLocal&lt;Person&gt; threadLocal = new ThreadLocal&lt;&gt;();
    public static void main(String[] args)...]]></description><category></category></item><item><title><![CDATA[简单明了thrift调用关系]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93927490</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93927490</guid><author>AnnotationZZ</author><pubDate>Thu, 27 Jun 2019 23:35:36 +0800</pubDate><description><![CDATA[简单明了thrift调用关系
三、  Thrift的工作原理
1.普通的本地函数调用过程
例如，有如下关于本地函数的调用的java代码，在函数caller中调用函数getStr获取两个字符串的拼接结果：
代码3.1
   本地函数调用调用方和被调用方都在一个程序内部，只是cpu在执行调用的时候切换去执行被调用的函数，执行完被调用函数之后，再切换回来执行调用之后的代码，其调用过程如下图3.1所示：
...]]></description><category></category></item><item><title><![CDATA[实际开发常用linux命令（必会）]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93926491</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93926491</guid><author>AnnotationZZ</author><pubDate>Thu, 27 Jun 2019 23:27:08 +0800</pubDate><description><![CDATA[实际开发常用linux命令（必会）
这是博主每天都会使用的命令：

cp -r {文件路径}fileName1 {dest文件路径}
scp -r {文件路径}fileName1 {destUrl}:{dest文件路径}
rm -rf {文件路径}fileName1
mv fileName1 fileName1
mkdir fileName1
cd …
ll
vi fileName1
cat fi...]]></description><category></category></item><item><title><![CDATA[ArrayList集合中替换某一元素]]></title><link>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93668884</link><guid>https://blog.youkuaiyun.com/AnnotationZZ/article/details/93668884</guid><author>AnnotationZZ</author><pubDate>Tue, 25 Jun 2019 23:13:21 +0800</pubDate><description><![CDATA[ArrayList集合中替换某一元素
/**
 * @ClassName:ChangeElement
 * @Description:TODO
 * @Author:ZY
 * @Date:2019/6/25 0025 22:44
 * @Version:1.0
 **/
public class ChangeElement {
    public static void main(String...]]></description><category></category></item></channel></rss>