- 博客(563)
- 资源 (16)
- 收藏
- 关注
原创 【死磕Sharding-jdbc】---分布式ID
链接:http://cmsblogs.com/?p=2532 注:为了让更多人看到,征求飞哥意见,将此系列博文标注为原创,飞哥简书:https://www.jianshu.com/u/6779ec81d3b7实现动机传统数据库软件开发中,主键自动生成技术是基本需求。而各大数据库对于该需求也提供了相应的支持,比如MySQL的自增键。 对于MySQL而言,分库分表之后,不...
2018-07-13 09:27:12 9710 1
原创 【死磕Sharding-jdbc】---路由&执行
链接:http://cmsblogs.com/?p=2532 注:为了让更多人看到,征求飞哥意见,将此系列博文标注为原创,飞哥简书:https://www.jianshu.com/u/6779ec81d3b7继续以sharding-jdbc-example-jdbc模块中的com.dangdang.ddframe.rdb.sharding.example.jdbc.Main为...
2018-07-13 09:25:50 7081 1
原创 【死磕Sharding-jdbc】---数据源
链接:http://cmsblogs.com/?p=2516 注:为了让更多人看到,征求飞哥意见,将此系列博文标注为原创,飞哥简书:https://www.jianshu.com/u/6779ec81d3b7以com.dangdang.ddframe.rdb.sharding.example.jdbc.Main剖析分库分表配置与实现,其部分源码如下:public fi...
2018-06-27 11:22:34 7494
原创 【死磕Sharding-jdbc】---准备工作
链接:http://cmsblogs.com/?p=2513 注:为了让更多人看到,征求飞哥意见,将此系列博文标注为原创,飞哥简书:https://www.jianshu.com/u/6779ec81d3b7接下来对sharding-jdbc源码的分析基于tag为1.5.4.1源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性是...
2018-06-27 10:55:00 7749 1
原创 【死磕Java并发】-----分析 ArrayBlockingQueue 构造函数加锁问题
原文出处http://cmsblogs.com/ 『chenssy』昨天有位小伙伴问我一个 ArrayBlockingQueue 中的一个构造函数为何需要加锁,其实这个问题我还真没有注意过。主要是在看 ArrayBlockingQueue 源码时,觉得它很简单,不就是通过加锁的方式来操作一个数组 items 么,有什么难的,所以就没有关注这个问题,所以它一问我懵逼了。回家细想了下,所以产生这篇博客
2017-11-30 21:46:23 3466 2
原创 JVM致命错误日志(hs_err_pid.log)分析
最近两天测试环境有一个服务总是会挂(两到三天一次),JVM虚拟机总是会崩溃。所以有必要了解JVM崩溃的原因是什么。当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致 JVM crash 的重要信息,我们可以通过分析该文件定位到导致 JVM Crash 的原因,从而修复保证系统稳定。默认情况下,该文件是生成在工作目录下的,当然也可以通过 JVM
2017-10-18 13:18:29 107848 17
原创 【死磕Java并发】-----J.U.C之线程池:ScheduledThreadPoolExecutor
原文出处http://cmsblogs.com/ 『chenssy』在上篇博客【死磕Java并发】—–J.U.C之线程池:ThreadPoolExecutor已经介绍了线程池中最核心的类ThreadPoolExecutor,这篇就来看看另一个核心类ScheduledThreadPoolExecutor的实现。ScheduledThreadPoolExecutor解析我们知道Timer与TimerT
2017-10-08 21:40:59 2596
原创 【死磕Java并发】-----J.U.C之线程池:ThreadPoolExecutor
原文出处http://cmsblogs.com/ 『chenssy』作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它。下面我们就通过源码来一步一步弄清楚它。内部状态线程有五种状态:新建,就绪,运行,阻塞,死亡,线程池同样有五种状态:Running, SHUTDOWN, STOP, TIDYING, TERMINATED
2017-10-07 22:02:28 5140 4
原创 【死磕Java并发】-----J.U.C之线程池:线程池的基础架构
经历了Java内存模型、JUC基础之AQS、CAS、Lock、并发工具类、并发容器、阻塞队列、atomic类后,我们开始JUC的最后一部分:线程池。在这个部分你将了解到下面几个部分:线程池的基础架构线程池的原理分析线程池核心类的源码分析线程池调优Executor我们先看线程池的基础架构图:ExecutorExecutor
2017-10-06 21:29:22 5193 4
原创 【死磕Java并发】-----深入分析ThreadLocal
原文出处http://cmsblogs.com/ 『chenssy』ThreadLoacal是什么?ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?API是这样介
2017-10-05 15:50:54 4025 1
原创 【死磕Java并发】-----J.U.C之阻塞队列:BlockingQueue总结
原文出处http://cmsblogs.com/ 『chenssy』经过前面六篇博客的阐述,我想各位应该对阻塞队列BlockingQueue有了较为深入的理解,下面来一个总结,先看整个类图:BlockingQueueBlockingQueue接口实现Queue接口,它支持两个附加操作:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。相对于同一操作他提供了四种机制:抛出异常、返回特殊值、
2017-10-04 18:26:06 4743 2
原创 【死磕Java并发】-----J.U.C之阻塞队列:LinkedBlockingDeque
原文出处http://cmsblogs.com/ 『chenssy』前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和移除元素,同样意味着LinkedBlockingDeque支持FIFO、FILO两种操作方式。LinkedBlockingDeque是可选容量的,在初始化时可以
2017-10-03 15:49:33 4009 1
原创 【死磕Java并发】-----J.U.C之阻塞队列:LinkedTransferQueue
原文出处http://cmsblogs.com/ 『chenssy』前面提到的各种BlockingQueue对读或者写都是锁上整个队列,在并发量大的时候,各种锁是比较耗资源和耗时间的,而前面的SynchronousQueue虽然不会锁住整个队列,但它是一个没有容量的“队列”,那么有没有这样一种队列,它即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会
2017-09-24 20:52:16 4445 3
原创 【死磕Java并发】-----J.U.C之阻塞队列:SynchronousQueue
原文出处http://cmsblogs.com/ 『chenssy』【注】:SynchronousQueue实现算法看的晕乎乎的,写了好久才写完,如果当中有什么错误之处,忘各位指正作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,Synchronou
2017-08-18 16:42:22 12925 3
原创 【死磕Java并发】-----J.U.C之阻塞队列:DelayQueue
原文出处http://cmsblogs.com/ 『chenssy』DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面: - 缓存:清掉缓存中超时的缓存数据 - 任务超时
2017-08-14 21:49:07 5812 3
原创 【死磕Java并发】-----J.U.C之阻塞队列:PriorityBlockingQueue
原文出处http://cmsblogs.com/ 『chenssy』我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? Priori
2017-07-31 08:58:16 6569 4
原创 【死磕Java并发】-----J.U.C之阻塞队列:ArrayBlockingQueue
原文出处http://cmsblogs.com/ 『chenssy』ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用FIFO的原则对元素进行排序添加的。ArrayBlockingQueue为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默认情况下不
2017-07-23 10:01:30 6941 4
原创 【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentSkipListMap
原文出处http://cmsblogs.com/ 『chenssy』到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash、TreeMap,这两种数据结构各自都有着优缺点。Hash表:插入、查找最快,为O(1);如使用链表实现则可实现无锁;数据有序化需要显式的排序操作。红黑树:插入、查找为O(logn),但常数项较小;无锁实现的复杂性很高,一般需要加锁;数据天然有
2017-07-12 00:34:46 8458 4
原创 【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentLinkedQueue
原文出处http://cmsblogs.com/ 『chenssy』要实现一个线程安全的队列有两种方式:阻塞和非阻塞。阻塞队列无非就是锁的应用,而非阻塞则是CAS算法的应用。下面我们就开始一个非阻塞算法的研究:CoucurrentLinkedQueue。ConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算
2017-07-08 21:26:10 9902 8
原创 【死磕Java并发】-----J.U.C之ConcurrentHashMap红黑树转换分析
原文出处http://cmsblogs.com/ 『chenssy』在【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentHashMap一文中详细阐述了ConcurrentHashMap的实现过程,其中有提到在put操作时,如果发现链表结构中的元素超过了TREEIFY_THRESHOLD(默认为8),则会把链表转换为红黑树,已便于提高查询效率。代码如下:if (binCoun
2017-06-26 22:32:25 11046 5
原创 【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentHashMap
此篇博客所有源码均来自JDK 1.8HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,吞吐量较低,性能较
2017-06-20 22:18:02 10237 5
原创 【死磕Java并发】-----J.U.C之并发工具类:Exchanger
此篇博客所有源码均来自JDK 1.8前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。Exchange是最简单的也是最复杂的,简单在于API非常简单,就一个构造方法和两个exchange()方法,最复杂在于它的实现是最复杂的(反正我是看晕了的)。在API是这么介绍的:可以在对中对元素进行配对和交换的线
2017-05-19 17:54:30 9246 1
原创 【死磕Java并发】-----J.U.C之并发工具类:Semaphore
此篇博客所有源码均来自JDK 1.8信号量Semaphore是一个控制访问多个共享资源的计数器,和CountDownLatch一样,其本质上是一个“共享锁”。Semaphore,在API是这么介绍的:一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。
2017-05-03 18:12:09 6008 4
原创 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
此篇博客所有源码均来自JDK 1.8在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似。CyclicBarrier所描述的是“允许一组线程互相等待,直到到达某个公共屏障点,才会进行后续任务”,而CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等
2017-04-24 20:26:51 6803
原创 【死磕Java并发】-----J.U.C之并发工具类:CyclicBarrier
此篇博客所有源码均来自JDK 1.8CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 通俗点讲就
2017-04-13 18:06:41 8017 1
原创 【死磕Java并发】----深入分析CAS
CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用CAS技术鬼斧神工地实现了Java多线程的并发操作。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC的基石。 CAS分析在CAS中有三个参数:内存值V、旧的预期值A
2017-04-07 20:08:04 12118 7
原创 【死磕Java并发】-----J.U.C之Condition
此篇博客所有源码均来自JDK 1.8在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活。下图是Condition与Object的监视器方法的对比(
2017-04-05 18:21:53 8216
原创 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
此篇博客所有源码均来自JDK 1.8重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时
2017-03-29 09:21:31 7060 1
原创 【死磕Java并发】-----J.U.C之重入锁:ReentrantLock
此篇博客所有源码均来自JDK 1.8ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。 API介绍如下: 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行
2017-03-26 21:19:18 6292
原创 【死磕Java并发】-----J.U.C之AQS:阻塞和唤醒线程
此篇博客所有源码均来自JDK 1.8在线程获取同步状态时如果获取失败,则加入CLH同步队列,通过通过自旋的方式不断获取同步状态,但是在自旋的过程中则需要判断当前线程是否需要阻塞,其主要方法在acquireQueued():if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt())
2017-03-23 21:41:19 8869 2
原创 【死磕Java并发】-----J.U.C之AQS:同步状态的获取与释放
此篇博客所有源码均来自JDK 1.8在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础。AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态,对于子类而言它并没有太多的活要做,AQS提供了大量的模板方法来实现同步,主要是分为三类:独占式获取和释放同步状态、共享式获取和释放同步状态、查询同步队列中的等待线程情况。自定义子类使
2017-03-13 17:30:00 5913 4
原创 【死磕Java并发】-----J.U.C之AQS:CLH同步队列
此篇博客所有源码均来自JDK 1.8在上篇博客【死磕Java并发】—–J.U.C之AQS:AQS简介中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时
2017-03-07 22:11:14 12197
原创 【死磕Java并发】-----J.U.C之AQS:AQS简介
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略(【死磕Java并发】—–深入分析synchronized的实现原理),但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可
2017-03-05 22:26:36 16442 2
原创 【死磕Java并发】-----Java内存模型之总结
经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结。总结JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。JMM对程序员屏蔽了CPU以及OS内存的使用问题,能够使程序在不同的CPU和OS内存上都能够达到预期的效果。Java采用内存
2017-03-03 12:58:24 7069 6
原创 【死磕Java并发】-----Java内存模型之从JMM角度分析DCL
DCL,即Double Check Lock,中卫双重检查锁定。其实DCL很多人在单例模式中用过,LZ面试人的时候也要他们写过,但是有很多人都会写错。他们为什么会写错呢?其错误根源在哪里?有什么解决方案?下面就随LZ一起来分析问题分析我们先看单例模式里面的懒汉式:public class Singleton { private static Singleton singleton; p
2017-02-28 18:45:36 2991 9
原创 【死磕Java并发】-----Java内存模型之分析volatile
前篇博客【死磕Java并发】—–深入分析volatile的实现原理 中已经阐述了volatile的特性了:volatile可见性;对一个volatile的读,总可以看到对这个变量最终的写;volatile原子性;volatile对单个读/写具有原子性(32位Long、Double),但是复合操作除外,例如i++;JVM底层采用“内存屏障”来实现volatile语义下面LZ就通过happens
2017-02-23 20:27:42 4746 2
原创 【死磕Java并发】-----Java内存模型之重排序
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 1. 在单线程环境下不能改变程序运行的结果; 2. 存在数据依赖关系的不允许重排序如果看过LZ上篇博客的就会知道,其实这两点可以归结于一点:无法通过happens-before原则推导出来的,JMM允许任意的排序。as-if-serial语义as-if-se
2017-02-20 08:44:36 9152 5
原创 【死磕Java并发】-----Java内存模型之happens-before
在上篇博客(【死磕Java并发】—–深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程A修改了变量a何时对线程B可见?我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before,从JDK 5 开始,JMM就使用ha
2017-02-13 12:02:47 4158 5
原创 【死磕Java并发】-----深入分析volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。Java语言规范对volatile的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更
2017-02-08 17:51:54 5449 6
原创 【死磕Java并发】-----深入分析synchronized的实现原理
记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 诚然,随着Javs SE
2017-02-05 21:48:08 44579 49
老干爹/Cloud-Admin
2018-08-26
Spring源码
2018-05-23
Edraw Max for mac 亿图图示 8.4 中文破解版
2018-04-23
基于J2EE购物网站的设计与实现--源码
2013-06-16
jspSmartUpload组件,文件上传、下载
2011-10-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人