随笔分类 - Java
摘要:基本认识 LinkedHashMap位于java.util包,于JDK1.4引入,属于Java Collections Framework的成员。查看其UML关系如下图所示: HashMap在很多场景下都满足K-V的存取,而且在非多线程的场景下也能保持不错的性能,但是HashMap有一个缺点就是不能
阅读全文
摘要:前言 HashMap是是Java Collections Framework的成员,位于java.util包,在JDK1.2引入。其数据存储形式是基于K-V键值对形式进行存储,HashMap中的key不能重复,允许且只能存在一个null值。如果多次put同一个key会进行值覆盖,对于value则没有
阅读全文
摘要:基本使用 ReentrantLock,位于java.util.concurrent包,于JDK1.5引入,一种可重入互斥Lock ,其基本行为和语义与使用synchronized方法和语句访问的隐式监视器锁相同,但具有扩展功能。 ReentrantLock的使用也很简单,在源码注释中可以看到使用的推
阅读全文
摘要:基本概念 字节码动态代理运用了代理模式、字节码操作、反射等技术,在介绍常见字节码操作类库前,先了解一下一些基本概念。 名词解释 字节码文件:Java源代码经过编译后生成的二进制流文件,通常一个接口或者一个类对应一个class文件,但是由于动态字节码技术的存在一个字节码并不一定对应一个真实的磁盘文件。
阅读全文
摘要:基本概念 CAS(Compare And Swap)是一种比较交换算法,很多人会把CAS和自旋锁混为一谈,两者还是有差别,前者是一种原子算法,目的是在不使用操作系统互斥信号量的重量级锁的前提下提供一种原子操作,后者基于CAS算法实现。 操作系统底层对CAS的都提供了不同的指令级实现: x86 cmp
阅读全文
摘要:在计算机的发展历史中,有这样两大定律Amdahl定律和摩尔定律,这两个定律的更替代表了近年来硬件发展从追求CPU频率到追求多核心并行处理的发展过程。 Amdahl定律通过系统并行化与串行化的比重来描述多CPU系统能获得的运算加速能力。 摩尔定律用于描述CPU晶体管数量与运行效率之间的关系。 多任务处
阅读全文
摘要:前言 操作系统中,一个进程往往代表着一个应用程序实例,而线程是进程中轻量级的调度单元,也可以看作是轻量级的进程,可以共享进程资源。下面简单介绍在操作系统中线程通用实现方式。接下来内容主要对线程模型进行简单介绍,然后对Java线程实现Thread类进行了解。 线程模型 暂且抛开Java线程,先说明一下
阅读全文
摘要:前言 创建一个新的线程可以通过继承Thread类或者实现Runnable接口来实现,这两种方式创建的线程在运行结束后会被虚拟机销毁,进行垃圾回收,如果线程数量过多,频繁的创建和销毁线程会浪费资源,降低效率。而线程池的引入就很好解决了上述问题,线程池可以更好的创建、维护、管理线程的生命周期,做到复用,
阅读全文
摘要:前言 ThreadLocal直译为线程局部变量,或许将它命名为ThreadLocalVariable更为合适。其主要作用就是实现线程本地存储功能,通过线程本地资源隔离,解决多线程并发场景下线程安全问题。 ThreadLocal 接下来,通过ThreadLocal的使用案例、应用场景、源码分析来进行深
阅读全文
摘要:初识String String位于java.lang包中,从JDK1.0时期引入,不需要导包就可以直接使用。一个Java应用程序中使用最多的可能就是String对象了。由于其使用的广泛性,几乎在每一代的JDK优化升级中都存在对String的优化。 JDK7中字符串常量池从方法区迁移到堆内存中,对字符
阅读全文
摘要:Java SPI(Service Provider Interface),是JDK提供的一套用来被第三方实现或者扩展的接口,通过java.util.ServiceLoader类加载META-INF/services/中的配置进行服务发现,可以用来启用框架扩展和替换组件。主要好处在于解耦,可拔插,面向
阅读全文
摘要:前言 世界上并没有完美的程序,因为写程序本来就是一个不断追求完美的过程。同样没有一门语言在一诞生就是完美的,不变的唯有变化。Java诞生至今已经不仅仅是一门语言,背后所涵盖的是一个庞大的技术体系。 网上每隔一段时间就能见到几条“未来X语言将会取代Java”的新闻,此处“X”可以用Kotlin、Gol
阅读全文
摘要:前言简介 Java中提起synchronized很多人第一反应就是锁,这是不准确的,翻译一下中文意思为同步,锁是概念,抽象名词,同步是动作,操作结果。 由于翻译不准确导致理解上的偏差,好比Robust翻译为中文意思是健壮的,这也是我们学习Java时讲到一个特性,但是有的地方音译为“鲁棒性”,假如有人
阅读全文
摘要:简介 基于springboot,mybatis plus集成了一套多数据源的解决方案,在使用时引入相应的插件dynamic-datasource-spring-boot-starter,可以实现数据源的动态添加、删除等功能,对于多租户或者分库等操作可以根据AOP切面代理到不同的数据源、实现单一系统数
阅读全文
摘要:最近项目种引入了mybatis-plus框架,看名字就知道了mybatis的增强版,以下简称MP。 官方描述: MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做
阅读全文
摘要:在开发中,涉及到性能问题,需要进行,内存、CPU、线程等分析,这个时候就要借助一些内存分析工具来实现,辅助IDEA中包含的插件,介绍常用的一些插件。 VisualVM Launcher 下载地址 https://visualvm.github.io/pluginscenters.html JProf
阅读全文
摘要:##业务场景 最近公司的一个老项目有一个需求,需要根据后台管理员维护的时间来做一个定时任务的推送,用来推送企业微信的一些提醒消息,这个时间由于是业务人员操作,还有不确定性,其次还要受制于项目现有技术栈的限制,感觉有点难搞,还好项目在解决登录共享session的时候引入了redis,最开始的思路把维护
阅读全文
摘要:什么是异常 正如文档开头所说,世界上并没有完美的程序,程序在运行中可能会存在着异常状态,这种异常状态,可能是异常(Exception),也可能是错误(Error),一个健壮性的程序就要考虑程序可能存在的异常状态,并对其进行处理。Throwable类是Java中所有错误和异常的超类,位于java.la
阅读全文
摘要:如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言Java也可以写出优雅的函数式调用,学习的过程并不复杂,当你学会了Java8中函数式编程的新特性,你
阅读全文
摘要:Java8中提供了许多新特性,其中之一就是函数是编程,官方提供了一些常用的函数式接口,基本已经满足日常使用,简单介绍一下常用的一些函数式接口。 ##消费型接口Consumer<T> /** * 消费型接口 void accept(T t); * @param count * @param consu
阅读全文