
java
jobey1995
希望有一天我可以用代码改变世界
展开
-
如何把代码写的优雅之实践
小弟从毕业到现在参加工作半年多了,在review同事的代码学习到了很多优雅的地方,在此做记录,持续更新。欢迎大家向我提出意见,若有错误的地方还请大家多多指出一、Lambda表达式准备例子:@DataClass Person{ private String code; private String name; private int age; private Date b...原创 2019-01-20 23:45:12 · 308 阅读 · 0 评论 -
今天我只看了ConcurrentHashMap的put方法
首先把那些恶心的变量解释一下变量名称 含义 bincount table里目标索引链表的元素个数 f table里目标索引对应链表的头结点 n table的长度 i 目标索引 fh 头结点f的哈希值 tab table数组的副本 final V putVal(K key, ...原创 2019-06-17 13:29:09 · 2090 阅读 · 2 评论 -
遇到了一个关于自增业务的分析
业务背景我目前在物流行业工作,上周遇到一个小需求,大致概况如下:1、实现一个创建用户的功能,用户分为快递用户和快运用户2、用户名快递用户为kd为前缀,快运用户以ky为前缀,后面跟上一个递增的数字,以0开始3、用户名进入创建页面自动获取不能够手动输入,然后需填写其他信息然后再创建,其中有一个选项为选择快递或者快运用户,默认为快递。需求大致如上,看起来很简单,于是我开发设计很...原创 2019-06-13 17:30:16 · 210 阅读 · 0 评论 -
一个老生常谈的问题:为什么说Java是只有值传递
这个问题感觉挺有意思而且在实际操作中有误导性。比如下面一个例子 public static void main(String[] args) { List list = new ArrayList(); addOne(list); System.out.println(list); } public static v...原创 2019-05-21 15:50:59 · 217 阅读 · 0 评论 -
聊一聊Atomic类为什么是原子性的
在此之前准备两个例子Demo1: // 请求总数 public static int clientTotal = 5000; // 同时并发执行的线程数 public static int threadTotal = 200; public static AtomicInteger count = new AtomicInteger(0); ...原创 2019-05-09 21:37:05 · 1253 阅读 · 0 评论 -
AQS之CyclicBarrier源码解读
首先准备一个可以跑的Demo@Slf4jpublic class CyclicBarrierExample{ //1、实例化一个CycleBarrier private static CyclicBarrier barrier = new CyclicBarrier(5); public static void main(String[] args) throws...原创 2019-04-28 15:33:27 · 202 阅读 · 0 评论 -
通过源码参数聊聊ThreadPoolExecutor机制以及其四种线程池
ThreadPoolExecutor可以通过制定的一些参数来创建一个线程池,目前默认可以通过Executor来实例化四种线程池的执行器,简单的做一下说明:newFixThreadPool 创建一个固定长度的线程池,每当提交一个任务就创建一个线程,知道达到线程池的最大数量,这时线程池的规模将不再变化 newCacheTheadPool 创建一个可缓存的线程池,如果线程池的当...原创 2019-04-23 17:49:07 · 171 阅读 · 0 评论 -
Disruptor启动过程源码分析(三)
接着Disruptor启动过程源码分析(二)现在我们来看看Main.java的第三步:disruptor.start(),点开start方法看看 public RingBuffer<T> start() { final Sequence[] gatingSequences = consumerRepository.getLastSequenc...原创 2019-04-18 11:05:38 · 265 阅读 · 0 评论 -
AQS之CountDownLatch源码解读
首先准备一个可以跑的Demo private final static int threadCount = 200; public static void main(String[] args) throws Exception { //1、创建线程池 ExecutorService exec = Executors.newCachedThreadPool...原创 2019-04-26 22:27:31 · 149 阅读 · 0 评论 -
Disruptor启动过程源码分析(一)
首先准备一个可以跑起来的demoOrderEvent.javapublic class OrderEvent { private long value; public long getValue() { return value; } public void setValue(long value) { this.value = value; } }...原创 2019-04-17 15:01:46 · 376 阅读 · 0 评论 -
Nginx优化
1、配置线程数和并发数worker_processes 4; #cpuevents {worker_connections 10240;#每一个进程打开的最大连接数,包含了nginx与客户端和nginx与upstream之间的连接multi_accept on; #可以一次建立多个连接use epoll; 使用epoll连接模型}2、配置后端Server的长连接...原创 2019-03-04 18:10:52 · 96 阅读 · 0 评论 -
Btrace使用笔记
一、简介BTrace可以动态地向目标应用程序的字节码注入追踪代码使用技术:JavaComplierApi、JVMTI、Agent、Instrumentation+ASM二、下载和使用下载页面:https://github.com/btraceio/btrace/releases/tag/v1.3.11.3下载后进行环境变量的配置,配置具体可参考其他博客把文件夹build里面...原创 2019-02-23 20:18:45 · 163 阅读 · 0 评论 -
记第一次在工作中用设计模式重构代码
小弟在某物流公司工作,近期临近过年需求比较松,发现项目的一个模块使用大量的if-else语句,于是乎想到用设计模式进行重构。一、业务场景以及出现的问题项目中有一个用户修改记录模块,对应数据库USER_MODIFY表,每次用户对主业务模块进行操作(如增加,删除,编辑等)会增在用户修改记录模块中增加相应信息(用户,操作名称等)。现在项目中的代码存在下列问题:使用了大量的if-else操...原创 2019-01-30 13:53:17 · 229 阅读 · 0 评论 -
Redis原理分析(二)
我们知道,整个Redis的数据结构是key-value形式组成的一个全局字典,还有带过期时间key集合也是一个字典。struct RedisDb{ dict* dict; //所有key-value dict* expires //所有key的过期时间 ...}struct zset{ dict* dict //所有的value-...原创 2019-01-29 22:12:26 · 204 阅读 · 0 评论 -
面试常问,缓存三大问题及解决方案!
原文 https://juejin.im/post/5b604b9ef265da0f626390011. 缓存来由 随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。 2. 缓存问题 虽然使用缓存给系统带来了一定的质的提升,但同时也带来了一些需要注意的问...转载 2019-01-29 11:20:37 · 232 阅读 · 0 评论 -
Redis原理分析(一)
一、Redis字符串内部Redis内部的字符串是以数组形式储存的。在C语言中,字符串的结尾是以NULL(0x\0)作为结束符号,但是在redis里面,如果像C语言一样的话,如果需要获取某字符串,需要进行数组的遍历扫描,这样的时间复杂度为O(n),这样Redis表示我受不起。所以Redis自己定义了一种数据结构,叫做SDS(Simple Dynamic String),这种数据结构有一个很大...原创 2019-01-26 14:10:50 · 371 阅读 · 0 评论