Java 基础
文章平均质量分 91
Java 基础
爱喝咖啡的程序员
这个作者很懒,什么都没留下…
展开
-
Java基础: CPU缓存行、无效化队列
Java基础: CPU缓存行、无效化队列一. 什么是缓存行?二. 什么是CUP的三级缓存?三. CPU核心、缓存行、消息总线、内存是如何交互的呢?四. 多核CPU更新数据时面临的脏数据问题五. 解决多核CPU更新时面临的脏数据问题(MESI)一. 什么是缓存行?答: 缓存行是CPU与内存之间的一块临时数据交换器,用于解决CPU运算速度与内存读写速度不匹配的矛盾。二. 什么是CUP的三级缓存?CPU的缓存被分成了三个级别: L1,L2,L3,其中,越接近CPU的缓存容量越小,但运行速度越接近CPU。原创 2021-06-25 23:33:42 · 1046 阅读 · 2 评论 -
JVM理论和实战知识-学习笔记
JVM-系统性学习一. JVM从编译到执行的粗略过程1.1 概念1.2 问题二. JVM的类加载机制到底是怎么样的?2.1 JVM一般在什么时候会去加载一个类?2.2 看看验证、准备和初始化的过程2.2.1 验证阶段2.2.2 准备阶段2.2.3 解析阶段2.2.4 初始化 (核心阶段)2.2.5 类加载器和双亲委派机制2.2.6 本章的问题蓝色为待补充的内容红色为需要突出的重点绿色为面试时可能遇到的问题一. JVM从编译到执行的粗略过程1.1 概念一旦你执行’java’命令,实际上此时就会启原创 2020-11-30 19:22:46 · 276 阅读 · 1 评论 -
Java基础: 手动创建线程池
使用ExecutorServices直接创建线程池的缺点:1. FixedThreadPool或者SingleThreadPool 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。2.CachedThreadPool 允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。生产环境的做法:1. 创建线程工厂,指定创建线程时的线程名称的命名规律ThreadFactory nameThr...原创 2020-08-17 12:02:16 · 1792 阅读 · 0 评论 -
为什么StringBuilder线程不安全,但StringBuffer线程安全?
StringBuilder和StringBuffer都继承了AbstractStringBuilder,AbstractStringBuilder内有两个非常重要的变量,分别是:// 用于存储字符的容器char[] value; // 已存储的字符数量int count; 注意,value没有加上final,也就是说,它是可变的,这点与String不同。StringBuilder与StringBuffer自身的append()方法内都使用了继承自AbstractStringBuilde原创 2020-08-16 22:51:47 · 3454 阅读 · 0 评论 -
Java应用:图片叠加
图片叠加一. 功能目标二. 代码实现2.1 依赖2.2 图片叠加服务一. 功能目标现有一张背景图片,一张水印图片,希望将水印图片叠加到背景图片上方的指定位置。本代码基于Spring boot框架搭建而成,外部发起请求,可以下载到合成后的图片。注意:合成图片的难点不在代码,而在寻找素材。底图和水印图片的尺寸一定要固定。只有不断地调试水印图片在底图上的坐标,才能使得合成后的图片更加自然。如有必要,可以适当的缩放图片。背景图片:水印图片:希望实现的效果:二. 代码实现2.1原创 2020-06-01 10:53:31 · 1463 阅读 · 4 评论 -
Java基础: 基于DeferredResult的异步服务
一. 简介Servlet3.0提供了基于servlet的异步处理api,Spring MVC只是将这些api进行了一系列的封装,从而实现了DeferredResult。DeferredResult字面意思是"延迟结果",它允许Spring MVC收到请求后,立即释放(归还)容器线程,以便容器可以接收更多的外部请求,提升吞吐量,但DeferredResult自身可以借助Spring提供异步线程使本次请求进入阻塞。这一点是Spring MVC + 普通线程池做不到的。PS: 容器线程都已经释放了,请原创 2020-05-25 16:24:37 · 3252 阅读 · 2 评论 -
Java基础: 静态内部类和外部类的加载过程
一. 示例注意:以下测试时,main()不在Outer中。这一点非常重要,因为main()调用后,JVM会首先加载main所在的类,如果把main()放在Outer中,则无论在main()内写任何代码,JVM一定会优先加载Outer的静态块,这样便干扰了"静态内部类和外部类的加载过程"的测试。public class Outer { static { System.out.println("外部类 静态块 加载"); } public static cla原创 2020-05-24 23:59:23 · 1260 阅读 · 3 评论 -
Java基础: volatile关键字相关特性
volatile是一个Java关键字,被其修饰的对象可以获得(简单的赋值与返回操作)的原子性和可见性(可视性)。1. 原子性是什么?为什么可以获得原子性?答: 原子性一般针对于原子操作而言,这是一种不能被线程调用机制中断的操作,一旦操作开始,那么它一定可以在可能发生的"上下文切换"之前执行完毕。举个例子,jvm会自动将64位的long和double类型变量的读取或者写入当做两个独立的32位...原创 2020-01-29 18:58:22 · 133 阅读 · 0 评论 -
Java基础: Lombok @Builder使用总结
我所使用的Lombok版本是1.18.8一. @Builder与继承共存 截止1.18.8版本,使用了@Builder注解的类仍然无法使用继承,public class Test { public static void main(String[] args) { T1.builder().build(); }}@Builder@All...原创 2019-11-29 13:20:15 · 4325 阅读 · 0 评论 -
Java基础: protected 关键字
protected访问修饰符所修饰对象的作用范围是其子类,超出范围后访问时则会报错(编译错误)。 请看下面这个例子:1. com.c2 Vehicle类public class Vehicle { protected void run(){ System.out.println("Vehicle run..."); }}2....原创 2019-07-24 23:57:13 · 195 阅读 · 0 评论 -
Java基础: 多态
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。我个人对多态的理解是: 父类类型引用指向了子类对象。来看一个例子:private Object t(String s){ return (Object)s;}@Testpublic void test(){ System.out.println(t("中国").ge...原创 2019-07-17 11:36:20 · 99 阅读 · 0 评论 -
Java多线程: Exchanger的使用
一. 概念 Exchanger能在两个线程驱动的任务之间交换对象。交换之前,A任务持有D1对象,B任务持有D2对象。交换之后,A任务持有D2对象,B任务持有D1对象。 Exchanger可以使用的场景: 1. 大数据量、多步骤执行的任务 比如把整个任务分割成了n段。第一段子任务在执行到某种程度后,执行Exchan...原创 2020-01-30 19:29:05 · 389 阅读 · 0 评论 -
Java多线程: Semaphore的使用
一. 概念 书上将Semaphore描述成"允许n个任务同时访问同一个资源",我个人觉得这个表述并不准确。Semaphore更像是一个限流装置,管理着有限数量的资源(这一步需要我们自行通过代码完成),每个资源都配有使用许可证,当外部(某线程驱动的任务)需要使用资源时,首先需要向Semaphore申请许可证,接着Semaphore会查看当前许可证的使用情况,若存在尚未被使用的许可证,则...原创 2020-01-30 18:22:52 · 216 阅读 · 0 评论 -
HashMap 底层实现原理 JDK1.7
一. 数据结构hash原创 2020-03-22 17:32:08 · 813 阅读 · 9 评论 -
Spring AOP知识点总结
参考:1.http://www.cnblogs.com/hongwz/p/5764917.html2.https://www.cnblogs.com/zhaozihan/p/5953063.html(非常棒)一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,...原创 2020-03-24 23:06:02 · 203 阅读 · 0 评论