- 博客(18)
- 资源 (1)
- 收藏
- 关注
原创 java中的深拷贝与浅拷贝
一 序 最初这篇打算放在arraylist里面整理,因为arraylist也是实现了clone接口。想想还是摘出来吧public interface Cloneable {}关于clone,就是复制。它允许在堆中克隆出一块和原对象一样的对象,并将这个对象的地址赋予新的引用。 Java 中 一个类要实现clone功能 必须实现 Cloneable接口,否则在调用 clone() 时会报 Clon...
2018-06-29 16:38:48
551
原创 Java锁归类
1 自旋锁 自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,若在若干个空循环后,线程如果可以获得锁,则继续执行。若线程依然不能获得锁,才会被挂起。从jdk1.7开始,自旋锁的参数被取消,虚拟机不再支持由用户配置自旋锁,自旋锁总是会执行,自旋锁次数也由虚拟机自动调整。2 阻塞锁 让线程进入阻塞状态进行等待,当获得相应的信号(唤醒,时间) 时,才可以进入线程的...
2018-06-26 19:37:45
277
原创 java自旋锁
一 序 锁作为并发共享数据,保证一致性的工具,这些JDK已经写好提供的锁(如 synchronized 和 ReentrantLock等等 )为我们开发提供了便利,但是锁的背景原理也很重要。整理下常见的锁。 由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的线程才能获取资源访问。即是每次只...
2018-06-26 17:33:41
690
原创 Java并发系列目录
主要是受《Java并发编程的艺术》一书读书笔记整理而成。本篇算是相关知识点的目录,第二章: Synchonized volatile 部分与第三章整合。 个人觉得顺序需要调整下,从第三章开始比较好。 另外,第二章偏重概念介绍synchronized,在找一篇结合看不懂的openjdk来讲究更好了。第 3章 内存模型相关: volatile 锁的内存语义(包含了happ...
2018-06-25 15:31:07
404
原创 java并发系列:锁的内存语义
一 序: 本文根据《Java并发编程的艺术》第3.5部分整理而成。书上的3.4 volatile 参见之前整理。 jdk里面Javadoc关于lock有这样的介绍:Memory SynchronizationAll Lock implementations must enforce the same memory synchronization semantics as provided by ...
2018-06-25 14:49:51
2033
原创 java并发系列:阻塞队列(1) ArrayBlockingQueue
一 阻塞队列 看了《Java并发编程的艺术》。继续整理。 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器...
2018-06-23 23:00:44
3463
原创 java并发系列:ReentrantReadWriteLock读写锁
一 序 之前整理过AQS(AbstractQueuedSynchronizer) 锁的基础。 还有重入锁(ReentrantLock),Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大...
2018-06-22 16:07:40
2772
2
原创 Java集合:ConcurrentLinkedQueue
一 序在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现.例如:ConcurrentLinkedQueue下面从源代码中分析ConcurrentLinkedQueu...
2018-06-19 20:21:36
484
原创 java集合:PriorityQueue
一 序: 之前在看shardingjdbc的OrderByStreamResultSetMerger的时候,用了PriorityQueue。来看看对应的实现.先补充下相关概念:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是一种特...
2018-06-15 12:02:54
1159
原创 shardingjdbc (九)-最大努力型事务
一 序:Sharding-JDBC由于性能方面的考量,决定不支持强一致性分布式事务。目前支持的:Best efforts delivery transaction (已经实现).Try confirm cancel transaction (待定).最大努力送达型:在分布式数据库的场景下,相信对于该数据库的操作最终一定可以成功,所以通过最大努力反复尝试送达操作。实际上可以看看图上的流程,不管执行结...
2018-06-12 12:11:38
5182
原创 shardingjdbc (八)-groupby结果合并
4 GroupByStreamResultSetMergerGroupByStreamResultSetMerger,基于 Stream 方式分组归并结果集实现。 它继承自 OrderByStreamResultSetMerger,在排序的逻辑上,实现分组功能。实现原理也较为简单:public final class GroupByStreamResultSetMerger extends Ord...
2018-06-10 18:00:15
4318
原创 shardingjdbc (七)-结果合并
一 序 单分片的SQL查询不需要合并,多分片的情况在各分片排序完后,Sharding-JDBC 获取到结果后,仍然需要再进一步排序。目前有 分页、分组、排序、聚合列、迭代 五种场景需要做进一步处理。 public ResultSet executeQuery() throws SQLException { ResultSet result; ...
2018-06-10 16:55:13
5190
2
原创 shardingjdbc (六)-SQL执行
一 序之前整理了SQL的路由,SQL的改写,按照jdbc的过程,接下来就是SQL执行了。SQL执行的源码在core模块下,下图所示。下图是查询流程,绿框是SQL执行过程。二 ExecutorEngine2.1 ListeningExecutorServiceSQL执行引擎,基于guava工具类提供的继承自 ExecutorService 的线程服务接口,提供创建 ListenableFuture ...
2018-06-06 20:17:06
3840
原创 shardingjdbc (五)-SQL改写
一 序 上一篇在《SQL路由实现》 提了SQL改写。这里跟路由紧密结合,是在路由之后的步骤。路由解决了分库分表去查那些,改写负责一些如查询结果需要聚合,对SQL进行调整,生成分库分表后的执行SQL。二 sqltokenSQL改写的源码在core模块的io.shardingjdbc.core.rewrite目录下,分为SQLBuilder和SQLRewriteEngine。SQLToken,SQL...
2018-06-06 13:15:52
2374
原创 shardingjdbc 学习(四)-SQL路由实现
一 序上一篇整理了jdbc的过程 ,update大概分两步,route跟执行。查询还有结果集归并。上面本篇继续从路由开始整理。大概分为:分库分表整体,route包源码分析。本文主要基于shardingjdbc 2.0.3版本整理。感谢芋道源码:http://www.iocoder.cn/Sharding-JDBC/sql-route-2/二 分库分表:这一部分算是第二篇API的补充吧。假设你阅读本...
2018-06-04 21:26:51
6847
原创 shardingjdbc(三)-JDBC实现
一 序 看源码的过程,有两个维度,主要是根据执行过程去看。好处是可以有个大的流程图。对于有遗漏的点,可以按照宝结构再扫一遍,查漏补缺。上一篇主要整理了分库分表及主要暴露的API。本边继续从jdbc规范整理,从jdbc的实现,柔性事务,读写分离,路由,结果合并。最后整理模块最多也是核心的SQL解析。感谢芋道源码。http://www.iocoder.cn/Sharding-JDBC/jdb...
2018-06-03 22:14:52
1733
原创 shardingjdbc 学习(二)-API与分库分表
本文从官网的配置的 数据源入门,介绍支持的分库分表及与对应的API源码一 官网分库分表数据源配置1.1 核心概念: shardingjdbc 对数据分为yaml,spring,spring boot等多种方式。可以结合实际项目使用,我们实际采用spring,但是为了节省篇幅,把官网的yaml带注释的贴过来。dataSources: 数据源配置 <data_source_name> ...
2018-06-01 19:09:10
8164
1
原创 shardingjdbc 入门概念
官网:http://shardingjdbc.io/document/legacy/2.x/cn/02-guide/concepts/LogicTable数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。ActualTable在分片的数据库中真实存在的物理表。即上个示例...
2018-06-01 17:28:37
2342
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅