目录1线程安全定义2Java数据与线程安全2.1不可变2.2绝对线程安全2.3相对线程安全2.4线程兼容2.5线程对立3Java线程安全支持3.1互斥同步3.1.1synchronized互斥同步原理3.1.2Lock接口和ReentrantLock互斥同步原理3.1.3synchronized和Lock对比3.2非阻塞同步3.3无同步方案3.3.1可重入代码3.3.2线程本地存储1线程安全定义含糊的定义:如果一个对象可以安全地被多个线程同时使用,那它就是线程安全的严谨的定义:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方
一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapClassLoader、ExtensionClassLoader和SystemClassLoader(ApplicationClassLoader)每一个类加载器都确定了从哪些位置加载文件。于此同时我们也可以通过继承java.lang.classloader实现自己的类加载器。BootstrapClassLoader:负责加载JDK自带的rt.jar包中的类文件,是所有类加载的父类ExtensionClassLoader:
一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapClassLoader、ExtensionClassLoader和SystemClassLoader(ApplicationClassLoader)每一个类加载器都确定了从哪些位置加载文件。于此同时我们也可以通过继承java.lang.classloader实现自己的类加载器。BootstrapClassLoader:负责加载JDK自带的rt.jar包中的类文件,是所有类加载的父类ExtensionClassLoader:
大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。上一篇文章中,我们聊了下Caffeine的同步、异步的数据回源方式。本篇文章我们再一起研讨下Caffeine的多种不同的数据淘汰驱逐机制,以及对应的实际使用。Caffeine的异步淘汰清理机制在惰性删除实现机制这边,Caffeine做了一些改进优化以提升在并发场景下的性能表现。我们可以和GuavaCache的基于容量大小的淘汰处理做个对比。当限制了GuavaCache最大容量之后,有新的记录写入超过了总大小,会理解触发数据淘汰策略,然后腾
大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。上一篇文章中,我们聊了下Caffeine的同步、异步的数据回源方式。本篇文章我们再一起研讨下Caffeine的多种不同的数据淘汰驱逐机制,以及对应的实际使用。Caffeine的异步淘汰清理机制在惰性删除实现机制这边,Caffeine做了一些改进优化以提升在并发场景下的性能表现。我们可以和GuavaCache的基于容量大小的淘汰处理做个对比。当限制了GuavaCache最大容量之后,有新的记录写入超过了总大小,会理解触发数据淘汰策略,然后腾
大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。上一篇文章中呢,我们简单的介绍了下Redis的整体情况。作为集中式缓存的优秀代表,Redis可以帮助我们在项目中完成很多特定的功能。Redis准确的说是一个非关系型数据库,但是由于其超高的并发处理性能,及其对于缓存场景所提供的一系列能力构建,使其成为了分布式系统中的集中缓存的绝佳选择。Redis对于缓存能力场景的支持,除了基础的缓存增删改查,还支持对记录的过期时间设定,支持多种不同的数据淘汰策略等等。此外为了解决内存型组件数据可靠性问题,
大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。上一篇文章中呢,我们简单的介绍了下Redis的整体情况。作为集中式缓存的优秀代表,Redis可以帮助我们在项目中完成很多特定的功能。Redis准确的说是一个非关系型数据库,但是由于其超高的并发处理性能,及其对于缓存场景所提供的一系列能力构建,使其成为了分布式系统中的集中缓存的绝佳选择。Redis对于缓存能力场景的支持,除了基础的缓存增删改查,还支持对记录的过期时间设定,支持多种不同的数据淘汰策略等等。此外为了解决内存型组件数据可靠性问题,
2023-01-12一、Mybatis中缓存机制1、一级缓存(1)概述:一级缓存(即本地缓存或SqlSession级别缓存)(2)特点:①一级缓存默认开启②不能关闭③可以清空(3)缓存原理①当第一次获取数据时,需要先从数据库中加载数据,将数据缓冲到Mybatis一级缓存中(缓存底层实现原理是Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数)②以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据(4)一级缓存五种失效情况①不同的SqlSession对应不同的一级缓存(例如:将第一次查询的sqlSession关闭了,之后开启一个新的sqlSes
2023-01-12一、Mybatis中缓存机制1、一级缓存(1)概述:一级缓存(即本地缓存或SqlSession级别缓存)(2)特点:①一级缓存默认开启②不能关闭③可以清空(3)缓存原理①当第一次获取数据时,需要先从数据库中加载数据,将数据缓冲到Mybatis一级缓存中(缓存底层实现原理是Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数)②以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据(4)一级缓存五种失效情况①不同的SqlSession对应不同的一级缓存(例如:将第一次查询的sqlSession关闭了,之后开启一个新的sqlSes
一、什么是java反射?在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后new类名()方式来获取该类的对象。也就是说我们需要在写代码的时候(编译期或者编译期之前)就知道我们要实例化哪一个类,运行哪一个方法,这种通常被称为静态的类加载。但是在有些场景下,我们事先是不知道我们的代码的具体行为的。比如,我们定义一个服务任务工作流,每一个服务任务都是对应的一个类的一个方法。服务任务B执行哪一个类的哪一个方法,是由服务任务A的执行结果决定的服务任务C执行哪一个类的哪一个方法,是由服务任务A和B的执行结果决定的并且用户不希望服务任务的功能在代码中写死,希望通过配置的方式执行不同的程