Russ Xia Blog

身处寒夜,把握星光。

基于自旋的CLH锁

CLH锁的Java实现

基于自旋的CLH锁 什么是CLH锁 CLH锁满足一下几个特点 CLH锁是利用链表实现的无界队列,公平的(FIFO队列),自旋锁。 线程在局部变量上自旋,不断轮询前置节点的状态,如果发现前置节点已经释放了锁,则结束自旋获取锁。 AQS(AbstractQueuedSynchronizer)源码中使用的是CLH锁的一个变种。 CLH算法 CLH算法的数据结构及实现 数...

自旋锁和互斥锁

自旋锁和互斥锁的区别和对比

自旋锁和互斥锁 自旋锁的由来 计算机系统资源总是有限的,有些资源需要互斥访问,因此就有了锁机制,只有获得锁的线程才能访问资源。锁保证了每次只有一个线程可以访问资源。 当线程申请一个已经被其他线程占用的锁,就会出现两种情况。一种是没有获得锁的线程会阻塞自己,等到锁被释放后再被唤起,这就是互斥锁;另一种是没有获得锁的线程一直循环在那里看是否该锁的保持者已经释放了锁,这就是自旋锁。 对自旋...

基于SnowFlake的分布式主键生成器

SnowFlake的算法分析和实现

基于SnowFlake的分布式主键生成器 常见的分布式主键生成策略 UUID UUID(Universally Unique Identifier)主要优点是: 性能高,本地生成,不需要网络开销; 主要缺点: 太长不易存储,也不适合做MySQL.InnoDB引擎的主键(索引开销大大增大) 基于MAC地址生成,信息不安全 类SnowFlake方案 这个也是我...

Java中三元运算符的装箱拆箱

Java中三元运算符的装箱拆箱遇到的问题及其原因分析

Java中三元运算符的装箱拆箱 问题复现 测试环境中,有一段一直报NullPointerException的代码 //map.get(CommonConstants.COUNTRYID) != null 此处为false //busiBasicinfo.getCountryId())此处为null busiBasicinfoDTO.setCountryId(map.get(Commo...

Java集成Kafka简单步骤

Kafka的配置与启动,Java接入Kafka的简单demo

Java集成Kafka简单步骤 准备 kafka下载地址:http://mirror.bit.edu.cn/apache/kafka/1.0.1/kafka_2.11-1.0.1.tgz 项目代码地址:https://github.com/RussXia/kafka_demo 1.启动zookeeper ./bin/zookeeper-server-start.sh ./confi...

二叉树及其遍历

什么是二叉树,以及二叉树的三种深度遍历方式

二叉树及其遍历 一、什么是二叉树? 二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。 (引用自wiki) 一棵深度为k,且有2^(k+1)-1个节点的二叉树,称为满二叉树(Full Binary Tree)。这种树的特点是每一层上的节点数都是最大节点数。 而在...

关于#与$的区别

关于#与$的区别 '#{}'与'${}'的区别 结论 ’#{}’是经过预编译的,是安全的; ${}仅仅是一个string替换,存在sql注入的可能性。 能使用#{}的时候尽量使用#{} 二者的区别 在Mybatis的动SQL解析阶段,使用#{}和${}会有不同的表现: ’#{}’ ’#{}’会解析成一个JDBC预编译语句(PreparedStatement)的参数标记符(占位...

Mac下的个人常用软件

Mac下的个人常用软件

Mac下个人常用的软件列表 SourceTree 图形化的git管理工具 Chrome 常用的插件:Adblock Plus、Axure RP Extension for Chrome、Charset、Momentum、Octotree、Tampermonkey、有道词典Chrome划词插件、购物党 Sublime Text/Atom 好用的文本工具 ...

类加载过程

Java类加载过程以及双亲委派模型

类加载过程 类从被加载到虚拟机内存开始,到卸载除内存,主要的生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。 它们开始的顺序如下图所示: 其中,加载、验证、准备、初始化这四个阶段是顺序开始的,解析阶段则不一定(为了支持Java的运行时绑定) 加载与类加载器 加载 加载阶段,虚拟机主要完成下面3个事情: 通过类的权限定名获取此类的二进制字节流 将这...

Spring IOC 循环依赖

什么是循环依赖以及Spring如何检测循环依赖的

Spring IOC 循环依赖 1.什么是循环引用? 所谓循环依赖,就是在注入Bean到Spring容器的时候,存在两个Bean,它们通过构造函数注入,且a依赖于b,b依赖于a。 对于这种通过构造函数注入的循环依赖,Spring是无法进行实例化的,在实例化的工程中会抛出org.springframework.beans.factory.BeanCurrentlyInCreationE...