
java基础
文章平均质量分 77
weixin_42073629
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring Event 业务解耦神器
Spring Event转载 2022-10-13 00:36:46 · 373 阅读 · 0 评论 -
一个注解,优雅的实现循环重试功能
前言在实际工作中,重处理是一个非常常见的场景,比如: 发送消息失败。 调用远程服务失败。 争抢锁失败。 这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。一、@Retryable是什么?spring系列的spring-retry是另转载 2022-04-11 07:12:26 · 193 阅读 · 0 评论 -
Java8 Stream,常用方法大合集
一、概述Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。特点: 不是数据结构,不会保存数据。 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可转载 2022-04-11 07:11:38 · 295 阅读 · 0 评论 -
SpringBoot中必须掌握的45个注解
1.SpringBoot/spring@SpringBootApplication:包含@Configuration、@EnableAutoConfiguration、@ComponentScan通常用在主类上;@Repository:用于标注数据访问组件,即DAO组件;@Service:用于标注业务层组件;@RestController:用于标注控制层组件(如struts中的action),包含@Controller和@ResponseBody;@Controller:原创 2021-05-26 21:44:55 · 158 阅读 · 0 评论 -
彻底搞懂String:字符串常量池
作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池:1、字符串常量池的设计意图是什么?2、字符串常量池在哪里?3、如何操作字符串常量池?字符串常量池的设计思想1、字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能。2、JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。原创 2021-05-03 16:40:27 · 12055 阅读 · 12 评论 -
各种 Util 工具类神级框架Hutool
Hutool 谐音 “糊涂”,寓意追求 “万事都作糊涂观,无所谓失,无所谓得” 的境界。Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以 “甜甜的”。Hutool 最初是我项目中 “util” 包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。(FROM 自作者简介)功能一个 Java 基础工具类,对文件、流、加密解密、转码、正则、线程、XML 等原创 2021-03-26 05:44:48 · 657 阅读 · 0 评论 -
使用 Reactor 进行反应式编程
反应式编程(Reactive Programming)这种新的编程范式越来越受到开发人员的欢迎。在 Java 社区中比较流行的是 RxJava 和 RxJava 2。本文要介绍的是另外一个新的反应式编程库 Reactor。反应式编程介绍反应式编程来源于数据流和变化的传播,意味着由底层的执行模型负责通过数据流来自动传播变化。比如求值一个简单的表达式 c=a+b,当 a 或者 b 的值发生变化...原创 2020-04-14 23:20:11 · 752 阅读 · 0 评论 -
深入理解 Java 内存模型(九)——理解内存屏障
在深入理解 Java 内存模型(七)——一致性(Consistency)我们说了硬件层提供了满足某些一致性需求的能力,Java内存模型利用了硬件层提供的能力指定了一系列的语法和规则,让Java开发者可以隔绝这种底层的实现专注于并发逻辑的开发。这篇我们来看看硬件层是如何提供这些实现一致性需求的能力的。硬件层提供了一系列的内存屏障 memory barrier / memory fence(Int...原创 2020-03-09 00:11:47 · 388 阅读 · 0 评论 -
深入理解 Java 内存模型(十)——总结
处理器内存模型顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和 JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。根据对不同类型读 / 写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面...原创 2020-03-09 00:12:03 · 250 阅读 · 0 评论 -
深入理解 Java 内存模型(八)——理解CPU高速缓存的工作原理
我们说了Java内存模型是一个语言级别的内存模型抽象,它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统一的接口来提供保证内存一致性的编程能力。在一致性这个问题域中,各个层面扮演的角色大致如下:1. 一致性模型,定义了各种一致性模型的理论基础2. 硬件层,提供了实现某些一致性模型的硬件能力。硬件在默认情况下按照最基本的方式运行,比如对同一个线程没有数据依赖的指令可以重排序优...原创 2020-03-09 00:11:33 · 645 阅读 · 0 评论 -
深入理解 Java 内存模型(七)——一致性(Consistency)
可以说并发系统要解决的最核心问题之一就是一致性的问题,关于一致性的研究已经有几十年了,有大量的理论,算法支持。这篇说说一致性这个主题一些经常提到的概念,理清Java内存模型在其中的位置。一致性问题更准确的说是一致性需求,看系统需要什么样的一致性保证。比如分布式领域的CAP理论说Consistency, Availability, Partition tolerance这三个要求同时只能满足两个...原创 2020-03-09 00:11:06 · 1039 阅读 · 0 评论 -
深入理解 Java 内存模型(五)——锁
锁的释放 - 获取建立的 happens before 关系锁是 java 并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放 - 获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1 ...原创 2020-03-08 22:18:03 · 113 阅读 · 0 评论 -
深入理解 Java 内存模型(六)——final
与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问。对于 final 域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。下面,我们通过一些示...原创 2020-03-08 21:59:51 · 1568 阅读 · 0 评论 -
深入理解 Java 内存模型(四)——volatile
volatile 的特性当我们声明共享变量为 volatile 后,对这个变量的读 / 写将会很特别。理解 volatile 特性的一个好方法是:把对 volatile 变量的单个读 / 写,看成是使用同一个监视器锁对这些单个读 / 写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile ...原创 2020-03-08 21:54:54 · 118 阅读 · 0 评论 -
深入理解 Java 内存模型(三)——顺序一致性
数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java 内存模型规范对数据竞争的定义如下:在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM 对正确同步的多线程程序的内存一致性做...原创 2020-03-08 21:48:46 · 126 阅读 · 0 评论 -
深入理解 Java 内存模型(二)——重排序
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之后,...原创 2020-03-08 21:45:48 · 138 阅读 · 0 评论 -
深入理解 Java 内存模型(一)
并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必...原创 2020-03-08 21:43:40 · 152 阅读 · 0 评论 -
java对象在内存中的结构(HotSpot虚拟机)
一、对象的内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分:Mark Word(标记字段):对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。...原创 2020-02-25 02:51:54 · 224 阅读 · 0 评论 -
java Clone使用方法详解
java“指针” Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。看到这个标题,是不是有点困...原创 2020-02-08 04:32:37 · 454 阅读 · 0 评论 -
Hibernate3.x总结
一、*.hbm.xml操作:Hibernate连接固定格式:1.找到hibernate配置(hibernate.cfg.xml);配置文件必须放在src文件下 Configuration config=new Configuration().configure();-----import org.hibernate.cfg.Configuration;2.从配置中取出SessionF...原创 2019-09-22 04:32:14 · 550 阅读 · 0 评论 -
hibernate主键生成机制
1) assigned [转让主键生成权]主键由外部程序负责生成,无需Hibernate参与。2) hilo通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。3) seqhilo与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。4) incr...原创 2019-09-22 04:31:04 · 186 阅读 · 0 评论 -
JDBC编程
driver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:oracleStatement构造器:Statement();一.JDBC访问数据库的基本步骤(Statement): 1->.加载JDBC驱动: Class.forName("oracle.jdbc.driver.Orac...原创 2019-09-22 03:17:58 · 120 阅读 · 0 评论 -
Java工作原理
说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示: Java代码编译和执行的过程,正如图所描述,开发人员编写Java代码(.java文件),由Java源码编译器编译成字节码(.class文件),字...原创 2019-01-20 02:47:28 · 3342 阅读 · 0 评论