<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jackllvv的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/asdasd3418</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; asdasd3418]]></copyright><item><title><![CDATA[分布式锁初探]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/94019185</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/94019185</guid><author>asdasd3418</author><pubDate>Fri, 28 Jun 2019 17:18:15 +0800</pubDate><description><![CDATA[分布式锁初探
为什么需要分布式锁？
需要保证在分布式场景下只有一个线程同时在执行一个代码片段或者一个资源同时只有一个线程在使用。
常见的场景: 分布式任务，秒杀。

需要什么样的分布式锁?
高可用
有失效时间（避免死锁）
可重入（结合具体业务）
阻塞（结合具体业务）
性能高
公平锁（需要？）
实现
基于数据库实现

基于唯一索引
我们知道，数据库可以通过唯一索引来保证数据的唯一性，我们可以利用数据...]]></description><category></category></item><item><title><![CDATA[JUC之ReentrantLock]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/90640042</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/90640042</guid><author>asdasd3418</author><pubDate>Tue, 28 May 2019 16:35:15 +0800</pubDate><description><![CDATA[JUC之ReentrantLock
引言
承接上篇JUC之AbstractQueuedSynchronizer 我们分析一下最常用的锁 ReentrantLock，即可重入锁。
上篇我们分析了aqs的acquire方法和release方法。接下来我们分析ReentrantLock是如何通过aqs实现锁的。
Lock
先看一下锁的定义。
public interface Lock {

    /*...]]></description><category></category></item><item><title><![CDATA[JUC之AbstractQueuedSynchronizer]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/90290834</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/90290834</guid><author>asdasd3418</author><pubDate>Tue, 21 May 2019 14:57:10 +0800</pubDate><description><![CDATA[AbstractQueuedSynchronizer
从锁说起
juc.locks包下提供了常见的锁相关的工具，用来替代synchronized关键字（jdk1.5之前synchronized效率较低）和加强一些锁功能，比如重入锁，公平非公平锁，读写锁等等。
AbstractQueuedSynchronizer简称aqs是juc.locks包中锁相关的一个最核心的类，ReentrantLock等锁...]]></description><category></category></item><item><title><![CDATA[JUC之striped64]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/89360351</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/89360351</guid><author>asdasd3418</author><pubDate>Wed, 17 Apr 2019 17:19:12 +0800</pubDate><description><![CDATA[striped64
简介
striped64是java8用来并发计数新加的组件，在并发环境下有更好的性能，64指的是计数64bit的数，即Long类型的数和Double类型的数。striped64是个抽象类，jdk提供了四个实现类，LongAdder LongAccumulator DoubleAdder DoubleAccumulator 我们拿数据说话，分别在并发情况下用synchronize...]]></description><category></category></item><item><title><![CDATA[JUC之atomic]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/89360311</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/89360311</guid><author>asdasd3418</author><pubDate>Wed, 17 Apr 2019 17:17:40 +0800</pubDate><description><![CDATA[Atomic
简介

atomic包下原子操作类提供了一种用法简单、性能高效 、线程安全地更新一个变量的方式。

atomic包下一共有12个相关的类，分为4组，分别用于原子更新基本类型，原子更新数组，原子更新引用，原子更新字段。
使用


原子更新基本类型
AtomicBoolean  AtomicInteger  AtomicLong
常用方法,以AtomicInteger为例

int ge...]]></description><category></category></item><item><title><![CDATA[JUC之volatile]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/89360233</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/89360233</guid><author>asdasd3418</author><pubDate>Wed, 17 Apr 2019 17:14:52 +0800</pubDate><description><![CDATA[前言
juc是java并发编程的核心，里面的类有很多设计思想以及编程的技巧值得我们借鉴，个人认为，一个优秀的java程序员必须熟练掌握juc.

volatile
简介
volatile在java中是一个关键字,用于修饰类和实例变量

它确保对一个变量的更新以可以预见的方式告知其他线程。当一个域声明为volatile类型后，编译器在运行时会监视这个变量：而且对它的操作不会与其他的内存操作一起被重排...]]></description><category></category></item><item><title><![CDATA[es安装常见问题]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/87650956</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/87650956</guid><author>asdasd3418</author><pubDate>Mon, 18 Feb 2019 22:19:46 +0800</pubDate><description><![CDATA[es安装常见问题汇总（持续更新）
1. max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536] max number of threads [1024] for user [lishang] likely too low, increase to at le...]]></description><category></category></item><item><title><![CDATA[vm虚拟机nat模式静态ip配置]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/87625982</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/87625982</guid><author>asdasd3418</author><pubDate>Mon, 18 Feb 2019 16:06:00 +0800</pubDate><description><![CDATA[vm虚拟机nat模式静态ip配置
配置虚拟机网络

配置网关ip

配置centos文件
/etc/sysconfig/network-scripts/ifcfg-eth0

这里的网关GATEWAY填写上步设置的网关地址
配置dns
/etc/resolv.conf

重启网络服务
service network restart


...]]></description><category></category></item><item><title><![CDATA[python装饰器]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/84555445</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/84555445</guid><author>asdasd3418</author><pubDate>Tue, 08 Jan 2019 23:10:44 +0800</pubDate><description><![CDATA[python装饰器
定义

装饰器模式（Decorator Pattern）允许向一个现有的对象添加新的功能，同时又不改变其结构。这种类型的设计模式属于结构型模式，它是作为现有的类的一个包装。
这种模式创建了一个装饰类，用来包装原有的类，并在保持类方法签名完整性的前提下，提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中，我们将把一个形状装饰上不同的颜色，同时又不改变形状类。

装...]]></description><category></category></item><item><title><![CDATA[DateFormat格式化周（ww）遇到的坑]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/85635427</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/85635427</guid><author>asdasd3418</author><pubDate>Tue, 08 Jan 2019 15:53:00 +0800</pubDate><description><![CDATA[DateFormat格式化周（ww）遇到的坑

]]></description><category></category></item><item><title><![CDATA[poi导致内存泄露分析]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/84850670</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/84850670</guid><author>asdasd3418</author><pubDate>Thu, 06 Dec 2018 12:01:48 +0800</pubDate><description><![CDATA[poi导致内存泄露分析
背景
最近线上的机器偶尔会出现cpu打满的情况，内存也很吃紧，导致影响系统的正常运行。如下:




可以看出，已经严重影响到线上程序的运行了。
分析
用jmap打出对应的dump文件并用MAT工具打开。

很明显发生了内存泄露。
观察一下支配树。

可以看出，占用内存最多的是char[]数组对象，总共有700+万个。其次是XSSFSheet,共应用了300+mb的对象。
...]]></description><category></category></item><item><title><![CDATA[Redis最佳实践]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/84848573</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/84848573</guid><author>asdasd3418</author><pubDate>Thu, 06 Dec 2018 10:45:18 +0800</pubDate><description><![CDATA[Redis最佳实践
背景知识

SERVER为单线程处理模式，在处理用户请求的过程中，还会定期插入定时任务，比如:
1）过期KEY的删除
2）链接超时检查
3）AOF文件重写
4）扩容存放数据的dic容量
这些定期任务大概100ms会触发一次。当有大量的KEY同时过期时，删除过期KEY的任务可能会执行约20ms后才会退出。 大KEY(线上看到过list 的elements超过百万的)删除时会阻塞比...]]></description><category></category></item><item><title><![CDATA[一次redis调优——连接池优化]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/84639782</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/84639782</guid><author>asdasd3418</author><pubDate>Thu, 29 Nov 2018 20:51:50 +0800</pubDate><description><![CDATA[redis链接池优化
现象

现象很明显，新建连接数很高，但是每秒的链接数却不高。我们知道链接的建立是很耗性能的，所以优化的目标是降低新建链接数。
我们明明用了链接池了，为什么还会有这么多新建的链接呢？
看看当前链接池的配置：




参数
值
说明




MinEvictableIdleTimeMillis
60000
逐出连接的最小空闲时间


NumTestsPerEvictionRun
...]]></description><category></category></item><item><title><![CDATA[前后端分离项目部署(部署在同一台服务器)]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/84638820</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/84638820</guid><author>asdasd3418</author><pubDate>Thu, 29 Nov 2018 19:50:40 +0800</pubDate><description><![CDATA[前后端分离项目部署(部署在同一台服务器)
博主现在参与的项目是前后端分离的，前端是用vue写的并用npm构建的，后端是用java写的用maven构建的，但是前端和后端在同一个项目中，之前的部署方式是前端代码在本地调试好后，编译完之后，提交在git上，然后用持续集成工具（基于jenkins）进行编译,部署。
这样无疑会影响效率，而且很容易出错，有没有一种方法能一键编译前后端代码并部署呢。
编译前脚本...]]></description><category></category></item><item><title><![CDATA[python 中的迭代器，生成器，可迭代对象。]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/83871094</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/83871094</guid><author>asdasd3418</author><pubDate>Fri, 09 Nov 2018 01:47:11 +0800</pubDate><description><![CDATA[python 中的迭代器，生成器，可迭代对象。
可迭代对象
又叫iterable,顾名思义，就是可以迭代的对象，换句话说，可以通过for 来遍历的对象
比如集合对象:list,tuple,dict,set,str
判断一个对象是不是可迭代对象可以通过isinstance(obj, Iterable) 来判断
from collections import Iterable

print(isins...]]></description><category></category></item><item><title><![CDATA[python中copy和deepcopy]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/83834756</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/83834756</guid><author>asdasd3418</author><pubDate>Thu, 08 Nov 2018 01:17:32 +0800</pubDate><description><![CDATA[python中copy和deepcopy
python中的copy分为浅copy和深copy,即copy和deepcoy
对于浅copy来说相当于换了一层皮，可以理解为windows给一个软件加了一个额外的快捷方式。
对于深copy来说相当于脱胎换骨头，可以理解为windows重新安装了一套一模一样的软件。
下面我们用代码验证一下
用浅copy
import copy
a = [100, 2, 3...]]></description><category></category></item><item><title><![CDATA[python中is和==]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/83834586</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/83834586</guid><author>asdasd3418</author><pubDate>Thu, 08 Nov 2018 00:33:42 +0800</pubDate><description><![CDATA[python中is和==
python判断两个对象是否相等可以用is和 == 来判断，那么这两者之间有什么区别呢。
假如有两个对象a和b
is比较的是两个对象的地址是否相同，我们可以理解为 a is b ==&amp;gt; id(a) == id(b)
==则比较的是两个对象的值是否相同，可以理解为 a == b ==&amp;gt; a.eq() == b.eq()，实际上 == 就是通过调用两个对象的__e...]]></description><category></category></item><item><title><![CDATA[sonar常见bug类型及解决方法]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/83791630</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/83791630</guid><author>asdasd3418</author><pubDate>Tue, 06 Nov 2018 17:58:22 +0800</pubDate><description><![CDATA[sonar常见bug类型及解决方法（持续更新）
Cast one of the operands of this multiplication operation to a “long”
bug代码:
Thread.sleep(5 * 1000);

原因:
用int型整数计算可能会溢出
修改后代码:
Thread.sleep(5 * 1000L);

Close this “PreparedSt...]]></description><category></category></item><item><title><![CDATA[python模块打包和安装]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/83785101</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/83785101</guid><author>asdasd3418</author><pubDate>Tue, 06 Nov 2018 12:09:12 +0800</pubDate><description><![CDATA[python模块打包和安装
为了让写好的代码方便给别人或者自己使用，最好的方法就是将自己的代码打包。python中代码打包很简单。
打包
先看下代码的目录结构

途中的项目是一个简单的示例
为了打包，我们需要在项目的根目录下，也就是practice目录下新建一个setup.py

from distutils.core import setup

setup(
    name='mt',#需要打...]]></description><category></category></item><item><title><![CDATA[spring源码--IOC容器的实现:BeanFatory后置处理]]></title><link>https://blog.youkuaiyun.com/asdasd3418/article/details/83663182</link><guid>https://blog.youkuaiyun.com/asdasd3418/article/details/83663182</guid><author>asdasd3418</author><pubDate>Sat, 03 Nov 2018 00:01:46 +0800</pubDate><description><![CDATA[当BeanFatory解析完资源文件并将bean的信息注册进BeanFatory之后，spring接下来对BeanFactory做了统一的后置处理，el表达式的解析，以及基于@Configuration等注解的bean的解析注册也是在这期间发生的。
public void refresh() throws BeansException, IllegalStateException {
   	sy...]]></description><category></category></item></channel></rss>