- 博客(23)
- 收藏
- 关注

原创 HashMap 源码分析
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) //table数组为空,需要调用r...
2021-05-24 15:15:04
424
6

原创 RabbitMQ消息可靠性投递及分布式事务最终一致性实现
RabbitMQ消息可靠性投递就是保证消息生产者能够将消息百分百投递到RabbitMQ服务器,并在传递过程中不丢失。然而在生产环境中由于网络中断、网络不稳定等原因导致消息在投递过程中丢失,这或许会造成极大的损失。消息投递过程:处理任务A成功但由于网络原因消息在投递过程中丢在,会造成我们系统的不一致,以转账为例A银行某用户向B银行某用户转账,A系统用户扣款成功,发送消息给B系统给用户账号...
2019-08-01 22:18:49
2139
1
原创 FutureTask源码分析
Thread类的run方法返回值类型是void,因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。在实例化FutureTask时构造函数传入了实现Callable接口的实例。而在实例化Thread类时,构造函数传入FutureTask实例。因此,我们可以猜测线程在执行run方法时必定会调用call方法,并且保存call方法返回的结果。
2024-09-18 23:26:24
935
原创 Condition源码分析
线程因wait阻塞,可以通过notify唤醒一个线程,但唤醒哪一个线程存在不确定性,也可以通过notifyAll唤醒所有的线程,总之无法做到精准的控制。5.1 线程被中断,进一步检查是否收到signal信号,没有则,将节点加入到同步队列中,此时interruptMode=THROW_IE=-1,有则等待signal的线程将节点加入到同步队列,此时interruptMode=REINTERRUPT=1。为何便于区分,我们将Condition中的队列称为条件等待队列,AQS中的队列称为同步队列。
2024-05-22 17:09:44
869
原创 ReentrantReadWriteLock源码分析
ReentrantReadWriteLock是基于AQS实现的读写锁,读锁与读锁不互斥、读锁与写锁互斥、写锁与写锁互斥。AQS提供了共享和排它两种模式,acquire/release、acquireShared/releaseShared 是AQS里面的两对模板方法。写锁是基于acquire/release模板方法实现的,读锁是基于acquireShared/releaseShared这对模板方法实现的。WriteLockacquire public final void acqu...
2024-05-08 23:54:59
366
1
原创 GenericServlet中的设计模式
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable { private transient ServletConfig config; 略。。。 public void init(ServletConfig config) throws ServletException { this.config = config; .
2022-01-24 18:19:01
297
原创 ArrayList源码分析
ArrayList 类结构如下ArrayList继承AbstractList,实现了list,RandomAccess,Cloneable,Serializable,支持随机访问、克隆和序列化。RandomAccess是一个标记接口,表示支持随机访问,ArrayList底层是用数组实现了,数组可以通过index随机访问元素。Jdk中Collections类有binarySearch方法,查询List集合中某个元素的索引值。如果集合实现了RandomAccess接口,就支持采用二分查找,否则使..
2021-05-24 17:59:13
212
原创 ReentrantLock源码分析
ReentrantLock是Concurrent包提供的一种可重入锁。可重入锁是指当一个线程获取锁进入互斥区后可以再次拿到该锁,而不需要释放之前获取的锁。通常锁都需要设计成可重入的,否则很容易发生死锁。ReentrantLock 是基于AQS来实现的,AQS也叫抽象同步队列器,是Concurrent包提供的一种实现同步队列的框架。AQS类结构如下:AbstractOwnableSynchronizer 是一个抽象类,只有一个成员变量exclusiveOwnerThread,表示持有锁的对象.
2021-05-07 15:48:51
196
1
原创 Redis 持久化
Redis 持久化分为AOF持久化和RDF持久化AOF 全称 Append Only File,这种方式会将服务器执行的所有写操作命令单独保存在日志文件中。在服务器启动时,通过加载并执行日志文件中的命令来恢复数据。这个日志文件就叫做AOF文件。在默认情况下,AOF持久化并没有被开启,需要配置redis.conf文件中的appendonly.aof yes 来开启。AOF持久化实现当开启AOF持久化后,服务器每执行一条命令,这条命令都会被追加到缓冲区aof_buf。Redis 服务器进程是..
2021-05-06 09:20:14
159
原创 java.io.BufferedInputStream 源码分析
BufferedInputStream 是带有缓存区的输入字节流,使用byte[ ] 数组来进行缓存。当需要从外界读入数据到内存中时,先一次性读取多个字节的数据存放到byte[ ] 数组当中。之后对数据的存取都是操作byte[ ] 数组这个缓存区,从而提高了性能。BufferedInputStream类结构如下所示:在java的io模块中经常看到装饰器模式的身影,FilterInputStream 利用装饰器模式将InputStream 封装成类的成员变量class FilterInpu.
2021-04-02 10:11:07
353
原创 UncaughtExceptionHandler 获取线程运行时异常
我们知道线程执行体的方法接口定义为:public void run(),因此线程在执行单元中是不允许抛出checked异常的,且线程之间是相对独立的,他们运行在自己的上下文当中,派生它的线程无法直接感知到它在运行时出现的异常信息。为了解决这个问题,java提供了UncaughtExceptionHandler接口,当线程在运行时发生异常时,会回调这个接口,从而得知哪个线程在运行时出错。Unca...
2020-04-14 16:26:01
794
原创 JPA 多表动态查询
示例一:@PersistenceContextEntityManager entityManager; public List<Map<String, Object>> getStudentInfo(String idOrName,Integer province,Integer city,Integer area) { StringBui...
2020-03-01 16:55:27
461
原创 解决layui数据表格显示图片不完整
<table class="layui-table" id="activityTable" lay-data="{height:315, url:'activity/list',response:{statusName:'status',statusCode:'1',msgName:'msg'},done:function(res,curr,count){$('.layui-table-c...
2020-01-20 15:48:24
2056
原创 layui iframe子页面重载父级页面数据表格
场景:数据表格页面(页面1),点击添加数据按钮,弹出子页面form表单(页面2),提交数据成功后,(页面2)再弹出confirm弹出层,关闭弹出层以及页面2并重载页面1的数据表格form.on("submit(studentAdd)",function (data) { var formData = data.field $.ajax({ url:"/a...
2020-01-20 15:41:44
2359
原创 layui 父页面传递数据给iframe子页面
table.on("tool(demoTable)",function (obj) { var data = obj.data; if (obj.event=="edit"){ layer.open({ type: 2, area: ['380px', '400px'], fix: false...
2020-01-20 15:26:31
3633
2
原创 桥接模式,NAT模式,仅主机模式区别
1、桥接模式 在桥接模式下,虚拟机与主机之间是同等地位的,就相当于在同一个局域网下添加了一台独立的主机,虚拟机和主机ip地址需要在同一个网段,并且虚拟机要占据局域网中的一个ip地址。此时,不管是虚拟机和虚拟机之间还是虚拟机和其他真实主机之间,只要处于同一个网段,他们之间都可以进行相互通信。2、NAT模式 在桥接模式下,虚拟机可以通过宿主机访问网络,无需进行额外配置...
2019-11-25 18:38:32
2368
原创 事务处理
一、基本概念事务是由一组sql语句构成的,它由一个用户输入,并以修改成持久的或者回滚到原来状态而终结。简单来说就是由一个或多个sql语句组成一个事务,在这个事务中,sql语句要么全部执行成功,要么全部失败,并回滚到原来的状态。二、ACID原则事务必须遵从原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)原则。...
2019-06-14 17:35:31
546
原创 spring中bean的生命周期
在spring 框架中 Spring Ioc容器对bean进行管理,负责bean的整个生命周期。具体的过程如下图所示:参考文献:https://www.cnblogs.com/kenshinobiy/p/4652008.html1、实例化bean2、属性注入3、BeanNameAware的setBeanName(String beanName)实现了BeanNameAwar...
2019-05-30 11:56:34
271
原创 left join 和 right join的区别
这里拿学生表和班级表举例:学生表:班级表SELECT * FROM `student`s LEFT JOIN `class` c on s.id = c.uid通常以join关键字来区别左右SELECT * FROM `student`s LEFT JOIN `class` c on s.id = c.uidstudent 表就是左表,class就是右表,左连接...
2018-11-08 14:31:09
4011
原创 spring boot整合UEditor,不改源码,真实有效
UEditor以前在php项目中使用过,是一款非常强大的富文本编辑器,内部实现了各种上传功能,我们甚至不用写任何代码,只需要在所需的项目中正确引入ueditor即可。最近在学习java spring boot框架,项目中也选择这款编辑器。但是配置却出现了很多问题,是我没有想到的。因为用thinkphp5来引用时基本不需要任何配置,引入几个js文件就行了。然而在spring boot 中却没有那...
2018-10-23 17:50:23
5891
64
原创 thinkphp5微信公众号支付
实习期间,参与了微信公众号开发,接触到了微信公众号支付,在开发过程中踩了不少的坑,好在顺利完成了任务,在这里,我觉得有必要和大家分享一下,也便于自己以后参考。一、场景介绍用户通过微信公众号打开网页, 进入到如下界面,选择或输入相应金额为网站中用户账号充值。二、开发步骤这里就不再介绍商户如何接入微信支付,官方文档中已经有了详细介绍,具体请参考微信公众号支付官方文档。直接上业...
2018-07-17 16:34:42
5205
2
原创 thinkphp5留言板
一、项目目的 为了提高新手对mvc模式的认识、加深thinkphp5知识的掌握程度,本文通过留言板示例进行展示。二、项目需求 用户注册、登录 发表留言 删除本人留言 查看留言三、数据表设计 分析项目需求,一个用户可以有多条留言,发现需要用户表和留言表两张表即可,需求中包含了用户注册、登录,所以用户表需要有账号、密码字段。发表留言...
2018-03-14 18:38:11
7350
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人