java基础
文章平均质量分 65
雨夜归人93
这个作者很懒,什么都没留下…
展开
-
SPI-数据库驱动的实现过程
本文基于jdk1.8前文介绍了SPI的实现原理,本篇主要看下,项目中数据库驱动对SPI的使用。以数据源Hikari为例。数据源调用getConnection方法时,会实例HikariPool对象,跟着调用链,最终会调用DriverManager.getDrivers。public class HikariDataSource extends HikariConfig implements DataSource, Closeable { public Connection getConnectio原创 2021-06-30 17:38:42 · 367 阅读 · 0 评论 -
SPI-自由扩展的入口
本文基于jdk1.8一.SPI是何物?SPI是Service Provider Interface的缩写,用于解耦服务接口与其具体实现。java编程中最常见的SPI实现是解耦数据库驱动。想想平时引入mysql或者postgresql的jar就能连上数据库,是不是很神奇。二. 快速实现SPI接口来动手写一个demo,熟悉下。1. 定义一个用户服务,及其实现public interface UserService { String getUserName(long userId);}原创 2021-06-30 16:30:53 · 233 阅读 · 0 评论 -
Thread-打断一下,插个广告 ^ - ^
本文基于jdk1.8一.那个Thread中断一下如何停止一个运行线程呢?很久以前通过stop(),这是属于抢占式的中断。强制停止一个线程,可能造成不可预估的后果。举个例子:例如正在玩游戏,耗时n久通过了,没存档,然后突然断电了。。。,这个后果是砸显示器还是砸显示器呢。现在推荐调用interrupt(),这属于协作式中断。线程中断不代表线程的立即死亡,可能是中断返回等待新的任务,或是线程忙完任务选择合适的时机再死亡。这意味着,调用interrupt,只是标识了线程中断状态,至于要不要死亡或者什原创 2021-06-18 16:34:35 · 83 阅读 · 0 评论 -
AbstractQueuedSynchronizer-排队队吃果果
本文基于jdk1.8一.我是谁???AbstractQueuedSynchronizer 简称AQS,翻译过来是抽象队列同步器,是多线程访问共享资源的基类。CountDownLatch,ReentrantLock内部都有它的影子。AQS使用的等待队列是“CLH”(Craig、Landin 和 Hagersten)锁定队列的变体。CLH 锁通常用于自旋锁。二. AQS基石node作为AQS的基石,关键属性分类:有前后指针,表示最后组成一个双向链表支持共享和独占两种模式获取资源waitSta原创 2021-06-17 18:31:25 · 118 阅读 · 0 评论 -
ThreadPoolExecutor线程池-水太深你把握不住
本文基于jdk1.8线程池是池化技术的一种实现,是为了避免频繁创建线程而出现的。一. 构造方式最全的构造方法如下: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,原创 2021-06-16 18:34:53 · 88 阅读 · 0 评论 -
位掩码-劝你放下遮掩,好好做X
一.这个遮遮掩掩的家伙是谁首先强行解释一波啥是位掩码:位表示二进制的值,一位1表示一个状态值.掩码是与目标数值进行位操作的二进制值.简单理解就是有多种状态的二进制值。二. 遮掩的用处肯定不是装X用的,主要是有两点:快,计算机采用二进制,位操作快需要多个布尔值的场景,例如权限三. 掩码和指定值的操作假设mask为掩码,A为指定状态,主要包含位操作如下, // 获取A状态 mask & A; // 添加A状态原创 2021-06-15 22:40:02 · 248 阅读 · 0 评论 -
双重检查锁-多一重的快乐
1.单机版单例日常开发中,为了性能考虑,可能要延迟实例化一些对象,这时可能的代码如下public class SingletonDemo { private SingletonDemo() { } private static SingletonDemo instance; public static SingletonDemo getInstance() { if (instance == null) { instance = n原创 2021-06-10 17:45:59 · 120 阅读 · 0 评论 -
父子间的枢纽-InheritableThreadLocal
本文基本jdk1.8。日常开发中可以用ThreadLocal保存本线程的专属数据。但是要进行并行操作时,如果将父线程数据传递给后续的子线程呢?答案是InheritableThreadLocal。1.InheritableThreadLocalInheritableThreadLocal源码比较简单,继承自ThreadLocal,不了解的可以参考之前ThreadLocal的解析。public class InheritableThreadLocal<T> extends ThreadLo原创 2021-06-09 21:27:07 · 58 阅读 · 0 评论 -
IDEA初始设置及常用插件
本文如题,介绍IDEA基础配置及常用插件。IDEA为2020.1.1版本。一.基础配置安装完idea,进入启动页面,选择setting进行默认配置,这样子不用每个项目都配置一遍。1.字体设置进入Editor菜单下选中 Font菜单,设置Size属性,调节字体大小。2.文件编码进入Editor菜单下选中 File Encodings菜单,设置Encoding属性,统一使用UTF-8,保证不乱码。3.自动导包进入Editor菜单,再点击General菜单,选中Auto Import菜单,勾原创 2020-09-15 21:24:14 · 1069 阅读 · 0 评论 -
面向java--LinkedTransferQueue
本文基于jdk1.81.简介LinkedTransferQueue 底层使用一个双向队列。双向队列是指队列中存在两种节点,一种是数据节点,一种是非数据节点。取数据时,如果当前是数据节点则匹配,出队。否则向队列插入一个非数据节点。存数据时,如果当前是非数据节点则匹配,出队。否则向队列插入一个数据节点。其继承关系如下从继承关系可以看出,LinkedTransferQueue是一个堵塞队列。二.源码解析1.基本属性 // 队列头 transient volatile Node head;原创 2020-07-26 22:22:07 · 83 阅读 · 0 评论 -
面向java--ConcurrentHashMap
本文基于jdk1.81.简介ConcurrentHashMap 是HashMap 的线程安全版本。底层跟HashMap类似,采用了数组+链表+红黑树的结构。其继承关系如下二.源码解析1.基本属性主要列出与HashMap不同的属性 // 最小转移分组大小 private static final int MIN_TRANSFER_STRIDE = 16; private static int RESIZE_STAMP_BITS = 16; // 最大扩容量原创 2020-07-26 19:03:12 · 68 阅读 · 0 评论 -
ReentrantReadWriteLock-大家一起读
本文基于jdk1.81.简介在本文中与《面向java–ReentrantLock》中一致的方法,不在重复说明。ReentrantReadWriteLock出现是为了解决读多写少的场景出现的,在读读的场景下不互斥,从而提高并发效率。其继承关系如下二.源码解析1.基本属性 // 读锁 private final ReentrantReadWriteLock.ReadLock readerLock; // 写锁 private final ReentrantReadWriteLock.W原创 2020-07-25 22:23:00 · 65 阅读 · 0 评论 -
ReentrantLock-多重上锁,再也不怕丢东东了
本文基于jdk1.81.简介Reentrant 直译过来是"可重入",很直白的表明是个重入锁.继承关系如下锁的具体实现通过内部的sync,其关系如下AbstractQueuedSynchronizer 是一个抽象类,提供了模板方法,子类只需重写lock,tryAcquire之类的方法,即可实现锁的完成功能.AbstractQueuedSynchronizer使用CAS+state实现锁,双向链表的结构实现线程等待.二.源码解析1.基本属性 private final Sync sync;原创 2020-07-24 14:08:00 · 139 阅读 · 0 评论 -
面向java--CopyOnWriteArrayList
本文基于jdk1.8一.简介CopyOnWriteArrayList 是ArrayList是线程安全版本,它是通过重入锁实现线程安全.继承结构如下二.源码介绍1.基本属性 // 重入锁,用于保证线程安全 final transient ReentrantLock lock = new ReentrantLock(); // 存储数据, 内部方法通过调用getArray/...原创 2020-04-30 17:52:30 · 176 阅读 · 0 评论 -
面向java--ArrayList
本文基于jdk1.8一.简介ArrayList底层是是数组结构,通过动态的扩容实现容量的增长.继承关系如下二.源码解析1.基本属性 /** * 默认初始容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 空实例用于共享空数组, 有参构建时使用 */ pr...原创 2020-04-29 18:31:41 · 703 阅读 · 0 评论 -
ThreadLocal-快,备份一下
ThreadLocal在平时工作中还是比较常见的类,作为一个解决多线程问题的一个途径,还是值得去学习下的.它的工作原理,简单的说就是ThreadLocal为每个线程创建一个本地副本变量机制,实现与其他线程的隔离.源码解析1.set 方法 public T get() { // 获取当前线程 Thread t = Thread.currentThread(); ...原创 2019-12-18 14:30:06 · 117 阅读 · 0 评论 -
面向java--HashMap
这里写自定义目录标题面向基础之HashMap常见的面试题底层结构源码分析1. 构造方法合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...原创 2019-12-13 13:54:44 · 96 阅读 · 0 评论