- 博客(99)
- 收藏
- 关注

原创 JUC源码解析文章目录
基础知识:原子操作的实现:CAS与锁JMM与happens-beforeSynchronizedThreadLocal同步器J.U.C之基——AQS锁ReentrantLockConditionCountDownLatchSemaphoreCyclicBarrierReentrantReadWriteLock并发容器CopyOnWriteArrayListConc...
2019-03-23 15:56:32
1994

原创 JUC源码解析-ConcurrentHashMap1.8
前言1.8后的ConcurrentHashMap与之前有截然不同的设计,之前是分段锁的思想,通过采用分段锁Segment减少热点域来提高并发效率。1.8利用CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构。在此再一次膜拜Doug Lea大神,高山仰止。1.8的ConcurrentHashMap有6313行代码,之前大概是1000多行。这篇文章也...
2018-06-14 20:23:00
6879

原创 《算法》中的红黑树实现
有别于上一篇文章介绍的红黑树,在《算法<第四版>》一书中用另一套规则实现了红黑树,主要手段是递归,实现思路来自于2-3树,这本书中有详细的解读,在这里我谈谈自己对它的理解。首先,在之前文章中介绍的红黑树,我们把节点看成红,黑两色,而这里红节点指的是它指向父亲的链接是红色的,有什么不同?当我们介绍左旋,右旋你就会看到。来看看这套定义红黑树的规则:红链接均为左链接 没有任何一个...
2017-09-18 10:27:00
1541
原创 HashMap源码解析-红黑树操作
距离上一篇分析HashMap的文章已经过去一年了,今天偶尔翻到之前的那篇,还记得当时是打算另起一篇来分析链表的树化,以及树的链表化过程,结果这一拖就是一年
2019-06-23 10:58:56
1199
1
原创 关于Arrays.asList的坑
今天刷算法时遇到一个 Arrays.asList 的使用问题 int[] arr0 = {2,5,6,7,1283}; List list0 = Arrays.asList(arr0); System.out.println(list0.contains(1283));返回false Integer[] arr = {2,5,6,...
2019-05-18 15:50:11
406
原创 记录些有意思的算法题
将自己刷题中遇到的有意思的,有巧妙想法的题记录在这,持续更新…LeetCode 338. Counting Bits给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。很容易就想到遍历然后每个数分别进行统计。 public int[] countBits(int num) { int[] ...
2019-05-18 14:30:49
437
原创 JUC源码解析-ConcurrentSkipListMap
单线程下若想使用有序的键值对,我们选用 TreeMap,若是考虑到线程安全问题,则可以使用 ConcurrentSkipListMap,它与ConcurrentSkipListSet之间的关系就如 TreeMap 与 TreeSet 之家的关系一样,set 由 map来实现,本篇主要来分析 ConcurrentSkipListMap。底层数据结构是 跳表。...
2019-05-12 09:02:21
451
原创 EventLoop和线程模型
这是《Netty实战》,《Netty权威指南》的读书笔记。线程模型确定了代码的执行方式,所以理解所采用的并发模型的影响很重要。线程池缓存和重用 Thread 极大地提高了性能,但它并不能消除由上下文切换所带来的开销,随着线程数量的增加,高负载下情况会变得越来越糟。接下来看看Netty是如何处理的。EventLoop 接口运行任务来处理在连接的生命周期内发生的事件是任何网络框架的基本功能。与...
2019-04-13 01:51:25
345
原创 Reactor模式与Netty
在netty的线程模型中,bossGroup只负责请求的转发,workerGroup是具体的数据处理,其实netty使用的是Reactor(响应器)的设计模式。一篇文章对这种模式做了非常细致的介绍,《Scalable IO in Java》 ,这篇文章的作者是 Doug Lea!!!大多数的网络服务都是下面的流程:读取请求解码业务逻辑处理编码响应发送响应典型的设计实现如下:...
2019-04-12 12:33:41
783
原创 ThreadLocal源码解析
什么是ThreadLocal?它是属于线程自己的小仓库。关于它的使用与介绍看这一篇:ThreadLocal的介绍与使用关于ThreadLocal的原理,理清四个角色关系:Thread,ThreadLocal,ThreadLocalMap,Entry:在Thread中有个变量指向ThreadLocalMap ThreadLocal.ThreadLocalMap thread...
2019-04-09 11:05:42
494
原创 ThreadLocal的介绍与使用
本篇是《图解Java多线程设计模式》第十一章的读书笔记。有一个储物室,里面有很多储物柜。每个人拿着自己的钥匙去开自己的储物柜,虽然进同一个储物室,但彼此互不干扰。这就是 Thread-Local Storage 线程中的局部存储空间。来看一个例子:每个线程将信息打印到自己的日志文件中。TSLog :打印类,每个线程都有自己的 TSLog 对象,向自己的日志文件中打印信息。public cl...
2019-04-08 09:49:52
449
原创 Java并发之Future模式
本篇是《图解Java多线程设计模式》第九章的读书笔记。Future的意思是未来,假设有一个方法需要花费很长的时间才能获取到运行结果,那么与其一直等待不如先去忙别的,等你完成我再来拿。来看看示例代码:先来看下各个类之间的关系:Data接口RealData 与 FutureData 实现的接口public interface Data { String getContent()...
2019-04-07 21:25:02
462
原创 理解volatile
特性可见性:对一个volatile变量的读,总能看到任意线程对这个volatile变量最后的写。原子性:对任意单个volatile变量的读/写具有原子性。如何实现的?对volatile的写操作其汇编代码会多出一步带lock前缀的指令:0x01a3de24: **lock** addl $0x0,(%esp);该指令在多核处理器下引发两件事情:1,将当前处理器缓存行的数据写回到系统内...
2019-04-06 06:21:48
306
原创 数组相关算法题
题一:128.:Longest Consecutive Sequence 要求是O(n),所以不能使用排序,那么就得考虑辅助。利用Map,key为num,value为其连续长度,每次之更新这个连续序列的首尾两个位置的value值。 public int longestConsecutive(int[] nums) { Map&amp;amp;amp;amp;lt;Integer, Intege...
2019-04-06 06:19:39
245
原创 二分法相关题目
一般用法:public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l <= h) { int m = l + (h - l) / 2; // 防止l+h越界 if (nums[m] == key) { r...
2019-04-05 07:58:35
177
原创 Dubbo源码解析-ExtensionFactory
ExtensionFactory是拓展实现类工厂,来看看他在ExtentionLoader中的使用。ExtensionFactory对象在ExtentionLoader的构造器中创建。 private ExtensionLoader(Class&lt;?&gt; type) { this.type = type; objectFactory = (type...
2019-03-28 16:02:22
891
原创 Dubbo源码解析-SPI机制
版本2.7.1SPI(service providerinterface)机制,即我们定义了服务接口标准,让厂商去实现,关于Java的SPI机制Dubbo的SPI主要改进了JDK的SPI实现:1,JDK标准的SPI会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。2,如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK标准的ScriptEn...
2019-03-28 15:20:53
439
原创 Netty心跳机制的使用实例
我们将客户端对服务端发送的数据封装成MyRequest对象,服务端的回应封装成MyResponse对象,我们用Protostuff来序列化,底层通信实现采用Netty,实现心跳机制,当客户端一段时间没有向服务端发出请求就主动发一个PING过去,告诉服务端自己还活着,服务端接收后就回个PONG;服务端一段时间没收到请求就断开与客户端的长连接。关于Protostuff的使用看这篇Protostuff...
2019-03-25 12:30:25
712
原创 Protostuff序列化框架的使用及Objenesis的使用
import io.protostuff.LinkedBuffer;import io.protostuff.ProtostuffIOUtil;import io.protostuff.Schema;import io.protostuff.runtime.RuntimeSchema;import java.util.Map;import java.util.concurrent.Co...
2019-03-25 11:32:10
405
原创 BeanDefinitionRegistryPostProcessor与动态代理配合使用例子
我们想要实现这样一种功能:我们自定义了一个注解@MyReference,@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface MyReference{}在项目里被它注解的字段是就是我们要代理的类,我们希望在Spring启动时将代理类注入到这些被该注解标识的字段。那么有两点需要解决...
2019-03-25 07:12:18
2638
2
原创 JMM与happens-before
首先关于Java并发的通信机制是基于共享内存实现的,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信,这对程序员是透明的,我们需要理解其工作机制,以防止内存可见性问题,从而编写出正确同步的代码。同步指用于控制不同线程间操作发生相对顺序的机制,我们需要显式的指定方法或代码块需要在线程之间互斥执行。由于Java的这种通信方式,一个线程要跟另一个通信,何时将共享变量刷新到内存,另一...
2019-03-23 15:37:59
1485
1
原创 Synchronized
我将《Java并发编程的艺术》里关于synchronized的相关知识总结为如下的思维导图,更清楚的解释请去看该书的2.2章。
2019-03-23 10:35:21
256
原创 LeetCode动态规划题(二)
股票交易309,Best Time to Buy and Sell Stock with Cooldown包含冷却期 public int maxProfit(int[] prices) { if(prices.length&lt;2) return 0; int[] buy = new int[prices.length]; int[]...
2019-03-16 02:10:06
217
原创 JUC源码解析-阻塞队列-SynchronousQueue
SynchronousQueue 是一个同步阻塞队列,它的每个插入操作都要等待其他线程相应的移除操作,反之亦然。SynchronousQueue 像是生产者和消费者的会合通道,它比较适合“切换”或“传递”这种场景:一个线程必须同步等待另外一个线程把相关数据传递给它。不同于之前的 ArrayBlockingQueue,LinkedBlockingQueue…对于它们来说生产者线程将数据放入存储空间...
2019-03-12 01:47:17
339
转载 深入浅出QPS、RT和最佳线程数
转载自:深入浅出QPS、RT和最佳线程数阿姆达尔定律什么是QPS:QPS是每秒钟处理完请求的次数。这里的请求不是指一个查询或者数据库查询,是包括一个业务逻辑的整个流程,也就是说每秒钟响应的请求次数。什么是响应时间:响应时间即RT,处理一次请求所需要的平均处理时间。对于RT,客户端和服务端是大不相同的,因为请求从客户端到服务端,需要经过广域网,所以客户端RT往往远大于服务端RT,同时客户...
2019-03-04 17:11:27
1402
原创 JUC源码解析-阻塞队列-DelayQueue
DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。我们可以将DelayQueue运用在以下应用场景:缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从De...
2019-03-03 02:39:23
261
原创 JUC源码解析-阻塞队列-PriorityBlockingQueue
PriorityBlockingQueue需要对堆排序有了解,推荐 排序六 堆排序PriorityBlockingQueue 底层是个最小堆。 private static final int DEFAULT_INITIAL_CAPACITY = 11; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE -...
2019-03-01 16:53:03
234
原创 JUC源码解析-阻塞队列-LinkedBlockingQueue与ArrayBlockingQueue
什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会阻塞等待,直到队列变为非空或超时。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景。阻塞队列提供了四种处理方法:抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Q...
2019-02-28 23:13:07
392
原创 JUC源码解析-阻塞队列-迭代器(二)
4,删除remove public void remove() { // assert lock.getHoldCount() == 0; final ReentrantLock lock = ArrayBlockingQueue.this.lock; lock.lock(); try ...
2019-02-28 16:56:02
296
原创 JUC源码解析-阻塞队列-迭代器(一)
本篇来分析下阻塞队列里迭代器的实现,以ArrayBlockingQueue源码来分析。首先在开始前想一想,如何实现阻塞队列的迭代器功能?在并发下有些线程在读,有些在改,还有些在使用迭代器遍历,怎么确保安全性?用独占锁将这些操作隔离开,我们看 ArrayBlockingQueue 确实是这么做的。既然安全性得到保障那么还有什么问题是需要考虑的 ?过时数据问题。假设一个线程从此时的 takeI...
2019-02-28 16:55:41
498
原创 MySQL练习题记录
题目来自LeetcodeSwap Salary只用一个 SQL 查询,将 sex 字段反转UPDATE salarySET sex = CHAR ( ASCII(sex) ^ ASCII( 'm' ) ^ ASCII( 'f' ) );UPDATE salary SET sex = CASE sex WHEN 'm' THEN 'f' ...
2019-02-27 03:50:19
869
原创 Java内存区域与对象
本片文章主要是《深入理解Java虚拟机》的读书笔记1 运行时数据区域1.1 程序计数器由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,可以这...
2019-02-22 16:46:49
196
原创 由入栈/出栈序列求所有出栈/入栈序列
给出一个数组,代表入栈顺序,求所有出栈可能性?给出一个数组,代表出栈顺序,求所有入栈可能性?这两题解法相同,可利用 全排列 求出所有组合,再进行可能性分析。全排列代码如下: public List<List<Integer>> permute(int[] nums) { List<List<Integer>> resul...
2019-02-21 00:34:11
710
原创 SpringMVC之DispatcherServlet(一)
上一篇介绍了ContextLoaderListener,作用就是容器启动时创建WebApplicationContext存储在ServletContext中。本文将介绍SpringMVC核心DispatcherServlet,它是Servlet接口的实现类Servlet是一个Java编写的程序,基于Http协议,在服务端运行,主要处理客户端的请求并将结果发送给客户端。其生命周期由Servlet...
2019-02-18 14:25:48
10138
1
原创 LeetCode动态规划题
斐波那契数列类LeetCode70. Climbing Stairs题目描述:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法。dp[ i ] = dp[ i-1 ] + dp[ i-2 ];public int climbStairs(int n) { if (n &amp;amp;amp;amp;lt;= 2) { return n; } int pre2 = ...
2019-02-12 17:12:36
402
原创 SpringMVC之ContextLoaderListener
ContextLoaderListener的作用就是启动Web容器时自动装配ApplicationContext的配置信息。它实现了ServletContextListener接口,在web.xml中配置这个监听器,启动容器时就会执行它的实现类。对于ServletContextListener,你可以利用它在为客户端请求提供服务之前像 向ServletContext中添加任意对象。该对象将在Se...
2019-02-12 12:27:10
1887
原创 spring事件发布机制
关于Java的事件监听机制Spring事件机制是观察者模式的一种实现,但是除了发布者和监听者者两个角色之外,还有一个EventMultiCaster的角色负责把事件转发给监听者。观察者模式Spring的事件监听(也称事件驱动)是观察者模式的一种实现,比较常见的有发布-订阅模型。通常我们利用消息队列来实现不同系统之间的解耦,如用户注册完成后,可以向消息队列发布一条消息,然后订阅了此topic的...
2019-02-08 06:28:32
1348
转载 java事件监听机制
java 事件机制java的事件机制一般包括三个部分:EventObject,EventListener和Source。EventObjectjava.util.EventObject是事件状态对象的基类,它封装了事件源对象以及和事件相关的信息。所有java的事件类都需要继承该类。EventListenerjava.util.EventListener是一个标记接口,就是说该接口内是没有...
2019-02-07 10:56:07
279
原创 java.lang.Class.isPrimitive()
用来判断Class是否为基本数据类型,有九种预定义的Class对象代表的八个基本类型和void。这些都是由Java虚拟机创建的,并且具有相同的名称,它们代表即boolean, byte, char, short, int, long, float, 和double 等原始类型。public static void main(String[] args){ Class stringCla...
2019-02-04 07:57:23
542
原创 Java-SPI
SPI即Service Provider Interface,Service提供者接口:提供给服务提供厂商与扩展框架功能的开发者使用的接口。java spi提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。很多框架都使用了java的SPI机制,如JDBC4中的java.sql.Driver的SPI实现(mys...
2019-02-01 17:33:34
482
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人