自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序员小潘

专注于Java后端技术分享!

  • 博客(163)
  • 资源 (1)
  • 收藏
  • 关注

原创 23种设计模式及应用场景

设计模式六大原则创建型模式工厂方法模式-日志工厂抽象工厂模式-多平台软件设计单例模式-序列号生成器建造者模式-万能的乐高原型模式-广告邮件推送结构型模式适配器模式-日志适配器桥接模式-支付功能的扩展组合模式-系统菜单的设计装饰者模式-包装线程不安全的类外观模式-简化复杂子系统的访问享元模式-内存溢出,谁的锅?代理模式-MySql代理行为型模式访问者模式-个性化报表模板方法模式-缓存淘汰策略有哪些?策略模式-记录日志的N种方式状态模式-状态决定行为观察者模式-买家支付完

2021-01-14 22:00:26 54 1

原创 JDK中那些不得不读的源码

ArrayList源码导读。LinkedList源码导读。JDK7-HashMap源码解析。ThreadLocal源码解析。AQS源码导读。

2020-12-08 23:23:06 57

原创 AQS源码导读

我想挑战一下我的软肋:AQS源码导读。

2020-11-20 20:51:25 8486 4

原创 CMS与三色标记算法

文章目录CMS收集器CMS的缺点三色标记算法漏标错标原始快照和增量更新写屏障尾巴CMS(Concurrent Mark Sweep)是一款里程碑式的垃圾收集器,为什么这么说呢?因为在它之前,GC线程和用户线程是无法同时工作的,即使是Parallel Scavenge,也不过是GC时开启多个线程并行回收而已,GC的整个过程依然要暂停用户线程,即Stop The World。这带来的后果就是Java程序运行一段时间就会卡顿一会,降低应用的响应速度,这对于运行在服务端的程序是不能被接收的。GC时为什么要暂停

2020-11-08 16:37:56 7748 1

原创 摊牌了,我要手写一个RPC

文章目录前言需要解决的问题手写RPC实战1、定义通信协议2、自定义注解3、定义接口4、实现接口5、暴露服务并监听处理请求6、生成RPC动态代理对象7、消费者注入RPC动态代理对象功能测试尾巴前言RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。随着微服务、分布式的大热,开发者慢慢趋向于将一个大的服务拆分

2020-10-18 11:50:42 17926 15

原创 Java锁的膨胀过程以及一致性哈希对锁膨胀的影响

1、锁优化在JDK6之前,通过synchronized来实现同步效率是很低的,被synchronized包裹的代码块经过javac编译后,会在代码块前后加上monitorenter和monitorexit字节码指令,被synchronized修饰的方法则会被加上ACC_SYNCHRONIZED标识,不论是在字节码中如何表示,作用和功能都是一样的,线程要想执行同步代码块或同步方法,首先需要竞争锁。...

2020-02-25 21:53:59 12711 2

原创 桥接模式-支付功能的扩展

将抽象和实现解耦,使得两者可以独立地变化。

2021-01-14 21:45:47 103

原创 享元模式-内存溢出,谁的锅?

使用共享对象可有效地支持大量的细粒度的对象。

2021-01-13 22:00:40 18

原创 解释器模式-破解算术验证码

给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

2021-01-12 22:33:33 11

原创 状态模式-状态决定行为

当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。

2021-01-11 21:05:03 22

原创 访问者模式-个性化报表

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

2021-01-10 20:26:46 18

原创 备忘录模式-程序数据的“后悔药”

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2021-01-10 20:26:35 19

原创 外观模式-简化复杂子系统的访问

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

2021-01-10 20:26:24 12

原创 观察者模式-买家支付完成后的N个通知

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

2021-01-09 16:27:02 21

原创 组合模式-系统菜单的设计

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

2021-01-09 16:26:49 22

原创 迭代器模式-遍历容器的统一方式

它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。

2021-01-08 22:18:10 9

原创 适配器模式-日志适配器

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

2021-01-08 21:02:36 15

原创 策略模式-记录日志的N种方式

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

2021-01-08 20:03:21 26

原创 装饰者模式-包装线程不安全的类

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

2021-01-08 07:38:46 34

原创 责任链模式-谁来处理请求?

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

2021-01-08 07:35:27 64

原创 命令模式-文章发布背后的秘密

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

2021-01-08 07:35:03 26

原创 中介者模式-进销存管理

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

2021-01-08 07:34:45 26

原创 原型模式-广告邮件推送

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2021-01-08 07:34:21 29

原创 代理模式-MySql代理

为其他对象提供一种代理以控制对这个对象的访问。

2020-12-29 21:33:04 24

原创 建造者模式-万能的乐高

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2020-12-29 21:32:52 27

原创 模板方法模式-缓存淘汰策略有哪些?

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2020-12-29 21:32:35 21

原创 抽象工厂模式-多平台软件设计

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

2020-12-29 21:32:17 24

原创 工厂方法模式-日志工厂

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

2020-12-29 21:31:59 31

原创 单例模式-序列号生成器

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2020-12-29 21:31:34 86

原创 设计模式六大原则

文章目录单一职责里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则单一职责应该有且仅有一个原因引起类的变更。例如,设计一个视频播放系统,要求:如果是VIP用户就播放完整影片,否则只允许试看5分钟。class VideoService { public void play(Long videoId, Long userId) { if (haveAuth(userId)) { System.out.println("播放完整影片..."); }else { System.o

2020-12-23 22:45:20 45

原创 FutureTask源码导读

FutureTask是在JDK1.5被引入的,又是并发大神`Doug Lea`的杰作。它代表的是一个异步计算任务,它将在未来的某个时刻完成计算并获得一个计算结果。当线程调用`get()`去获取结果时,如果计算完毕,则立马返回,否则线程会被阻塞,直到计算完成。

2020-12-08 23:22:06 16

原创 CountDownLatch源码导读

CountDownLatch是在JDK1.5被引入的,又是并发大神`Doug Lea`的杰作。它的作用是让一组线程在等待其他N个线程到达一个统一的状态时再继续执行。

2020-12-08 22:15:57 28

原创 CyclicBarrier源码导读

CyclicBarrier也被称为“栅栏”、“屏障”,从名字就看的出来,它是可以被循环使用的。CyclicBarrier的作用是当一组线程全部都到达一个状态时,再全部同时执行。

2020-12-08 19:43:33 22

原创 Semaphore源码导读

Semaphore,又称“信号量”,它的作用是对资源同一时间允许访问的线程数量做限制的,通常被用来做【限流】。

2020-12-07 21:03:44 28

原创 LongAdder源码导读

前言JDK8提供了一个性能更好的长整型原子类:java.util.concurrent.atomic.LongAdder。在高并发下,它有着比AtomicLong更好的性能,代价是会消耗更多的内存空间。有了AtomicLong,为啥还要引入LongAdder?AtomicLong是通过volatile+CAS的方式来保证并发安全的,它只有一个value值,所有的线程都对这一个value值操作,也就意味着这个value是热点数据。随着并发量越来越高,CAS操作失败的概率也会越来越大,会有越来越多的线程

2020-12-06 15:05:02 17

原创 AtomicLong源码导读

AtomicLong是JDK5开始提供的,它的作用是:对长整型进行原子操作。类似的原子类还有:AtomicBoolean、AtomicInteger等,它们的实现原理都是一样的。在原子类出现之前,要想让一个long类型的数值完成自增操作保持原子性,那么只能通过加synchronized或者显式锁,这种解决方式不仅会让代码编写更加复杂,而且效率也不高。原子类的出现,提供了另一种解决思路来保证操作的原子性,那就是:CAS,关于CAS的详细说明可以看笔者的另一篇文章:《关于CAS的一点理解和思考》。对变量加

2020-12-06 12:51:02 33 1

原创 ReentrantLock源码导读

ReentrantLock是JDK5开始提供的Java实现的显式锁,它是一个可重入锁,依赖于AQS实现。它使用AQS的state变量作为锁的重入次数,每lock()一次state就自增1,每unlock()一次state就自减1,当state减至0时,就代表锁释放了。当锁释放后,AQS会调用unparkSuccessor()去唤醒队列中的后继节点去竞争锁,锁竞争失败的线程AQS会创建一个和线程绑定的Node节点,入队并Park挂起线程。线程同步的细节在AQS类中就已经实现,ReentrantLock只需

2020-12-04 23:10:27 47

原创 LinkedList源码导读

LinkedList底层是一个双向链表的数据结构,它的插入和删除非常的快速,只需要修改对应节点的`next`和`prev`的指向即可,不像ArrayList需要大量的移动元素的位置。

2020-12-04 21:53:12 32

原创 ArrayList源码导读

ArrayList底层是基于数组来实现的,相较于数组,它支持动态的扩容,元素的插入和删除变得很方便。相较于LinkedList,它支持快速随机访问,通过下标可以快速定位到元素,访问速度非常快。

2020-12-04 21:05:58 35

原创 RandomAccess接口有什么用?

最近在看ArrayList源码,发现ArrayList实现了一个很特别的接口:java.util.RandomAccess。这个接口没有任何东西,和java.lang.Cloneable、java.io.Serializable一样,只是一个标记接口,它的作用是什么呢?注释里写的是,这是一个标记接口,表明实现了这个接口的类是支持快速随机访问的。什么意思呢?就是说实现了这个接口的集合,代表它支持通过下标来快速访问元素,例如ArrayList。像LinkedList就没有实现这个接口,因为Linked

2020-12-03 20:58:03 34

HashMap.java

JDK7的HashMap源码阅读,几乎给每个方法和属性都加上了中文注释。 可以帮助大家更好的阅读源码,可能有理解不对的地方,望指正。

2019-12-27

空空如也

空空如也

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

TA关注的人 TA的粉丝

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