java基础
文章平均质量分 80
XSemperFI
无冥冥之志者,无昭昭之明,无昏昏之事者,无赫赫之功
展开
-
Java 17 新特性
如果您想比较不同版本的 Java API,有一个很棒的工具Java Version Almanac。我们跳过中间的版本直接对比Java8和Java17和我们开发有关的差异。Java 17 特性1. Java 17 与 Java 8:变化2. 扩展switch表达式2. 实例匹配3. 密封类(Sealed Classes)4. 文本块5. 新的 Optional.orElseThrow() 方法6. 其他小而精的 API 更改7. 垃圾收集器8. 容器意识9. CDS档案10. Java Flight.翻译 2021-11-25 12:57:02 · 8573 阅读 · 0 评论 -
@Transactional事务失效
除非特殊配置(比如使用 AspectJ 静态织入实现 AOP),否则只有定义在 public 方法上的 @Transactional 才能生效。因为Spring 默认通过动态代理的方式实现 AOP,对目标方法进行增强,private 方法无法代理到,Spring 自然也无法动态增强事务处理逻辑。必须通过代理过的类从外部调用目标方法才能生效。Spring 通过 AOP 技术对方法进行增强,要调用增强过的方法必然是调用代理后的对象。因为this 指针代表对象自己,Spring 不可能注入 this,所..原创 2021-11-19 20:44:14 · 706 阅读 · 0 评论 -
为什么禁用Executors创建线程池,而用ThreadPoolExecutor创建?
阿里的 Java开发手册建议线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。禁用原因:Executors创建出来的线程池使用的全都是无界队列,而使用无界队列就可以无限保存任务,因此很有可能造成OOM异常。同时在某些类型的线程池里面,使用无界队列还会导致maxinumPoo...原创 2020-03-01 12:50:59 · 579 阅读 · 0 评论 -
Java并发编程(01) —— 并发问题从何而来
@[TOC](Java并发编程(01) —— 并发问题从何而来)一级目录在计算机存储结构中, CPU、内存、I/O 设备三者的速度差异简直是“天上一天地下一年”,为了提高CPU的性能减少执行等待时间,平衡三者的速度差异。我们引入了一些技术来改善这三者的差异,但又引入了新的问题——并发问题CPU 增加了缓存,以均衡与内存的速度差异 —— 可见性问题操作系统增加了进程、线程,以分时复用 CPU(线程切换),进而均衡 CPU 与 I/O 设备的速度差异 —— 原子性问题编译程序优化指令执行次序,使得原创 2020-07-19 11:39:38 · 171 阅读 · 0 评论 -
Java并发编程(02 上)——Java 内存模型
Java并发编程(02)——如何解决可见性和有序性Java 内存模型volatile三级目录Java 内存模型导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,当然我们不能这么搞。合理的方案应该是按需禁用缓存以及编译优化。Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括 volatile、synchronized 和 final 三个关键字,以及六项 Happens-Before 规则volati原创 2020-07-26 14:37:09 · 112 阅读 · 0 评论 -
synchronized和Lock的区别
1、区别:1)Lock是一个接口,synchronized是Java中的关键字,synchronized是内置的语言实现;2)synchronized发生异常时,会自动释放线程占用的锁,故不会发生死锁现象。Lock发生异常,若没有主动释放,极有可能造成死锁,故需要在finally中调用unLock方法释放锁;3)Lock可以让等待锁的线程响应中断,使用synchronized只会让等待的线程一直等待下去,不能响应中断4)通过Lock可以知道有没有成功获取到锁,synchronized就不行5)Lo转载 2020-08-14 18:34:32 · 1194 阅读 · 1 评论 -
Java并发编程(02 下)——细说可见性问题
Java并发编程(02 下)——细说可见性问题1. volatile的定义与实现原理1.1volatile是如何来保证可见性的呢1.2 volatile的实现2.volatile的使用优化前文说到,为了平衡CPU和内存之间的速度差异而增加了缓存,在多核场景下CPU操作完不知道何时会写到内存从而引出了可见性的问题。在Java1.5版本里使用happens-before规则对volatile语义进行了增强,进一步保证了可见性。1. volatile的定义与实现原理Java编程语言允许线程访问共享变量,为原创 2020-08-01 11:01:28 · 186 阅读 · 0 评论 -
Java并发编程(03)——原子性问题
Java并发编程(03)——原子性问题一级目录二级目录三级目录一个或者多个操作在 CPU 执行的过程中不被中断的特性,称为“原子性”。原子性问题的源头是线程切换,如果能够禁用线程切换那不就能解决这个问题了吗?而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。“同一时刻只有一个线程执行”这个条件非常重要,我们称之为互斥。如果我们能够保证对共享变量的修改是互斥的,那么,无论是单核 CPU 还是多核 CPU,就都能保证原子性了。一级目录二级目录三级目录...原创 2020-08-01 11:42:08 · 328 阅读 · 0 评论 -
如何减少上下文切换
减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。·无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。·CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁。·使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。·协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。原创 2021-05-14 13:50:20 · 484 阅读 · 0 评论 -
Java并发编程 —— Immutability模式
Java并发编程(23)—— Immutability模式:如何利用不变性解决并发问题?1. 快速实现具备不可变性的类2. 利用享元模式避免创建重复对象3. 使用 Immutability 模式的注意事项4. 总结5. 课后思考解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改原创 2021-08-08 10:09:33 · 398 阅读 · 0 评论 -
责任链模式——消除大量的 else if
设计模式的使用是将元数据从逻辑代码中剥离出来,避免因元数据(Metadata)变化导致修改程序。程序本身只是逻辑的集合,而元数据(辅助程序行为,诸如语言包文件)应集中在配置文件里;待处理的数据来自外部输入(用户输入、本地文件、数据库等)责任链模式属于行为模式中的一种,特别关注对象之间的通信。主要解决职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求...原创 2020-03-29 15:21:19 · 1445 阅读 · 0 评论 -
这可能是最全的单例模式了
设计模式之——单例模式单例的几种实现1. 懒汉单例模式2. synchronized 修饰的懒汉单例模式3. 双重检查锁定的单例模式4. 静态内部类实现单例模式5. 饿汉实现单例模式6. 饿汉变种实现单例模式7. 枚举实现单例模式static修饰下是怎么做到线程安全的?完全不使用synchronized实现单例模式1. CAS(AtomicReference)实现单例模式2. ThreadLocal实现单例模式如何破坏单例如何防止单例被破坏参考文章单例模式有以下特点: 1、单例类只能有一个实例。原创 2020-05-10 12:36:34 · 339 阅读 · 1 评论 -
Tomcat(01)—— 基础
Tomcat(01)—— 基础1. 什么是web容器2. Tomcat在一次请求中做了什么3. HTTP 请求响应实例4. tomcat与Session 创建存储Cookie 和 Sessionsession创建1. 什么是web容器早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户。随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要原创 2020-08-02 14:16:02 · 136 阅读 · 0 评论 -
Java Streams 中的异常处理
https://dzone.com/articles/exception-handling-in-java-streamsStream API 和 lambda 是自第 8 版以来 Java 中的重大改进。从那时起,我们可以使用更具功能性的语法样式。现在,在使用这些代码结构几年后,仍然存在的较大问题之一是如何处理 lambda 中的已检查异常。众所周知,不可能直接从 lambda 调用抛出已检查异常的方法。在某种程度上,我们需要捕获异常以使代码编译。自然,我们可以在 lambda 中执行一个简单的 .翻译 2021-07-31 10:46:09 · 2572 阅读 · 0 评论 -
一切从FP(Functional Programming)开始
一切从Functional Programming开始1. 一切从FP开始2. 什么是FP?2.1. 命令式 / 函数式2.2. 函数式特性2.2.1. 闭包2.2.2. 高阶函数2.2.3. 元组2.2.4. 柯里化2.3.1. 副作用2.3.2. 引用透明2.3.3. 纯/逆/偏/全函数2.3.4. Monad3. 总结3.1. 函数式的优势3.2. Java中的方法3.3. 如何处理副作用?转载:https://silentbalanceyh.gitbooks.io/vert-x/content/转载 2021-07-29 22:14:14 · 644 阅读 · 0 评论 -
Mybatis返回类型Map<String,String>时查询返回正常,获取值时类型转换异常
1. 问题由来2. 设置3. 解决方案1. 问题由来当resultType若为Map时,若定义了Map的泛型为String,但是数据库返回字段在库中为Number,那么就会发现虽然Map中有值,但是其类型为Integer,泛型并没有起作用。因为Java语言的泛型采用的是擦除法实现的伪泛型,泛型信息(类型变量、参数化类型)编译之后通通被除掉了。当resultMap中指定的JavaType是java.util.map,此处只指定类类型,而没指定泛型。而Map<String,String>和.原创 2021-07-25 14:29:46 · 7196 阅读 · 2 评论 -
虚拟机类加载机制
虚拟机类加载机制1 前言类从被加载到虚拟机内存中开始,到卸载出内存结束。其整个生命周期包括:加载 Loading验证 Verification准备 Preparation解析 Resolution初始化 Initialization使用 Using卸载 Unloading其中验证,准备,解析三个阶段统称为连接Linking2 类的加载时机虚拟机规范严格规定了,只有在主...原创 2020-01-05 15:59:42 · 124 阅读 · 0 评论 -
一文读懂Java函数式编程
一文读懂Java函数式编程1. 什么是函数式编程Functional Programming1.1 函数是"第一等公民"1.2 闭包和高阶函数1.3 不改变状态(引用透明)1.4 递归(使用参数保存状态,而非变量)1.5 只用"表达式",不用"语句",没有副作用1.5.1 什么是副作用二级目录三级目录函数式编程中没有赋值语句,因此变量一旦有了值就不会再改变。更通俗的讲,函数式编程不修改变量,这样消除了bug的一个主要来源,也使得执行顺序变得无关紧要。这意味着状态不能保存在变量中——即程序是“引用透明”的原创 2021-01-10 12:09:08 · 360 阅读 · 0 评论 -
基本数据类型与包装类型
基本数据类型与包装类型很多情况下基本类型要优于包装类型使用包装类的场景有Java中有两种数据类型,基本数据类型(Primitive type)和引用类型(Reference type)。基本数据类型如boolean,int等。引用类型如List,String等。每一种基本类型都有对应的包装类型(Wrapper classes),如int对应的是Integer。很多情况下基本类型要优于包装类型在Java1.5以及之后的版本中增加了自动装箱和拆箱的特性。但不恰当的使用基本类型和包装类型,可能带来大量原创 2020-05-08 23:37:13 · 408 阅读 · 0 评论 -
Java的回调-由浅入深(保证简单易懂)
转载请注意文章出处:https://blog.csdn.net/fengye454545/article/details/80198446看了看网上的回调解释和例子,都那么的绕口,得看半天才能绕回来,其实吧,回调是个很简单的机制。在这里我用简单的语言先来解释一下:假设有两个类,分别是A和B,在A中有一个方法a(),B中有一个方法b();在A里面调用B中的方法b(),而方法b()中调用了方法a...转载 2020-04-01 20:10:49 · 183 阅读 · 0 评论 -
SPI与ServiceLoader
ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,而ServiceLoader是一个简单的服务提供者加载器,服务的对象是接口和类(通常为抽象类)集合,其也是SPI的灵魂,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SP...原创 2020-03-29 09:07:25 · 201 阅读 · 0 评论 -
静态代理,JDK 动态代理,CGLIB 动态代理都是些什么鬼?
代理模式(静态代理)代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(代理类持有的被代理对象的引用 private RealImage realImage;),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。创建一个接口(Image),然后创建被代理的类(RealImage)实现该接口并且实现该接...原创 2020-03-09 22:28:00 · 141 阅读 · 0 评论 -
Java基础——接口与抽象类
抽象类总结抽象类不能被实例化,只有抽象类的非抽象子类可以创建对象(如果子类不提供父类中所有的抽象方法定义,那么这个子类也是抽象的,编译器会提示用abstract来限定这个类)。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。抽象类中的抽象方法只是声明,不包含方法体。构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。抽象类的子类必须给出抽象类中的抽象方法的具体...原创 2020-03-08 18:16:01 · 166 阅读 · 0 评论