Java
文章平均质量分 92
c.
这个作者很懒,什么都没留下…
展开
-
Java并发编程实战之互斥锁
一谈到互斥,我们很自然就会想到了锁。首先我们把一段需要互斥执行的代码称为临界区。线程在进入临界区之前,首先尝试加锁 `lock()`,如果成功,则进入临界区,此时我们称这个线程持有锁;否则呢就等待,直到持有锁的线程解锁;持有锁的线程执行完临界区的代码后,执行解锁 `unlock()`。原创 2022-10-24 08:00:00 · 2112 阅读 · 0 评论 -
Java分布式定时任务场景的思考与设计
其实还是具体业务场景具体分析,并没有哪一套设计就是能解决一切问题的"银弹"。当有分布式定时任务的场景,就可以结合实际场景来考虑一下以上的方案。原创 2022-09-06 21:00:00 · 1161 阅读 · 0 评论 -
Java并发编程实战基础概要
Java线程之间的通信由Java内存模型(JMM)控制。JMM定义了线程和主内存之间的抽象关系在内存里,Java内存模型规定了所有的变量都存储在主内存(物理内存)中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行。不同的线程无法访问其他线程的工作内存里的内容。我们可以使用下图来表示在逻辑上线程、主内存、工作内存的三者交互关系。额外的延伸知识,从JVM的角度来看java运行时的内存区域,来对应我们Java内存模型前面我们都理解了缓存导致了可见性问题,编译优化导致了有序性问题。.....原创 2022-07-20 13:54:15 · 592 阅读 · 0 评论 -
可配置化的表达式解析以及构造JSON查询数据库实体数据的设计和实现
之前的博文《使用Spring Boot JPA Specification实现使用JSON数据来查询实体数据》和《使用Druid SQL Parser解析SQL》中都讲到了目前业务上的需求就是以前老系统是通过配置SQL去抽取一些业务数据的,但现在新系统想通过页面的一些配置化实现跟配置SQL一样去抽取数据。之前的后端实现逻辑已经在之前《使用Spring Boot JPA Specification实现使用JSON数据来查询实体数据》的博文中讲解了,本篇博文主要是结合前端去实现。最终前端的可配置效果如下:就是前原创 2022-06-17 10:55:01 · 960 阅读 · 0 评论 -
使用Druid SQL Parser解析SQL
在以前的博文《使用Spring Boot JPA Specification实现使用JSON数据来查询实体数据》中讲到了目前业务上的需求就是以前老系统是通过配置SQL去抽取一些业务数据的,但现在新系统想通过页面的一些配置化实现跟配置SQL一样去抽取数据。所以在之前的博文讲到了如何利用JPA Specification和构造的JSON数据去抽取数据。但是老系统很多历史数据都是用SQL去配置的,这些配置当然需要迁移到新系统,但是我们不可能手工一条条去把这些SQL转成当前的JSON结构,这样太浪费时间了。所以我的原创 2022-06-16 16:12:28 · 14056 阅读 · 0 评论 -
Java对象匹配以及权重筛选的设计和实现
Java对象匹配以及权重筛选的设计和实现我们先谈需求,再谈设计。现在我们有一个对象,属于类A和另一堆对象属于类B,他们不是同一个类。但是他们有一些字段是类似的,在我们要从一堆类B的对象中找到和对象A最匹配的对象B。所以我们需要从一堆类B对象中找到和对象A最匹配的对象。但是即使是最匹配也不一定是符合要求的,所以我们的原则就是既是符合原则的,又是最匹配的,而且有些字段如果匹配的话,对象的相似度会更高一些,也就是更容易命中。所以我们把需求分为两步找出所有符合需求的类B对象从这对符合的需求的对象列表中原创 2022-05-06 13:54:27 · 1170 阅读 · 0 评论 -
Java锁synchronized关键字学习系列之重量级锁
文章目录Java锁synchronized关键字学习系列之重量级锁synchronized的底层实现`monitorenter`和`monitorexit`内置锁(ObjectMonitor)重量级锁原理总结参考Java锁synchronized关键字学习系列之重量级锁synchronized的底层实现我们通过下面这段代码来了解一下synchronized的底层实现public class RnEnterLockDemo { public void method() {原创 2021-07-07 15:45:43 · 1122 阅读 · 0 评论 -
Java锁synchronized关键字学习系列之轻量级锁升级
文章目录Java锁synchronized关键字学习系列之轻量级锁升级回顾轻量级锁的加锁过程自旋什么情况下轻量级锁要升级为重量级锁呢?轻量级锁升级重量级锁参考源代码Java锁synchronized关键字学习系列之轻量级锁升级这篇博文我们来讲一下轻量级锁的升级到重量锁。我们先开快速回顾一下如何升级到轻量级锁的。回顾轻量级锁的加锁过程(1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock原创 2021-07-02 11:42:38 · 804 阅读 · 0 评论 -
Java锁synchronized关键字学习系列之轻量级锁
文章目录Java锁synchronized关键字学习系列之轻量级锁轻量级锁加锁原理轻量级锁释放锁原理轻量级锁重入总结参考Java锁synchronized关键字学习系列之轻量级锁轻量级锁加锁原理在代码访问同步资源时,如果锁对象处于无锁不可偏向状态,JVM首先将在当前线程的栈帧中创建一条锁记录(lock record),用于存放:displaced mark word:存放锁对象当前的mark word的拷贝(为了解锁的时候恢复给锁对象,后面会说)owner指针:指向当前的锁对象的指针,在拷贝原创 2021-06-24 14:04:33 · 921 阅读 · 2 评论 -
Java锁synchronized关键字学习系列之偏向锁升级
文章目录Java锁synchronized关键字学习系列之偏向锁升级无锁偏向锁原理批量重偏向和批量撤销偏向锁升级偏向锁升级轻量级锁偏向锁升级重量级锁参考源代码Java锁synchronized关键字学习系列之偏向锁升级前面几篇博文已经简单介绍了偏向锁了。《Java锁synchronized关键字学习系列之偏向锁》 还有《Java锁synchronized关键字学习系列之批量重偏向和批量撤销》这篇博文我们来更进一步的来讲一讲偏向锁的升级。无锁之前我们提到过偏向锁开启的延迟时间,在这个偏向延迟内对象处原创 2021-06-09 13:54:43 · 299 阅读 · 2 评论 -
Java锁synchronized关键字学习系列之批量重偏向和批量撤销
文章目录Java锁synchronized关键字学习系列之批量重偏向和批量撤销Java锁的重偏向机制Java锁的批量撤销机制参考源代码Java锁synchronized关键字学习系列之批量重偏向和批量撤销这个系列的上一篇博文我们讲到了《Java锁synchronized关键字学习系列之偏向锁》我们在讲偏向锁加锁的时候讲到了其中一步会判断是否开启重偏向,那到底啥事重偏向?为啥叫是否开启重偏向,说明这个重偏向机制并不是一直都是开启的。 今我们就来研究一下。Java锁的重偏向机制我们知道,当我们使用s原创 2021-05-28 14:57:56 · 703 阅读 · 1 评论 -
你还不会使用Guava处理字符串? 那你还不进来学习?
文章目录你还不会使用Guava处理字符串? 那你还不进来学习?连接器[Joiner]拆分器[Splitter]参考源代码你还不会使用Guava处理字符串? 那你还不进来学习?连接器[Joiner]用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有null,那连接操作会更难。但是连接器Joiner让我们连接字符串变得更加简单比如我们现在一个字符串的集合,然后我们需要用‘#’来把这个集合中的数据连接起来,用Joiner怎么做呢?public class JoinerTest原创 2021-05-27 15:29:25 · 188 阅读 · 0 评论 -
如果你想知道什么是Guava不可变集合,那我就带你研究
文章目录带你研究Guava中的不可变集合JDK中提供了Collections.unmodifiableXXXGuava中不可变集合的使用方法of方法copyOf方法Builder方法可变集合与不可变集合对照表参考资料带你研究Guava中的不可变集合Guava是一组来自谷歌的核心Java库,其中包括新的集合类型(比如multimap射和multiset)、不可变集合、并发、I/O、散列、缓存、字符串等的实用工具。它在谷歌中的大多数Java项目中被广泛使用,也被许多其他公司广泛使用今天我们就来看一下G原创 2021-05-27 13:58:40 · 231 阅读 · 0 评论 -
JDK中提供的不可变集合真的做到了不可变吗?
文章目录JDK中提供的不可变集合真的做到了不可变?为什么需要不可变集合JDK中的不可变集合:Collections.unmodifiableXXXUnmodifiableCollection类参考链接JDK中提供的不可变集合真的做到了不可变?为什么需要不可变集合保证线程安全:在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发 的效率(跟并发锁方式相比)。尤其当一个对象是值对象时,更应该考虑采用Immutable方式;被不可信的类库使用时会很安全;如果一个对象不需要支持修改操原创 2021-05-27 09:45:31 · 282 阅读 · 0 评论 -
别告诉我Java8都出来这么久了,你还搞不懂Stream的map和flatmap的区别?
文章目录别告诉我Java8都出来这么久了,你还搞不懂Stream的map和flatmap的区别?Java8 map相关的方法Java8 flatMap相关的方法参考别告诉我Java8都出来这么久了,你还搞不懂Stream的map和flatmap的区别?Java8 map相关的方法 /** * Returns a stream consisting of the results of applying the given * function to the elements o原创 2021-05-26 10:34:52 · 264 阅读 · 1 评论 -
Java锁synchronized关键字学习系列之偏向锁
文章目录Java锁Synchronized关键字学习系列之偏向锁synchronized 锁升级偏向锁匿名偏向偏向锁的加锁和释放锁偏向锁流程图总结学习参考源代码Java锁Synchronized关键字学习系列之偏向锁synchronized 锁升级在多线程并发编程中synchronized一直都是常用的,以前很多人都会称呼它为重量级锁。但是随着Java SE 1.6 对synchronized 进行了各种优化之后,有些情况下它就并不那么重,Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗原创 2021-05-25 10:55:40 · 1059 阅读 · 1 评论 -
Java锁synchronized关键字学习系列之CAS和对象头
文章目录Java锁Synchronized关键字学习系列之CAS和对象头锁的分类和定义CASSynchronized关键字对象头Mark Word源代码Java锁Synchronized关键字学习系列之CAS和对象头关于java锁的问题,一直想找时间学习一下,但是去年一整年包括今年都太颓了感觉工作久之后还有经历了一些不开心的事情之后学习的热情就不是很足了。但是人不学习就会退步,所以还是坚持一下吧。不说这么多废话了…开始吧。谈到java锁,肯定是学习java的每个人都绕不开的问题。一谈到并发编程很自然的原创 2021-03-29 10:54:28 · 329 阅读 · 1 评论 -
Java 8 日期和时间
文章目录Java 8 日期和时间为什么Java8提供了新的日期与时间的API?简单概述Instant类Instant与Date的转换将字符串类型的Instant转换为Instantd对象Instant的加減操作Instant时间差计算Instant时间大小比较Instant详解Instant.now()转化为北京时间LocalDate类创建LocalDate的方式LocalDate获取日,月,年LocalDate的加减操作LocalDate 与 Date的转换LocalDate 与 Instant的转换Lo原创 2021-03-07 21:37:18 · 553 阅读 · 1 评论 -
深入了解和学习Java枚举Enum
文章目录深入了解和学习Java枚举Enum枚举类概念枚举类的由来反编译JAVA枚举类枚举类的主要方法枚举类对接口的实现方式枚举类统一实现抽象方法枚举对象分别实现接口中的抽象方法EnumMap用法EnumSet用法枚举类与 Switch 的配合使用利用枚举实现单例模式利用Java枚举实现策略模式参考源代码深入了解和学习Java枚举Enum枚举类概念一个类的对象是有限个,确定的,我们称此为枚举类。当需要定义和维护一组常量时,强烈建议使用枚举类。如果一个枚举类中只有一个对象,则可以作为单例模原创 2021-02-18 13:49:53 · 409 阅读 · 3 评论 -
Java高性能本地缓存框架Caffeine
文章目录Java高性能本地缓存框架Caffeine如何使用缓存加载手动加载自动加载手动异步加载自动异步加载过期策略基于大小基于时间基于引用Caffeine.weakKeys()Caffeine.weakValues()Caffeine.softValues()缓存移除invalidate(Object key)方法invalidateAll(Iterable<?> keys)方法invalidateAll()方法移除监听器(RemovalListener)Writer统计参考源代码Java高性原创 2020-11-16 16:39:22 · 3173 阅读 · 0 评论 -
Java Bean Validation
文章目录Java Bean Validationjavax.validationHibernate Validator验证模式自定义验证消息约束组(Group)`@GroupSequence`组序列级联校验方法约束声明和验证,ExecutableValidator自定义约束在Spring中使用Hibernate Validator配置ValidatorController请求参数的校验统一的校验异常错误处理方法参数验证参考源代码Java Bean ValidationBean Validation 顾名原创 2020-09-22 22:03:59 · 832 阅读 · 1 评论 -
Java HashMap底层实现和原理分析(四)
文章目录JDK1.8 HashMap介绍JDK1.8 HashMap源码分析成员变量构造方法`put(K key, V value)`方法`hash(Object key)`方法`putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict)`方法`treeifyBin(NodeJDK1.8 HashMap介绍在JDK1.8 之前 HashMap 由 数组+链表 数据结构组成的。在JDK1.8 之后 HashMap 由 数组+原创 2020-08-02 10:30:44 · 1087 阅读 · 0 评论 -
Java HashMap底层实现和原理分析(三)
Java HashMap Infinite Loop首先我先说明HashMap是非线程安全的,应该用ConcurrentHashMap。但在JDK1.7的时候,HahsMap在多线程使用的时候会产生Infinite Loop,之后在JDK1.8中进行了enhancement,但是不要认为这是线程安全了,它依旧存在线程安全问题。如果你想要线程安全,请使用ConcurrentHashMap。我们这一篇章就来探讨一下再JDK1.7中在多线程中HashMap是怎么产生死循环的。上一篇章中我们已经分析了JDK原创 2020-07-07 22:24:42 · 347 阅读 · 0 评论 -
Java HashMap底层实现和原理分析(二)
文章目录HashMap集合底层的数据结构HashMap继承关系JDK1.7 HashMap源码分析成员变量构造方法`put()`方法`inflateTable(threshold)`方法`putForNullKey(value)`方法`hash(key)`方法`indexFor(int h, int length)`方法`addEntry(int hash, K key, V value, int bucketIndex)`方法`createEntry(int hash, K key, V value, i原创 2020-07-05 16:39:23 · 350 阅读 · 0 评论 -
Java HashMap底层实现和原理分析(一)
文章目录HashMap的基本介绍HashMap 和 HashTable 区别HashMap源码分析HashMap()HashMap(int initialCapacity)HashMap(int initialCapacity, float loadFactor)tableSizeFor(initialCapacity)HashMap初始容量为什么是2的n次幂?HashMap扰动函数参考HashMap的基本介绍HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键原创 2020-06-26 21:02:36 · 575 阅读 · 0 评论 -
Java多线程高并发编程代码笔记(四)
文章目录ExecutorExecutorServiceCallableExecutorsFuture线程池FixedThreadPoolCachedThreadPoolSingleThreadPoolScheduledThreadPoolWorkStealingPoolForkJoinPool线程池的底层实现ThreadPoolExecutorFixedThreadPoolCachedThread...原创 2020-01-05 18:48:43 · 954 阅读 · 0 评论 -
Java多线程高并发编程代码笔记(三)
文章目录线程安全的单例模式多线程安全单例模式(不使用同步锁)多线程安全单例模式(使用同步方法)多线程安全单例模式(使用双重同步锁)多线程安全单例模式(延迟/懒加载 使用静态内部类)多线程安全单例模式(枚举实现)并发容器多线程卖票问题使用线程不安全的容器List使用线程安全的容器Vector在判断和操作放在同步代码块中使用队列(Queue)来实现List、MapConcurrentHashMap和...原创 2020-01-05 18:38:27 · 460 阅读 · 0 评论 -
Java多线程高并发编程代码笔记(二)
文章目录ReentrantLock可以用来代替synchronizedReentrantLock可以进行尝试锁定tryLock()ReentrantLock的lockInterruptibly方法ReentrantLock可以指定为公平锁面试题使用wait和notifyAll方法来实现使用Lock和Condition来实现ThreadLocal线程局部变量参考源代码ReentrantLock可以...原创 2020-01-05 18:35:17 · 538 阅读 · 0 评论 -
Java多线程高并发编程代码笔记(一)
文章目录sychronized new一个对象作为锁sychronized 锁定自身对象sychronized 锁定静态方法synchronized 锁住线程的run方法同步方法与非同步方法是否可以同时调用?对业务写方法加锁,对业务读方法不加锁,容易产生脏读问题一个同步方法可以调用另外一个同步方法吗?在继承中,子类重写的同步方法可以调用父类的同步方法吗?出现异常,默认情况下锁会被释放volatil...原创 2020-01-05 18:21:41 · 1085 阅读 · 2 评论 -
AOP实现原理之CGLIB字节码增强
AOP实现原理之CGLIB字节码增强没有接口,只有实现类。采用字节码增强框架cglib,在运行时创建目标类的子类,从而对目标类进行增强。CGLIB字节码增强实现首先我们需要target目标类public class UserServiceImpl{ public void addUser() { System.out.println("addUser()...原创 2019-05-03 23:33:58 · 995 阅读 · 0 评论 -
AOP实现原理之JDK动态代理
JDK动态代理JDK动态代理是Spring AOP底层实现的方式之一。JDK动态代理 对“装饰者”设计模式 简化。使用前提:必须有接口。JDK动态代理实现首先我们需要有target目标类,也就是我们需要接口+实现类首先我们创建一个UserService的接口public interface UserService { public void addUser(); public ...原创 2019-05-03 16:33:19 · 562 阅读 · 0 评论 -
java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source)
此类问题一般在 spring版本 与 jdk版本不匹配的情况下会出现。匹配规则:spring3 + java7spring4 + java8https://blog.csdn.net/long15273620606/article/details/80554448转载 2019-04-20 23:18:36 · 199 阅读 · 0 评论 -
判断一个类是JAVA类型还是用户定义类型
/** * 判断一个类是JAVA类型还是用户定义类型 * @param clz * @return */ public static boolean isJavaClass(Class<?> clz) { return clz != null && clz.getClassLoader()...原创 2018-08-05 02:36:01 · 5422 阅读 · 1 评论 -
Java获取包或jar下面的所有class文件
import java.io.File;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.net.URLDecoder;import java.util.*;import java.util.jar.JarEntry;import java.u...原创 2018-07-23 22:34:05 · 11544 阅读 · 0 评论 -
URLConnection概述
URLConnection是一个抽象类,表示指向URL指定资源的活动连接。URLConnection类本身依赖于Socket类实现网络连接。下面来介绍一下URLConnection中的常用APIURLConnection读取首部 @Test public void test(){ try { //构造一个到指定 URL 的 URL...转载 2018-07-12 21:12:41 · 2374 阅读 · 0 评论 -
读取配置文件Properties的一种方案Thread.currentThread().getContextClassLoader() .getResourceAsStream()
Java路径 Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种: 一、URI形式的绝对资源路径 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b URL是URI的特例。URL的前缀/协议,必须是Java熟悉的。URL可以打开资源,而URI则不行。 URL和URI对象可以互相转换,使用...转载 2018-07-09 19:09:35 · 6013 阅读 · 0 评论 -
Java网络编程
网络编程概述计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。网络模型计算机网络之间以何种规则进行通信,就是网络模型研究问题。网络模型一般是指 OSI(Ope...原创 2018-06-26 17:35:08 · 366 阅读 · 0 评论 -
Java多线程
多线程概述多线程引入把备注部分的代码通过画图解释一下调用流程。这个程序只有一个执行流程,所以这样的程序就是单线程程序。 假如一个程序有多条执行流程,那么,该程序就是多线程程序。 接下来我们来看看到底什么是多线程多线程概述进程: 正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。 线程: 是进程中的单个顺序控制流,是一条执行路...原创 2018-06-26 17:22:21 · 174 阅读 · 0 评论 -
Java IO流
异常概述讲解IO流之前为什么先讲解异常和File类呢? 因为File表示的是IO流将来要操作的文件,所以我们需要学习File类。 而操作文件无非就是上传文件和下载文件,在这个操作的过程中可能出现问题, 出现问题后,我们需要对对应的代码进行处理。所以我们需要学习异常异常。异常:异常就是Java程序在运行过程中出现的错误。异常由来:问题也是现实生活中一个具体事务,也可以通过java ...原创 2018-06-26 16:45:24 · 196 阅读 · 0 评论 -
Java集合类
Java集合类关系图集合类概述为什么出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。数组和集合类同是容器,有何不同?数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。集合类的特点集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。Col...原创 2018-06-26 15:32:18 · 226 阅读 · 0 评论