自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(232)
  • 收藏
  • 关注

原创 2、list操作

【代码】2、list操作。

2024-07-31 13:48:26 94

原创 1、使用责任链+ Builder模式优雅的校验参数

项目中参数校验十分重要,它可以保护我们应用程序的安全性和合法性。@Override这么做最大的优势就是简单直接,但是如果验证逻辑很复杂,比如excel导入数据每个字段值都需要校验,这会导致这个类变得很庞大,而且上面是通过抛出异常来改变代码执行流程,这也是一种不推荐的做法。那么有什么更好的参数校验的方式呢?本文就推荐一种通过责任链设计模式来优雅地实现参数的校验功能,我们通过一个用户注册的例子来讲明白如何实现。有效的注册数据——名字、姓氏、电子邮件、用户名和密码。用户名必须是唯一的。

2024-07-27 10:37:10 833

原创 56、volatile 的作用和适用场景,以及它与 synchronized 有什么异同

本课时我们主要介绍 volatile 的作用和适用场景,以及它与 synchronized 有什么异同。

2024-06-06 20:44:25 1382

原创 55、什么是 happens-before 关系

Happens-before 关系是用来描述和可见性相关问题的:如果第一个操作 happens-before 第二个操作(也可以描述为,第一个操作和第二个操作之间满足 happens-before 关系),那么我们就说第一个操作对于第二个操作一定是可见的,也就是第二个操作在执行时就一定能保证看见第一个操作执行的结果。以上就是我们对于 happens-before 关系的介绍。本课时首先介绍了什么是 happens-before 关系,然后举了一个不具备 happens-before 关系的例子;

2024-06-06 20:40:56 1037

原创 54、java中主内存和工作内存的关系是什么?

Java 作为高级语言,屏蔽了 L1 缓存、L2 缓存、L3 缓存,也就是多层缓存的这些底层细节,用 JMM 定义了一套读写数据的规范。我们不再需要关心 L1 缓存、L2 缓存、L3 缓存等多层缓存的问题,我们只需要关心 JMM 抽象出来的主内存和工作内存的概念。每个线程只能够直接接触到工作内存,无法直接操作主内存,而工作内存中所保存的正是主内存的共享变量的副本,主内存和工作内存之间的通信是由 JMM 控制的。

2024-06-06 20:37:44 718

原创 53、什么是“可见性”问题?

本课时我们主要讲解什么是“可见性”问题?

2024-06-06 20:33:12 950

原创 52、 Java 中的原子性和原子操作

在编程中,具备原子性的操作被称为原子操作。原子操作是指一系列的操作,要么全部发生,要么全部不发生,不会出现执行一半就终止的情况。比如转账行为就是一个原子操作,该过程包含扣除余额、银行系统生成转账记录、对方余额增加等一系列操作。虽然整个过程包含多个操作,但由于这一系列操作被合并成一个原子操作,所以它们要么全部执行成功,要么全部不执行,不会出现执行一半的情况。比如我的余额已经扣除,但是对方的余额却不增加,这种情况是不会出现的,所以说转账行为是具备原子性的。而具有原子性的原子操作,天然具备线程安全的特性。

2024-06-06 20:23:56 808

原创 51、java中什么是指令重排序?为什么要重排序?

假设我们写了一个 Java 程序,包含一系列的语句,我们会默认期望这些语句的实际运行顺序和写的代码顺序一致。但实际上,编译器、JVM 或者 CPU 都有可能出于优化等目的,对于实际指令执行的顺序进行调整,这就是重排序。重排序的好处:提高处理速度你可能感到很困惑,为什么要重排序?这样做有什么好处呢?我们来举一个具体的例子。图中左侧是 3 行 Java 代码,右侧是这 3 行代码可能被转化成的指令。

2024-06-05 21:04:29 342

原创 50、什么是 Java 内存模型?

以上就是本课时的内容了。本课时,我们先对 JVM 内存结构和 Java 内存模型这两个容易混淆的概念进行了辨析,然后从宏观层面讲解了什么是 Java 内存模型,接下来,我们的脚步从 Java 代码逐渐往下探索,解释了为什么需要 JMM 以及什么是 JMM。

2024-06-05 21:01:14 456

原创 49、ThreadLocal为什么会造成内存泄露?

内存泄漏指的是,当某一个对象不再有用的时候,占用的内存却不能被回收,这就叫作内存泄漏。因为通常情况下,如果一个对象不再有用,那么我们的垃圾回收器 GC,就应该把这部分内存给清理掉。这样的话,就可以让这部分内存后续重新分配到其他的地方去使用;否则,如果对象没有用,但一直不能被回收,这样的垃圾对象如果积累的越来越多,则会导致我们可用的内存越来越少,最后发生内存不够用的 OOM 错误。下面我们来分析一下,在 ThreadLocal 中这样的内存泄漏是如何发生的。

2024-05-07 09:52:06 928

原创 48、ThreadLocal内部原理是什么?

本课时我们主要分析一下在 Thread 中多个 ThreadLocal 是怎么存储的。

2024-05-06 20:14:06 958

原创 47、ThreadLocal 是不是用来解决共享资源的多线程访问的?

在本课时中,首先介绍了 ThreadLocal 是不是用来解决共享资源的多线程访问的问题的,答案是“不是”,因为对于 ThreadLocal 而言,每个线程中的资源并不共享;然后我们又介绍了 ThreadLocal 和 synchronized 的关系。

2024-05-06 19:01:54 521

原创 46、什么是ThreadLocal,有哪些实际生产应用的场景?

在这种情况下,每个 Thread 内都有自己的实例副本,且该副本只能由当前 Thread 访问到并使用,相当于每个线程内部的本地变量,这也是 ThreadLocal 命名的含义。因为每个线程独享副本,而不是公用的,所以不存在多线程间共享的问题。我们来做一个比喻,比如饭店要做一道菜,但是有 5 个厨师一起做,这样的话就很乱了,因为如果一个厨师已经放过盐了,假如其他厨师都不知道,于是就都各自放了一次盐,导致最后的菜很咸。这就好比多线程的情况,线程不安全。

2024-05-06 18:46:45 878

原创 45、如何选择适合自己的阻塞队列?

本课时我们主要讲解如何选择适合自己的阻塞队列。他山之石,可以攻玉。对于如何选择最合适的阻塞队列这个问题,实际上线程池已经率先给我们做了表率。线程池有很多种,不同种类的线程池会根据自己的特点,来选择适合自己的阻塞队列。所以我们就首先来复习一下这些非常经典的线程池是如何挑选阻塞队列的,借鉴它们的经验之后,我们再去总结一套规则,来归纳出自己在选取阻塞队列时可以对哪些点进行考虑。

2024-04-29 20:21:40 694

原创 44、阻塞和非阻塞队列的并发安全原理是什么?

最后我们来做一下总结。本课时我们分析了阻塞队列和非阻塞队列的并发安全原理,其中阻塞队列最主要是利用了 ReentrantLock 以及它的 Condition 来实现,而非阻塞队列则是利用 CAS 方法实现线程安全。

2024-04-29 20:16:03 730

原创 43、有哪几种常见的阻塞队列?

以上就是本课时的内容,我们对于 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue 以及 DelayQueue 这些常见的和常用的阻塞队列的特点进行了讲解。

2024-04-29 20:08:59 570

原创 42、阻塞队列包含哪些常用的方法?

在阻塞队列中有很多方法,而且它们都非常相似,所以非常有必要对这些类似的方法进行辨析,所以本课时会用分类的方式,把阻塞队列中常见的方法进行梳理和讲解。我们把 BlockingQueue 中最常用的和添加、删除相关的 8 个方法列出来,并且把它们分为三组,每组方法都和添加、移除元素相关。这三组方法由于功能很类似,所以比较容易混淆。抛出异常:add、remove、element返回结果但不抛出异常:offer、poll、peek阻塞:put、take。

2024-04-29 20:05:19 583

原创 41、什么是阻塞队列?

在本课时中我们主要讲解一下什么是阻塞队列。

2024-04-29 19:59:07 567

原创 24、java设计模式--自定义Spring框架

Spring 就是面向Bean的编程(BOP,Bean Oriented Programming),Bean 在 Spring 中处于核心地位。Bean对于Spring的意义就像Object对于OOP的意义一样,Spring中没有Bean也就没有Spring存在的意义。Spring IoC容器通过配置文件或者注解的方式来管理bean对象之间的依赖关系。spring中bean用于对一个类进行封装。如下面的配置:

2024-04-27 11:24:28 1145

原创 23、java设计模式--解释器模式

如上图,设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。//用于两个整数相加//用于两个整数相加//用于n个整数相加sum += i;return sum;上面的形式比较单一、有限,如果形式变化非常多,这就不符合要求,因为加法和减法运算,两个运算符与数值可以有无限种组合方式。比如 1+2+3+4+5、1+2+3-4等等。显然,现在需要一种翻译识别机器,能够解析由数字以及 + - 符号构成的合法的运算序列。

2024-04-27 11:14:00 962

原创 21、java设计模式--备忘录模式

又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

2024-04-27 11:07:57 733

原创 20、java设计模式--访问者模式

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

2024-04-27 11:04:09 567

原创 19、java设计模式--迭代器模式

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

2024-04-27 10:58:05 811

原创 18、java设计模式--中介者模式

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

2024-04-27 10:54:40 836

原创 17、java设计模式--观察者模式

又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

2024-04-27 10:51:50 787

原创 22、java设计模式--状态模式

【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。//电梯的4个状态//开门状态//关门状态//运行状态//停止状态//设置电梯的状态//电梯的动作@Override//执行关门动作@OverrideSystem.out.println("电梯关门了。。。");

2024-04-27 10:49:06 396

原创 16、java设计模式--命令模式

日常生活中,我们出去吃饭都会遇到下面的场景。​将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

2024-04-27 10:42:36 629

原创 15、java设计模式--享元模式

​ 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

2024-04-27 10:37:00 689

原创 14、java设计模式--组合模式

​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。

2024-04-27 10:29:40 945

原创 13、java设计模式--责任链模式

又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

2024-04-23 23:01:13 993

原创 12、java设计模式--策略模式

​ 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

2024-04-23 22:58:35 1050

原创 11、java设计模式--模板方法模式

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

2024-04-23 22:54:51 537

原创 10、java设计模式--桥接模式

​ 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

2024-04-23 22:43:12 752

原创 9、java设计模式--门面(外观)模式

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。​门面模式又名外观模式,⻔⾯模式提供了⼀个统⼀的接⼝,这个接⼝可以⽤来访问相同⼦系统或者不同⼦系统之中的⼀群接⼝,而使这些子系统更加容易被访问的模式。

2024-04-21 10:24:34 1099

原创 8、java设计模式--装饰者模式

装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),属于结构型模式。它是指在不改变原有对象的基础之上,允许向一个现有的对象添加新的功能,同时又不改变其结构,作为现有的类的一个包装。这种模式创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。提供了比继承更有单性的替代方案,进行扩展原有对象的功能。装饰器模式的核心是功能扩展。使用装饰器模式可以透明且动态地扩展类的功能。装饰器模式主要用于诱明且动态地扩展类的功能。

2024-04-21 09:42:03 843

原创 7、java设计模式--适配器模式

如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将220v转换为5v的电压),读卡器等,其实就是使用到了适配器模式。​ 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

2024-04-20 10:23:16 1023

原创 6、java设计模式--代理模式

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。

2024-04-20 09:54:58 818

原创 5、java设计模式--建造者模式

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。

2024-04-19 23:24:56 674

原创 4、java设计模式--原型模式

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

2024-04-19 23:10:58 813

原创 3、单例模式的7中实现方式及优缺点

双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。枚举类实现单例模式是极力推荐的单例实现模式,因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,枚举的写法非常简单,而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。instance对象是随着类的加载而创建的。

2024-04-19 22:15:38 932

空空如也

空空如也

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

TA关注的人

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