
Java
文章平均质量分 83
夜光下丶
新人初学,请多指教!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CLH介绍
在并发编程中,锁是一种常用的保证线程安全的方法。Java 中常用的锁主要有两类,一种是 Synchronized 修饰的锁,被称为 Java 内置锁或监视器锁。另一种就是在 J2SE 1.5版本之后的 java.util.concurrent包(下称JUC包)中的各类同步器,包括 ReentrantLock(可重入锁),ReentrantReadWriteLock(可重入读写锁),Semaphore(信号量),CountDownLatch 等。原创 2024-10-18 14:23:03 · 933 阅读 · 0 评论 -
ThreadLocal
ThreadLocal 类用来提供线程内部的局部变量,这种变量在多线程环境下访问(通过 get 和 set 方法访问)时能保证各个线程的变量相对独立于其他线程内的变量,分配在堆内的TLAB中ThreadLocal 实例通常来说都是类型的,属于一个线程的本地变量,用于关联线程和线程上下文。每个线程都会在 ThreadLocal 中保存一份该线程独有的数据,所以是线程安全的。原创 2024-10-18 15:24:56 · 847 阅读 · 0 评论 -
AQS原理分析
AQS 通过提供 state 及 FIFO 队列的管理,为我们提供了一套通用的实现锁的底层方法,基本上定义一个锁,都是转为在其内部定义 AQS 的子类,调用 AQS 的底层方法来实现的,由于 AQS 在底层已经为了定义好了这些获取 state 及 FIFO 队列的管理工作,我们要实现一个锁就比较简单了,我们可以基于 AQS 来实现一个非可重入的互斥锁,如下所示@Override@Override@Override。原创 2024-10-19 12:02:10 · 803 阅读 · 0 评论 -
Unsafe
Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升 Java 运行效率、增强 Java 语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使 Java 语言拥有了类似 C 语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得 Java 这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。原创 2024-10-19 11:38:14 · 1193 阅读 · 0 评论 -
Spring 启动流程分析
Bean: Spring作为一个IoC容器,最重要的当然是Bean咯BeanFactory: 生产与管理Bean的工厂BeanDefinition: Bean的定义,也就是我们方案中的Class,Spring对它进行了封装BeanDefinitionRegistry: 类似于Bean与BeanFactory的关系,BeanDefinitionRegistry用于管理BeanDefinitionBeanDefinitionRegistryPostProcessor: 用于在解析配置类时的处理器,类似于我们方案原创 2024-10-28 09:47:07 · 1161 阅读 · 0 评论 -
Spring beanFactoryPostProcessor
基本上parser内部解析的重点方法都分析完了,总结一下,parser都干了什么?parser作为一个解析器,根据传入的配置类解析出多个对象配置类实际上是一个树形结构,他的子节点包含@ComponentScan扫描到的配置类,@Import引入的普通类等而spring中这个树结构的根节点一般就是用户定义的主启动类parser通过递归解析完成整个树的解析(解析成多个ConfigurationClass对象),并把解析结果存入parser内部属性。原创 2024-10-28 21:34:16 · 814 阅读 · 0 评论 -
Spring Bean创建流程
这些自定义的对象销毁逻辑,在对象实例初始化完成,并注册了相关的回调接口后,并不会马上执行。函数会先获取所有需要构建的Bean名称,通过bean的RootBeanDefinition判断该bean是否为可构建的类型,很明显可构建的Bean不能是抽象类,不能是接口,也不能是懒加载的bean。大家总是会错误的理解Bean的“实例化”和“初始化”过程,总会以为初始化就是对象执行构造函数生成对象实例的过程,其实不然,在初始化阶段实际对象已经实例化出来了,初始化阶段进行的是依赖的注入和执行一些用户自定义的初始化逻辑。原创 2024-10-29 22:04:41 · 819 阅读 · 0 评论 -
进程、线程和缓存一致性原理
当 A 号 CPU 核心要修改 Cache 中 i 变量的值,发现数据对应的 Cache Line 的状态是共享状态,则要向所有的其他 CPU 核心广播一个请求,要求先把其他核心的 Cache 中对应的 Cache Line 标记为「无效」状态,然后 A 号 CPU 核心才更新 Cache 里面的数据,同时标记 Cache Line 为「已修改」状态,此时 Cache 中的数据就与内存不一致了。而「已失效」状态,表示的是这个 Cache Block 里的数据已经失效了,不可以读取该状态的数据。原创 2024-10-18 15:30:01 · 824 阅读 · 0 评论 -
CAS介绍
CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。原创 2024-10-18 15:28:30 · 1021 阅读 · 0 评论 -
Java Memory Model
特性volatile关键字synchronized关键字Lock接口Atomic变量原子性无法保障可以保障可以保障可以保障可见性可以保障可以保障可以保障可以保障有序性一定程度可以保障可以保障无法保障。原创 2024-10-18 15:27:19 · 1094 阅读 · 0 评论 -
LockSupport
LockSupport.park()休眠线程,LockSupport.unpark()唤醒线程,两个方法配合使用。也可以通过LockSupport.parkNanos()指定休眠时间后,自动唤醒。LockSupport.park()不会释放monitor锁。线程被打断,LockSupport.park()不会抛出异常,也不会吞噬掉interrupt的状态,调用者可以获取interrupt状态,自行进行判断,线程是由于什么原因被唤醒了。原创 2024-10-18 14:07:39 · 1084 阅读 · 0 评论 -
WebSocket教程
SpringBoot集成WebSocket教程原创 2023-02-06 22:10:24 · 3109 阅读 · 0 评论 -
dynamic-datasource + Greenplum + MySQL 多数据源配置
Greenplum + Mysql 对数据源配置原创 2022-12-26 17:12:21 · 342 阅读 · 0 评论 -
MybatisPlus 多数据源配置
MybatisPlus 多数据源配置原创 2022-12-26 17:06:17 · 2216 阅读 · 0 评论 -
Mybatis常用标签
trim 元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides;正因为 trim 有这样的功能,所以我们也可以非常简单的利用 trim 来代替 where 元素的功能。set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)原创 2022-11-27 17:44:51 · 240 阅读 · 0 评论 -
Spring 之 javax.validation
作用:对 Controller 层接口的入参做校验。原创 2022-11-13 09:40:08 · 626 阅读 · 0 评论 -
@RequestBody 和 @RequestParam注解使用详解
注解@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求,像POST、DELETE等其它类型的请求也可以使用。注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非、等类型的数据。通常用于接收POST、DELETE等类型的请求数据,GET类型也可以适用。在GET请求中,不能使用@RequestBody。原创 2022-11-10 19:03:08 · 30651 阅读 · 2 评论 -
Spring 之 AOP
通过方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是的延续,是软件开发中的一个热点,也是框架中的一个重要内容,是的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的降低,提高程序的可重用性,同时提高了开发的效率。AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP()针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的划分。原创 2022-09-20 19:25:05 · 373 阅读 · 0 评论 -
Java 8 Stream 流根据属性去重
Java 8 Stream流根据属性进行去重操作原创 2022-09-19 19:39:38 · 2945 阅读 · 0 评论 -
Java 泛型
Java 泛型使用教程原创 2022-09-15 19:31:30 · 230 阅读 · 0 评论 -
Lombok 之 @Bulider
@Builder原创 2022-09-14 20:10:16 · 2471 阅读 · 0 评论 -
Optional使用教程
Java 8 之 Optional 使用原创 2022-09-14 20:01:23 · 4557 阅读 · 0 评论 -
RabbtiMQ
RabbitMQ 入门教程原创 2022-09-14 19:55:48 · 1198 阅读 · 0 评论 -
MP的几种查询方式
Mybatis-plus查询方法的几种编写方式原创 2022-07-24 21:31:59 · 3910 阅读 · 0 评论 -
MapStruct
MapStruct的简单使用原创 2022-07-24 21:29:01 · 1863 阅读 · 0 评论 -
通过方法引用获取方法名
MP lambdaQuery根据方法引用获取属性名底层简单实现原创 2022-07-24 21:04:05 · 2796 阅读 · 0 评论 -
MP查询条件
MP常见方法原创 2022-07-21 20:05:47 · 3247 阅读 · 0 评论 -
Spring IOC
Spring控制反转和依赖注入原创 2022-06-20 21:48:15 · 171 阅读 · 1 评论 -
FormData详解
FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果表单 enctype 属性设为 multipart/form-data ,则会使用表单的 submit() 方法来发送数据,从而发送数据具有同样形式。构造函数FormData()构造函数用于创建一个新的FormData对象。var formData = new FormData(form)原创 2022-01-08 22:22:43 · 55453 阅读 · 5 评论 -
MyBatis的参数映射
MyBatis的参数映射不同于字段映射,参数映射中的"参数"是指传入SQL语句的参数,而字段映射指的是将JDBC ResultSets数据映射成JavaBean。MyBatis的参数映射配置MyBatis的参数映射利用的属性是:parameterType。parameterType,将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)基本类型只含或者.原创 2022-01-08 20:12:03 · 2172 阅读 · 0 评论 -
StringJoiner
StringJoiner 类,是 Java 8 新增的一个 API,它基于 StringBuilder 构建,用于实现对字符串之间通过分隔符拼接的场景。String 类也于 Java 8 新增了两个静态重载方法:join(CharSequence delimiter, CharSequence... elements) : String、join(CharSequence delimiter,Iterable<? extends CharSequence> elements) : Strin原创 2021-12-30 21:54:16 · 1079 阅读 · 0 评论 -
字符串拼接的几种方式
+ 号拼接通过+拼接是最常见的拼接方式,这个应该算是最简单的一种方式了,但是很遗憾得玩告诉你,阿里巴巴在他们的规范里面之处不建议在 for 循环里面使用 “+” 进行字符串的拼接。这里的不建议,其实就是不允许的意思,只是人家说的比较委婉而已。事实上,现在还在拿 “+” 来做拼接的应该是比较少了吧。阿里开发者社区的时候看到一篇文章《为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接》,里面提到这个 拼接符号 “+” 不是一个运算符重载,Java也并不支持这个所谓...原创 2021-12-30 21:09:36 · 24903 阅读 · 0 评论 -
根据传入的属性进行排序
实体类public class UserEntity{ /** * 用户主键 */ private Integer id; /** * 用户名 */ private String username; /** * 用户密码 */ private String password; /** * 用户地址 */ private String address;原创 2021-12-30 20:25:32 · 870 阅读 · 0 评论 -
@RequestMapping的参数和用法
在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置源码:// 该注解说明可以在类和方法上使用// 用于类上:表示类中的所有响应请求的方法都是以该地址作为父路径// 用于方法上: 提供进一步的细分映射信息@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Do原创 2021-12-25 14:07:56 · 3337 阅读 · 0 评论 -
BeanUtils.copyProperties的使用
BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。如果你有两个具有很多相同属性的JavaBean,需要对象之间的赋值,这时候就可以使用这个方法,避免代码中全是get/set之类的代码,可以让代码简洁明朗更优雅。BeanUtils是深拷贝,还是浅拷贝?是浅拷贝。浅拷贝: 只是调用子对原创 2021-12-21 21:35:31 · 1173 阅读 · 0 评论 -
WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出原创 2021-12-20 21:14:04 · 1929 阅读 · 0 评论 -
Java枚举
为什么需要枚举?常量定义它不香吗?为啥非得用枚举?静态常量: /** * 成功 */ public static final int SUCCESS = 1; /** * 失败 */ public static final int FAILURE = 0;对于这种单值类型的静态常量定义,本身也没错,主要是在使用的地方没有一个明确性的约束而已 public void getCode(int code){...原创 2021-12-17 14:01:25 · 625 阅读 · 0 评论 -
Mybatis中@Param的用法和作用详解
@Param用于dao层,是mybatis中的注解使得mapper.xml中的参数与后台的参数对应上,也增强了可读性如果两者参数名一致得话,spring会自动进行封装,不一致的时候就需要手动去使其对应上。即:用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。 在方法只接受一个参数的情况下,可以不使用@Param。 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。 如果参数原创 2021-11-29 23:19:01 · 21638 阅读 · 5 评论 -
SpringMVC
目录什么是MVC回顾ServletSpringMVC执行原理SpringMVC 配置版SpringMVC 注解版小结什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。 是将业务逻辑、数据、显示分离的方法来组织代码。 MVC主要作用是降低了视图与业务逻辑间的双向偶合。 MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。 Model(模型):数据模型,..原创 2021-11-29 21:54:25 · 185 阅读 · 0 评论 -
Mybatis插入时返回生成的主键
当插入数据之后,mybatis再次查询mysql数据库,获得了注解id,然后填充到person对象的id属性的。在定义xml映射器时设置属性useGeneratedKeys值为true,并分别指定属性keyProperty和keyColumn为对应的数据库记录主键字段与Java对象的主键属性。 <insert id="insertHuman" parameterType="Human" useGeneratedKeys="true" keyProperty="id" keyColumn="i原创 2021-11-25 14:30:24 · 1569 阅读 · 0 评论