Java
文章平均质量分 76
F_Hello_World
这个作者很懒,什么都没留下…
展开
-
Java中J.U.C包下锁的基础-AQS分析
对于锁的作用,简单保证临界区(多个线程,进程同时访问的区域,最终我们希望只有一个线程进去执行操作的区域)中数据的一致性,不会因为在并发的时候出现脏数据,错乱数据。对于java中存在的锁有两种,第一个以Synchronized关键字,第二也是今天重要说明的以AQS(AbstractQueuedSynchronizer)为核心的基于此框架衍生的各种锁。在java中我们可以从不同的纬度来看待锁,如下脑图所示:我们可以看到除了Automi各实现,以及Synchronized关键字,基本上java中的原创 2020-07-30 13:01:48 · 236 阅读 · 0 评论 -
Synchronized原理和jdk1.8后的优化
Synchronized关键字使用较多的形式如下所示:1:以synchronized同步代码块的形式synchronized(Object){ //代码}2:对一个方法进行synchronized声明,进而对一个方法进行加锁来实现同步。如下面代码public synchornized void test(){ //代码}上述中其实都是对对象加锁,对于第...原创 2020-03-07 02:21:07 · 11029 阅读 · 8 评论 -
Java实现LRU算法
LRU算法LRU(Least recentlyused)—最近最少被使用算法。在一些内存算法表现中若在一个内存有限的环境中,出现内存不足时为了保证程序的正常运行,会将一些价值较低的对象(如何来评定一个对象的价值的高低,对于LRU算法来说:如果数据最近被访问过,那么将来被访问的几率也更高,那么对应的价值就越高)进行清除,空出内存空间。计算机操作系统基础理论中有一个经典理论:最近使用的页面数...原创 2020-01-10 19:30:14 · 501 阅读 · 0 评论 -
Java中LinkedHashMap底层实现
目录序言:1:LinkedHashMap中的put(key,value)1.1:LinkedHashMap中对putVal()方法源码描述:1.2:LinkedHashMap中对节点操作方法源码描述:1.3:LinkedHashMap中afterNodeAcces()方法源码描述:1.4:LinkedHashMap中afterNodeInsertion()方法源码描述:...原创 2020-01-09 17:40:32 · 339 阅读 · 0 评论 -
Java中引用的概念
序言:Java对于引用概念经历过两个时期,JDK1.2之前和JDK1.2之后。在JDK1.2以前Java对于引用的定义很传统,如果reference类型的数据中存储的数值指定是另外一块内存的起始地址,就称为这块内存代表着一个引用.这个定义过于狭隘,在整个应用中对象就存在两种状态存在引用或者不存在。这样会产生一定的问题,对于我们应用系统存在于一些对象只在初始化使用一次(却被其它对象引用),存在一...原创 2019-12-15 22:37:30 · 755 阅读 · 0 评论 -
Java垃圾回收机制理解一:垃圾回收算法
概叙:之前描述了Java内存区域的分布,我们知道了虚拟机栈,本地方法栈,程序计数器3个内存区域是各自线程私有的,和线程同生同死。而虚拟机栈中栈帧中分配的内存的区域是随着栈帧的出栈也会跟着消亡。所以这几块区域的内存我们不需要过多的考虑的问题。但是java中堆中和方法区中内存是共享的,在堆中创建的实例对象可能会被多个线程所共有,这时候某一个线程的消亡并不能决定该实例对象是否需要回收。那么我们就会产...原创 2019-12-18 18:57:07 · 279 阅读 · 1 评论 -
Java中Unsafe类
Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概...原创 2019-12-11 12:02:50 · 266 阅读 · 0 评论 -
Java中的逃逸分析
1:JIT(Just In Time Compiler即时编译器):虚拟机为了提高执行热点代码(对于某个方法活代码块执行频率非常频繁时,认定这些代码时热点代码)的效率,在运行时会将这些代码编译为与本地平台相关的机器码,并进行各种层次优化,完成这个任务的编译器称为即时编译器。2:对象逃逸: 它并不是一种直接优化代码的手段,而是为其它优化手段提供依据的分析技术(通过此技术可以判定哪些代码可以被优化...原创 2019-12-10 21:24:08 · 1079 阅读 · 0 评论 -
JVM内存区域与内存溢出异常
序言:在java应用中,内存溢出是很常见的问题.只有了解内存区域的分布和各自负责的功能,我们才能在编写代码时注意编码质量,并且在发生溢出异常的时候能够根据异常提升快速找到溢出原因。1:JVM虚拟机所管理的内存包括以下几个区域,如图所示:1.1 Java堆内存对于我们应用环境来说,堆内存的占比是Jvm所管理内存是最大的。该内存是被所有线程所共享的,在虚拟机启动的时候被分配。...原创 2019-12-10 20:23:55 · 271 阅读 · 0 评论 -
Java中HashMap底层实现
不论在面试题中还是在我们业务代码中hashmap这一容器的出场率是非常高,那么它的底层是怎么实现的?jdk1.7和jdk1.8两者实现方式有什么不同呢?当我们调用put(key,value)时,hashmap到底是怎么保存数据的?它为何能做到get(key) 的时间复杂度为O(1)的?在JDK1.7中,HashMap采用位桶+链表实现,同一hash值的链表都存储在一个链表里。但是当位于一个桶中...原创 2019-12-06 16:41:40 · 262 阅读 · 3 评论 -
springboot2.x +kafka使用和源码分析九(KafkaListenerEndpointRegistry暂停启动容器)
我们在运行中如果需要暂停启动容器时可以通过此类KafkaListenerEndpointRegistry来处理。KafkaListenerEndpointRegistry源码(只解释了核心代码):public class KafkaListenerEndpointRegistry implements //当spring销毁bean时执行操作 Dispo...原创 2019-12-04 23:57:50 · 4067 阅读 · 0 评论 -
springboot2.x +kafka使用和源码分析八(自定义分区器)
1:DefaultPartitioner默认分区器如果producer没指定落地到指定partition中,Kafak通过默认的分区器对数据进行partition,默认的分区的规则是对key进行hash取值 % 分区数, 相同的key会分布到同一分区中。如果没指定key,则就按照轮询算法将消息均匀的分布在主题的可用分区上。/** * * 自定义分区器 */public class...原创 2019-12-04 23:13:05 · 998 阅读 · 0 评论 -
springboot2.x+kafka使用和源码分析七(消费者和生产者使用拦截器)
Apache Kafka提供了一种向生产者和消费者添加拦截器的机制,此拦截器由kafka进行管理和spring无关。所以无法使用Spring依赖注入功能。但是我们可以使用拦截器提供的config()方法来手动来获取这些bean依赖。第一步:自定义拦截器:/** * 自定义生产者拦截器 * @author fangyuan */public class PersonInfoProd...原创 2019-12-03 23:15:15 · 672 阅读 · 0 评论 -
springboot2.x +kafka使用和源码分析五(消费者配置使用)
上一章描述springboot对于kafka事务的支持,本章主要叙说springboot对于consumer支持。这里通过两种方式第一种:由springboot框架来初始化基础bean,我们只需要在yml配置文件中编写配置即可。如下图所示(常规配置 具体所有配置可参考http://kafka.apache.org/documentation/的consumer):springbo...原创 2019-12-03 20:02:57 · 1123 阅读 · 0 评论 -
springboot2.x +kafka使用和源码分析四(kafka事务)
kafka对于事务的支持(0.11.0.0客户端库开始添加了对事务的支持,kafka针对于事务机制新增名为 __transaction_state topic用以保存数据): KafkaTransactionManager:与spring提供的事务机制一起使用(@Transactional,TransactionTemplate等等)。 使用KafkaMessageListene...原创 2019-12-02 22:05:34 · 2468 阅读 · 5 评论 -
springboot2.x +kafka使用和源码分析三(生产者配置)
上一章描述springboot支持对于topic进行配置管理,本章主要叙说springboot对于produce支持。这里通过两种方式第一种:由springboot框架来初始化基础bean,我们只需要在yml配置文件中编写配置即可。如下图所示(常规配置 具体所有配置可参考http://kafka.apache.org/documentation/的producer)第二种:我们自...原创 2019-12-02 13:56:31 · 972 阅读 · 0 评论 -
springboot2.x +kafka使用和源码分析二(topic配置)
上一章我们了解到KafkaAutoConfiguration自动初始化依赖Bean,如下图所示若应用中不包含kafkaAdmin对象,KafkaAutoConfiguration为我们应用创建一个,那么kafkaAdmin这个类的作用是什么呢? @Bean @ConditionalOnMissingBean public KafkaAdmin kafkaAdmin() {...原创 2019-11-30 22:36:07 · 1800 阅读 · 0 评论 -
springboot2.x+kafka使用和源码分析六(自定义序列化器)
Apache Kafka提供了一个高级API,用于对值及其键进行序列化和反序列化。org.apache.kafka.common.serialization.Serializer<T> 序列化器 org.apache.kafka.common.serialization.Deserializer<T> 反序列化器我们可以使用Producer或Consumer配...原创 2019-11-28 12:46:24 · 629 阅读 · 0 评论 -
springboot 使用RedisTemplate构建分布式锁
话不多说直接上源码:import java.util.Collections;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.DefaultRedisScript;/** * 使用redis构建分布式锁(使用lun...原创 2019-11-25 11:16:29 · 360 阅读 · 0 评论 -
springboot自定义Actuator
Spring Boot的Actuator在应用程序中提供众多Web端点,我们可以通过它们了解应用程序允许的状态,也可以通过提供的rest接口可以获取整个依赖于spring体系中bean如何组装在一起,也可以掌握应用程序允许的环境属性消息等如何启用Actuator的端点,只需要在项目中引入Actuator的依赖:在Maven中构建 :<dependency> <...原创 2019-11-25 10:28:44 · 613 阅读 · 0 评论 -
java实现应用系统中字典统一翻译组件
字典翻译在我们应用里是一个很正常普遍的需求。对于小型项目我们可能在数据库设计层面通常不会进行分库处理,那么对于此类项目,通常字典翻译会通过sql语句的子查询来处理,如果业务系统中存在较多的字段为code值时,我们需要编写大量的子查询用于code->name 的代码。在代码层面上造成代码的冗余,在查询数据体量较大的情况并且编写sql人员的能力的不足导致查询性能问题。对于中大型项目我们可...原创 2019-11-23 15:20:04 · 1557 阅读 · 3 评论 -
java线程池(ThreadPool)的使用
java.util.concurrent.ThreadPoolExecutor类来创建完成基础poolThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit...原创 2019-11-18 16:47:25 · 175 阅读 · 0 评论