自定义博客皮肤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后端技术分享!

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

原创 代理模式-MySql代理

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

2020-12-29 21:33:04 1640

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

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

2020-12-29 21:32:52 685 1

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

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

2020-12-29 21:32:35 455

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

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

2020-12-29 21:32:17 737

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

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

2020-12-29 21:31:59 1741 2

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

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

2020-12-29 21:31:34 2363

原创 设计模式六大原则

文章目录单一职责里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则单一职责应该有且仅有一个原因引起类的变更。例如,设计一个视频播放系统,要求:如果是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 801

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

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

2020-12-08 23:23:06 1491

原创 FutureTask源码导读

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

2020-12-08 23:22:06 264

原创 CountDownLatch源码导读

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

2020-12-08 22:15:57 301

原创 CyclicBarrier源码导读

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

2020-12-08 19:43:33 233

原创 Semaphore源码导读

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

2020-12-07 21:03:44 245

原创 LongAdder源码导读

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

2020-12-06 15:05:02 244

原创 AtomicLong源码导读

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

2020-12-06 12:51:02 593 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 310

原创 LinkedList源码导读

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

2020-12-04 21:53:12 340

原创 ArrayList源码导读

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

2020-12-04 21:05:58 635

原创 RandomAccess接口有什么用?

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

2020-12-03 20:58:03 289

HashMap.java

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

2019-12-27

空空如也

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

TA关注的人

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