自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

袁江南的博客

编程不限于语言,人生不限于编程

  • 博客(38)
  • 资源 (3)
  • 问答 (4)
  • 收藏
  • 关注

原创 zookeeper配置启动及配置文件解析 (一)

zookeeper配置启动及配置文件解析 (一)单机部署1、由于zookeeper集群的运行需要Java运行环境,所以需要首先安装 JDK2、官问下载zookeeper安装包,并上传服务器https://zookeeper.apache.org/releases.html3、解压zookeepertar -zxvf zookeeper-xxx.tar.gz4、进入zookeeper根目录5、修改配置文件复制配置文件cp conf/zoo_sample.cfg conf/zoo.cfg

2021-06-05 10:10:47 7368 3

原创 框架 - Mybatis 源码一步步深入(三)

上一章我们大概了解了SqlSessionFactoryBuilder和Configuration两个类。这一章我们主要了解XMLConfigBuilder类,它是Mybatis配置文件解析入口。

2021-06-05 10:09:24 174 1

原创 框架 - Mybatis 源码一步步深入(二)

上一章我们大概了解了MyBatis初始化过程,本章主要了解SqlSessionFactoryBuilder、Configuration,它是构建SqlSessionFactory的主要工具,所有MyBatis配置信息都可以在Configuration中找到,SqlSessionFactoryBuilder的主要作用作用就是构建Configuration,然后使用Configuration构建SqlSessionFactory。

2021-06-05 10:08:56 322 1

原创 框架 - MyBatis源码一步步深入(一)

你了解MyBatis多少?了解SqlSessionFactory构建过程吗?了解XML解析过程吗?了解Mapper代理都干了什么事儿吗?本章以MyBatis 3.5.3带你一起阅读源代码,让你不在局限于会用,而是领会MyBatis的精髓。

2021-06-05 09:33:49 395 1

原创 最快搞懂JAVA动态代理的方法

在JAVA中,代理模式应用非常广泛,在很多框架中或平时业务中都经常使用,动态代理其实没什么神秘的,只要搞懂静态代理,在深入思考下,动态代理马上就能搞明白。

2021-06-04 11:03:08 188 1

原创 特殊场景你少不了使用IdentityHashMap

如果有一个实体类重写了hashCode方法,并且hashCode返回一个固定值,而且需要使用这个实体最为键,我们该怎么办呢?HashMap铁定是没法使用了,因为HashMap使用键hashCode高低位混合对数组长度取余定位位置,使用HashMap的结果就是无论put多少个该实体对象,实际只存了一个键值对。其实JDK中提供了一个Map专门来解决类似这样的问题,对就是IdentityHashMap,再看IdentityHashMap源码时先要搞清楚,它的key和value是在同一个数组里面的,table[i]

2021-06-04 11:00:12 950

原创 了解多线程前还是先了解一下Unsafe内存操作不安全类

Java是面向对象语言,在使用Java编程时,大多数情况下都不会直接操作内存,而且Java也不提倡直接操作内存,但是Java中到底有没有可以直接操作内存的工具类呢?有!Java中提供Unsafe类可以用来来直接操作内存。

2021-06-04 10:58:38 218

原创 AtomicInteger 深入讲解

JDK的atomic包中提供了一些简单原子操作类,基本上都是基于volatile+CAS封装,既保证了性能又保证了线程安全。例如平时经常用到的i++多线程场景就可以用AtomicInteger去解决,有ABA强需求的需要谨慎使用,后面会单独写一篇。

2021-06-04 10:57:19 364 1

原创 忽悠面试官还有哪种Map比WeakHashMap更好

WeakHashMap的键是弱键。在 WeakHashMap 中,当某个键不再正常使用时,会被从WeakHashMap中被自动移除。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。某个键被终止时,它对应的键值对也就从映射中有效地移除了。

2021-06-04 10:55:42 241

原创 经常使用的PriorityQueue优先级队列你真的了解它吗?

PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法,每次出队的元素都是优先级最高的元素。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。

2021-06-04 10:53:30 87

原创 再也不怕面试官问DelayQueue延时队列了

DelayQueue 是JDK中提供的延时队列,内部封装优先级队列,并且提供空阻塞功能。DelayQueue中所有元素必须实现Delayed接口getDelay方法,此方法返回剩余有效时间。

2021-06-04 10:52:13 139

原创 TreeMap源码深究

TreeMap集合是基于红黑树(Red-Black tree)的 NavigableMap实现。该集合最重要的特点就是可排序,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序。Tree两张实现排序方法,一种方式是实现java.lang.Comparable接口,并实现其compareTo()方法。第二种方式是单独写一个类去实现java.util.Comparator接口,并实现compare()方法,然后创建实例并作为TreeMap的构造方法参数进行传参

2021-06-04 10:51:25 127

原创 ConcurrentLinkedQueue 线程安全链表队列

ConcurrentLinkedQueue 是线程安全的非阻塞队列,内部是单向链表。ConcurrentLinkedQueue 使用CAS机制保证线程安全,而LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多。需要注意的是ConcurrentLinkedQueue 的头节点和尾节点都具有滞后性,直接读取不应当准确,不能直接使用,一般需要遍历。

2021-06-04 10:50:54 1383

原创 HashTable 看这一篇就够了

Hashtable和HashMap一样也是散列表,存储元素也是键值对,Hashtable继承于Dictionary类(Dictionary类声明了操作键值对的接口方法),实现Map接口(定义键值对接口),Hashtable大部分类用synchronized修饰,证明Hashtable是线程安全的

2021-06-04 10:48:23 300

原创 ArrayDeque 双向数组队列

优先级队列只支持从一段取数据,内部结构是数组,但是必须符合二叉堆,每次取数据都会伴随上移下移,如果我们元素不不需要排序,有没有更好的队列呢?ArrayDeque 就能满足这个需要,并且它可以在两端方数据和取数据,内部也是用数组实现。

2021-06-03 09:37:10 231

原创 ConcurrentLinkedDeque非阻塞双向队列

ConcurrentLinkedDeque是线程安全的非阻塞队列,内部结构跟LinkedBlockingQueue一样使用双向链表,最大的区别就是LinkedBlockingDeque使用CSA原则操作,没有用lock。使用它的时候一样需要注意,头节点和尾节点不保证一定是头和尾。

2021-06-03 09:34:56 724

原创 你用过PriorityBlockingQueue 优先级阻塞队列吗?

PriorityBlockingQueue 是优先级阻塞队列,虽然我们称它为无界,实际上它也是有界的。它跟PriorityQueue 最大的区别在于他是线程安全的,在入队出队时使用同一把锁,在扩容时先解锁,再使用cas原子操作,再重新获取锁。

2021-06-03 09:34:06 481

原创 LinkedBlockingDeque阻塞双向链表队列

LinkedBlockingDeque 是阻塞双向链表队列,它是线程安全的,除了提供两端读写操作外,还具有阻塞功能。内部使用一把锁,在读写操作前必须获取锁,并且每次都是锁整个链表。

2021-06-03 09:30:57 606

原创 聊聊LinkedBlockingQueue链表阻塞队列

LinkedBlockingQueue 是一个基于链表的有限队列(理论上它是无限的)。只支持一段入队,另一端出队。无阻塞对应LindedList,它们除了一个线程安全一个线程不安全以外,最大的区别是LinkedList可以放null值。

2021-06-03 09:29:02 652

原创 为什么你说的AQS,面试官总不满意,看完这篇就明白了

AQS听起来很高大上的样子,实际上它就是AbstractQueuedSynchronizer类的缩写,它是构建锁或者其他同步组件的基础框架。在基于AQS构建的同步器中,只能在一个时刻发生阻塞,从而降低上下文切换的开销,提高了吞吐量。同时在设计AQS时充分考虑了可伸缩行,因此J.U.C中所有基于AQS构建的同步器均可以获得这个优势。

2021-06-03 09:26:47 139 1

原创 又被问到ArrayBlockingQueue?

ArrayBlockingQueue是一个由数组结构组成的有界队列。此队列按照先进先出的顺序进行排序。支持公平锁和非公平锁,默认非公平锁。

2021-06-03 09:25:15 225

原创 深究SynchronousQueue 线程通信阻塞队列

SynchronousQueue 没有长度,每一个入队操作必须对应一个出队操作,或者每一个出队操作必须对应一个入栈操作,否则阻塞。SynchronousQueue内部提供两种模式TransferStack非公平模式(LIFO)和TransferQueue公平模式(FIFO)。

2021-06-03 09:23:16 301

原创 ConcurrentHashMap你到底了解多少?

ConcurrentHashMap是一个经常被使用的数据结构,它在线程安全的基础上提供了更好的写并发能力。ConcurrentHashMap跟Map有很大的不同,内部大量使用volatile和CAS等减少锁竞争,当然代码也比HashMap难理解的多,本章基于JDK1.8对ConcurrentHashMap做基本介绍,后续章节一步步深入。

2021-06-03 09:20:06 208

原创 LinkedTransferQueue 高效阻塞无界链表队列

LinkedTransferQueue 是一个高效阻塞无界链表队列。和SynchronousQueue.TransferQueue(公平模式)相比,它是可以统计长度,可以进行查询的;和LinkedBlockingQueue相比,它拥有更高的性能(使用CAS自旋);和ConcurrentLinkedQueue相比,它拥有阻塞功能。

2021-06-03 09:16:59 542

原创 面试官问:分布式理论你了解吗

用了这么久分布式从来没有总结过分布式理论,抽空总结一下。本篇从实际项目应用出发,从两个方面阐述分布式理论,第一个方面分布式解决什么问题,第二方面分布式带来什么问题。

2021-06-02 20:01:50 638 1

原创 Redisson 分布式锁超简封装

Redisson是一个在Redis的基础上实现的Java驻内存数据网格。它几乎提供了Redis所有工具,不仅封装Redis底层数据结构,而且还提供了很多Java类型映射。Redisson支持redis单实例、redis哨兵、redis cluster、redis master-slave等各种部署架构。Redisson 虽然功能强大但是它依然不能解决分布式锁有可能锁不住的情况,这不是Redisson或者Redis的问题(目前遇到这种问题只能人工干预)。

2021-06-02 14:44:04 713 1

原创 java实现滑动验证码

准备工作1、若干原图片(下文称为原图)2、一张抠图形状图片(下文称为滑块模板,抠出来的图称为滑块)3、一张抠图边框图片(下文称为滑块边框)注意:滑块模板尺寸必须小于原图尺寸实现思路1、后端 - 在若干原图中随机一张原图2、后端 - 根据滑块模板随机在原图中随机一个矩形区域,并且得到区域x、y坐标,注意随机区域不要超过原图边界3、后端 - 根据滑块模板在原图上抠图(原理:滑块模板中...

2021-06-02 14:43:16 3043 5

原创 分布式- BFT拜占庭容错

BFT拜占庭容错不是指一种算法,而是解决拜占庭将军问题的一类算法。分布式一直性算法选择最简单的BFT拜占庭容错,作为一致性算法入门一定能事半功倍。在分布式(一)中我们了解了一些基本理论,我们知道在有分区存在的情况下不能能出现完美的可用性和数据一致性,我们在项目中必须要最大限度做到分布式一致性,同时又要保证系统性能,所以必须了解分布式一致性算法。

2021-06-02 14:42:02 726

原创 面试官问:如何基于RabbitMQ的可靠消息解决分布式事务

1、消息驱动可以干什么答:可用于异步事务,分布式服务调用等2、消息驱动需要注意的是什么答:兼容生成者本地事务,事务检查,消息发送失败自动补偿,消费者业务方免幂等操作,免事务操作3、本消息驱动缺点是什么答:违反设计模式中最少知道原则,并且有表侵入问题,消息表必须跟业务表在一起,正在努力改进中设计概要:基于AP原则,只保证最终一致性,整体思想基于经典MQ事务处理,其中发送、接收消息表...

2021-06-02 14:39:44 383 4

原创 面试官问:分布式事务要怎么解决?

这里的分布式指的是基于服务的柔性事务,柔性事务必须满足4大项:1、可查询操作:服务操作具有全局唯一的标识,操作唯一的确定的时间。2、幂等操作:重复调用多次产生的业务结果与调用一次产生的结果相同。一是通过业务操作实现幂等性,二是系统缓存所有请求与处理的结果,最后是检测到重复请求之后,自动返回之前的处理结果。3、TCC操作:Try阶段,尝试执行业务,完成所有业务的检查,实现一致性;预留必须的业务资源,实现准隔离性。Confirm阶段:真正的去执行业务,不做任何检查,仅适用Try阶段预留的业务资源,Conf

2021-06-02 13:49:44 230

原创 面试官问:除了ArrayList你还看过哪些List源码

LinkedList是特殊List,为什么说它特殊?从类图上就可以看出来,它是List、Queue(Deque继承Queue)的实现,相比ArrayList多实现了Deque接口而少实现了RandomAccess接口,从名字就可以看除内部使用链表结构;Vector 向量是线程安全的动态数组,跟ArrayList很相似,JDK1.0中添加Vector类,Vector一样可以维护插入顺序,但Vector包含了许多传统的方法,这些方法不属于集合框架;Stack栈是一种只能在一端进行插入或删除操作的线性表,先进后出

2020-06-16 22:58:26 558

原创 面试官问:你熟悉哪些HashMap的封装扩展类?

LinkedHashMap、HashSet、LinkedHashSet都扩展了HashMap。它们是HashMap的二次封装,LinkedHashMap加入了一个单独链表存所有数据,并且完整保留HashMap结构。 HashSet 实际上只用到了HashMap的键,值为常量;LinkedHashSet 继承HashSet,并且和LinkedHashMap一样内部维护一个链表。

2020-06-16 22:05:47 2865

原创 为什么面试官说你看了一个假的HashMap

HashMap的主干是一个Entry数组,Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对,这谁都知道,甚至我们都知道HashMap的put过程和扩容过程,但是我们在面试时,都说对了为啥面试官还是不满意呢?因为这些都是一个程序员最起码应该知道的,面试官在意的是你是否真的明白HashMap核心思想以及内部算法。

2020-06-14 22:26:05 661

原创 看完这一篇再也不怕面试官问ArrayList了

ArrayList是一个动态数组,它不是线程安全的。ArrayList几乎拥有数组所有优点,例如元素有序,索引访问等;并且一般情况下它还不会越界,添加元素时它能动态扩容。平时工作中ArrayList被我们广泛应用,本章详细介绍ArrayList原代码。

2020-06-14 16:23:57 984

原创 我是怎么跟面试官聊Map集合的

Map是我们常用集合之一,它用于保存具有映射关系的数据。Map集合中的每一个元素都是由键值对构成。Map中所有的键不能重复,但是值可以重复。本章主要针对Map 框架和源码做讲解,并且整理了部分Map常见面试题一起分享。

2020-06-14 13:05:49 2407

原创 我是怎么跟面试官聊Collection线性集合的

数据结构是带有结构特性的数据元素的集合。在应用程序中,提炼出常用集合,并对其定义相应的算法或抽象并封装。简单地说数据结构是以某种特定的布局方式存储数据的容器。JDK已经提供了很多常用集合,在开发过程中我们可以根据业务很方便的创建集合对象。那么了解这些集合就非常有必要了。

2020-06-07 20:29:32 944

原创 聊聊你不知道的Java变量转型

Java变量分为类变量、实例变量、局部变量。在Java语言中,所有的变量在使用前必须声明。定义变量就是要告诉编译器这个变量的数据类型,这样编译器才知道需要分配多少空间给它,以及它能存放什么样的数据。在程序运行过程中空间的值是变化的,这个内存空间就成为变量。为了便于操作,给这个变量取个名字,称为变量名。

2020-06-05 17:28:45 7605 1

原创 老司机带你入门Java基础概念

Java是一门面向对象编程语言,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。Java语言不使用指针,而是引用,Java语言具有功能强大并且简单易用,Java自带内存回收器GC,使得程序员不必为内存管理而担忧。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

2020-06-04 14:57:24 11472 4

spring-framework-master-5.2.5.zip

spring源码分析参照git仓库代码,master分支代码,2020-4-07拉取,有需要的可以下载

2020-04-14

javaJDK配置.txt

关于jdk环境变量的设置问题给你一个文档,在xp和win7上面都可以用的,介绍了一些jdk的配置,为新手提供帮助

2011-07-08

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除