<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[万事胜意]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_41574321</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_41574321]]></copyright><item><title><![CDATA[乐观锁悲观锁概念]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/108221685</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/108221685</guid><author>qq_41574321</author><pubDate>Tue, 25 Aug 2020 15:12:54 +0800</pubDate><description><![CDATA[乐观锁：
线程每次在处理共享数据时都不会上锁，在更新时会通过数据的版本号登记制判断其他线程有咩有更新数据。适合读多写少
悲观锁:
线程每次在处理共享数据时都会上锁，其他线程想处理数据就会一直阻塞直到获得锁。适合写操作比较多的场景


...]]></description><category></category></item><item><title><![CDATA[向线程池中提交任务的过程]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/108000971</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/108000971</guid><author>qq_41574321</author><pubDate>Fri, 14 Aug 2020 15:33:04 +0800</pubDate><description><![CDATA[向线程池中提交任务的过程(通过execute方法)

非空判断，任务为空直接抛NPE。
如果此时，线程池中运行的线程数量&lt;corePoolSize，则创建新线程来处理请求。
判断线程池状态为RUNNING，且等待队列没满，直接加入等待队列。
判断线程池中线程数量是否大于 maximumPoolSize，如果小于，则创建新线程来执行任务。
否则执行线程池拒绝策略


...]]></description><category></category></item><item><title><![CDATA[为什么我不喜欢用Long.valueOf()去将String转成long]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/106101629</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/106101629</guid><author>qq_41574321</author><pubDate>Wed, 13 May 2020 16:48:40 +0800</pubDate><description><![CDATA[项目中经常看到有人喜欢用Long.valueOf()去将String转成long，我都忍不住去改Convert.asLong()。
原因是如果字符串不管是null还是空串，Long.valueOf()都会抛出异常，导致一些不必要的线上故障（ java.lang.NumberFormatException : For input string: “”）。而Convert.asLong()能将null或空串直接转成0,也可以指定默认值。
总结
我觉得相对来说，用Convert.asLong()能规避风险，减少调]]></description><category></category></item><item><title><![CDATA[记一次load飙升，频繁FullGC问题解决过程]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/105121479</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/105121479</guid><author>qq_41574321</author><pubDate>Thu, 26 Mar 2020 16:30:09 +0800</pubDate><description><![CDATA[1.现象

load飙升到30+
线上sql连接异常
tps正常
sql查询时间剧增


2.解决过程

sql连接池不够了，肯定是慢sql导致
频繁GC，一般内存使用过多
结合堆栈信息，某个对象内存占用特别多
某个sql查询数量大，调用量多，全表扫描。

3.GC查看
top 命令查看资源情况，找到使用率最高的线程

sudo -u spring-boot jstat -gcutil 384 2...]]></description><category></category></item><item><title><![CDATA[IDEA使用lombok的@Data注释之后，还是找不到get和set方法]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/103746517</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/103746517</guid><author>qq_41574321</author><pubDate>Sat, 28 Dec 2019 17:11:44 +0800</pubDate><description><![CDATA[####解决方法
我是新装的IDEA，因为没有安卓lombok插件导致的。装上lombok插件就可以使用了
IDEA安装lombok插件
1.打开settings，mac是preferences。

找到plugins，搜索lombok，之后安装，安装完成之后，重启IDEA就可以啦

...]]></description><category></category></item><item><title><![CDATA[【踩坑总结】java8中stream的findAny踩坑]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/94634351</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/94634351</guid><author>qq_41574321</author><pubDate>Thu, 04 Jul 2019 17:18:52 +0800</pubDate><description><![CDATA[java8中stream的findAny踩坑
需求：寻找list中符合要求的对象
通过findAny去实现
A a = bList().stream().filter(b -&gt; "test".equals(b.getName())).findAny().get();

结果后面发现这个方法并不是找得到就返回，找不到就不做处理，而是找不到直接抛异常了。
于是后面改用了这种方式
A a =bLi...]]></description><category></category></item><item><title><![CDATA[java中的boolean类型占几个字节]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/90670890</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/90670890</guid><author>qq_41574321</author><pubDate>Wed, 29 May 2019 14:49:15 +0800</pubDate><description><![CDATA[根据官方文档的描述：
boolean: The&nbsp;boolean&nbsp;data type has only two possible values:&nbsp;true&nbsp;and&nbsp;false. Use this data type for simple flags that track true/false conditions. This data type re...]]></description><category></category></item><item><title><![CDATA[JAVA内存模型]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/90071918</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/90071918</guid><author>qq_41574321</author><pubDate>Fri, 10 May 2019 16:00:38 +0800</pubDate><description><![CDATA[1.主内存和工作内存

Java内存模型的主要目标是定义程序中各个变量的访问规则，即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。

JAVA内存模型规定

所有的变量都存储在主内存中
每个线程有自己的工作内存（线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝，线程对变量的所有操作都必须在工作内存中进行）
不同线程之间无法直接访问对方工作内存中的变量。线程间变量值的传递靠主...]]></description><category></category></item><item><title><![CDATA[设计模式-门面模式]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/89952037</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/89952037</guid><author>qq_41574321</author><pubDate>Wed, 08 May 2019 14:40:31 +0800</pubDate><description><![CDATA[1.简述门面模式
举个栗子说一下门面模式：
下图是自己喝茶和茶馆喝茶的区别。每个人自己喝茶，需要自己去准备茶具、开水、茶叶等，但其实我们的目的只是喝杯茶，并不希望完全去操作整个过程。于是有了去茶馆喝茶这个选项。我们只需要把我们需求告诉服务员，服务员去帮我们解决茶具、开水、茶叶等事情，然后端茶过来给我们就好了。对应于我们的设计模式，这个茶馆的服务员就相当于我们门面模式中的Facade。

门面模式定...]]></description><category></category></item><item><title><![CDATA[CAS]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/89920595</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/89920595</guid><author>qq_41574321</author><pubDate>Tue, 07 May 2019 14:36:56 +0800</pubDate><description><![CDATA[1.CAS做了什么？
CAS有三个操作数：内存值V，旧的预期值A，需要修改的新值B
CAS涉及两个步骤：

1.compare：比较内存值是否与预期值A相等。
2.set：如果内存值与预期值A相等，set值为B。
虽然这是两步，但是CAS保证了这两步操作的原子性，因此可以将上面两步视为一个原子操作。

2.处理器如何实现原子操作？
1.使用总线锁保证原子性
总线锁就是使用处理器提供的一个LOCK＃...]]></description><category></category></item><item><title><![CDATA[源码解读-AtomicInteger]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/88865024</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/88865024</guid><author>qq_41574321</author><pubDate>Thu, 28 Mar 2019 11:18:43 +0800</pubDate><description><![CDATA[前面AtomicBoolean中对原子更新值已经讲得差不多了，AtomicInteger实现的核心也跟AtomicBoolean几乎是一样的，不过AtomicInteger相比起来多了几个方法，我还是理一遍，AtomicBoolean中有的就不过多解释了。
1.AtomicInteger是什么

一个可以原子方式更新的{@code int}值。
{@code AtomicInteger}用于诸如原...]]></description><category></category></item><item><title><![CDATA[源码解读 -AtomicBoolean]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/88826789</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/88826789</guid><author>qq_41574321</author><pubDate>Tue, 26 Mar 2019 18:24:08 +0800</pubDate><description><![CDATA[1.AtomicBoolean是什么

一个可以原子方式更新的{@code boolean}值。
该值可以作为原子更新的标志，但是不能用作java.lang.Boolean的替代。

2. AtomicBoolean 内部的属性
// 设置为使用Unsafe.compareAndSwapInt进行更新
private static final Unsafe unsafe = Unsafe.getU...]]></description><category></category></item><item><title><![CDATA[设计模式-迭代器模式]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/88126720</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/88126720</guid><author>qq_41574321</author><pubDate>Mon, 04 Mar 2019 17:26:38 +0800</pubDate><description><![CDATA[1.简述迭代器模式
举个栗子说一下迭代器模式：就像电视机，里面有很多频道，我们可以通过按电视机上面的按钮来挨个切换频道。同样的，我们也可以通过遥控板左切或又切频道，甚至遥控板还提供了一个数字功能，我们可以通过输入数字获取到该数字对应的频道，遥控器我们就可以看作是迭代器。
迭代器模式定义： 提供一种方法来访问聚合对象，而不用暴露这个对象的内部表示，其别名为游标(Cursor)。迭代器模式是一种对象行...]]></description><category></category></item><item><title><![CDATA[源码解读-ArrayList]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/87939464</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/87939464</guid><author>qq_41574321</author><pubDate>Tue, 26 Feb 2019 17:32:47 +0800</pubDate><description><![CDATA[ArrayList都很熟悉了

List的接口大小可调整的实现类
除了实现List接口之外，此类还提供了一些方法来操作内部用于存储列表的数组的大小。
线程不安全
实现了RandmoAccess接口，即提供了随机访问功能。RandmoAccess是java中用来被List实现，为List提供快速访问功能的。在ArrayList中，我们可以通过元素的序号快速获取元素对象；这就是快速随机访问。


1....]]></description><category></category></item><item><title><![CDATA[源码解读-ArrayBlockingQueue]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/87892138</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/87892138</guid><author>qq_41574321</author><pubDate>Sat, 23 Feb 2019 14:41:13 +0800</pubDate><description><![CDATA[看源码之前，我喜欢先把那个类的介绍看一下，能了解到这个类的大概的特性。原文我就不贴了，总结几点我从介绍里面了解到的几点，后面再通过源码看看，具体怎么实现。

这是GUC(java.util.concurrent)包下的一个线程安全的阻塞队列，底层由数组实现。
这是一个基于数组的有界的阻塞队列
这个队列遵循先进先出（FIFO）原则
在队尾插入，队首获取
这是一个经典的队列大小固定的&quot;有界缓冲区&quot;，一...]]></description><category></category></item><item><title><![CDATA[SpringBoot项目定制Banner]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/79347137</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/79347137</guid><author>qq_41574321</author><pubDate>Wed, 20 Feb 2019 15:51:04 +0800</pubDate><description><![CDATA[原博客：http://blog.youkuaiyun.com/u012702547/article/details/53740047

我们搭建一个SpringBoot项目时，可以将运行时出现的Banner进行修改



修改Banner

1.首先在SpringBoot项目的src/main/resources路径下新建一个文件banner.txt 
2.将想要创建的banner样式复制到banner.tx...]]></description><category></category></item><item><title><![CDATA[设置IDEA的背景图片]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/87793594</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/87793594</guid><author>qq_41574321</author><pubDate>Wed, 20 Feb 2019 14:01:12 +0800</pubDate><description><![CDATA[先通过快捷键 ctrl+shirt+A 打开设置

可以看看选中不同铺平方式的效果
第一种，明显比第二种放大很多，这个主要看图片大小，主图位置之类的决定吧。

这里是选中图片位置靠右对齐的效果
哈哈，介绍得差不多啦，最终效果


...]]></description><category></category></item><item><title><![CDATA[内存分配与回收策略]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/87358540</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/87358540</guid><author>qq_41574321</author><pubDate>Fri, 15 Feb 2019 14:01:01 +0800</pubDate><description><![CDATA[1.对象优先在Eden分配
大多数情况下，对象在啊新生代Eden中分配。当Eden区没有足够的空间进行分配时，虚拟机将发起一次Minor GC。
对象在Minor GC过程中，发现对象比较大，剩余Survivor空间不足以容纳该对象，那么该对象就会通过分配担保机制被提前转移到老年代去。

Minor GC：指发生在新生代的垃圾收集动作，因为Java对象大多都具备朝生夕死的特性，所以Minor GC...]]></description><category></category></item><item><title><![CDATA[垃圾收集算法]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/87284389</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/87284389</guid><author>qq_41574321</author><pubDate>Thu, 14 Feb 2019 17:17:06 +0800</pubDate><description><![CDATA[1.标记-清除算法
“标记-清除”算法是最基础的垃圾收集算法，分为“标记”和“清除”两个阶段；当堆中的有效内存空间内耗尽的时候，就会停止整个程序，然后进行标记，清除工作。


标记：首先将所有死亡对象（在上一篇文章中有说到，如果判断对象是否存活）打上标记
清除：清除的过程将遍历堆中所有的对象，将所有被标记的对象全部清除。
缺点：
1.效率比较低，因为要遍历所有的对象，并且在进行垃圾回收过程中，需要...]]></description><category></category></item><item><title><![CDATA[如何判断对象是否存活]]></title><link>https://blog.youkuaiyun.com/qq_41574321/article/details/87278409</link><guid>https://blog.youkuaiyun.com/qq_41574321/article/details/87278409</guid><author>qq_41574321</author><pubDate>Thu, 14 Feb 2019 15:57:26 +0800</pubDate><description><![CDATA[1.如何判断对象是否存活
1.1引用计数法
给对象中添加一个 引用计数器，每当有一个地方引用它时，计数器值+1，当引用失效时，计数器值-1。任何时刻计数器值为0的对象就是不可能再被使用的。但是这个方法有个问题不能解决：就是当两个对象相互引用时，他们的计数器值永远不会变成0，导致两个对象无法被回收。
1.2可达性分析算法

在主流的商用程序语言（Java、C#）的主流实现中，都是称通过可达性分析来判...]]></description><category></category></item></channel></rss>