
Java
文章平均质量分 79
JavaSE、JVM、多线程、锁使用笔记
星光Starsray
星光不问赶路人,时光不负有心人。
展开
-
LinkedHashMap源码及LRU实现原理
基本认识LinkedHashMap位于java.util包,于JDK1.4引入,属于Java Collections Framework的成员。查看其UML关系如下图所示:HashMap在很多场景下都满足K-V的存取,而且在非多线程的场景下也能保持不错的性能,但是HashMap有一个缺点就是不能保证元素的顺序,相比之下,LinkedHashMap就满足了这点,可以保证元素的插入顺序。Lin...原创 2022-08-30 15:52:00 · 1245 阅读 · 0 评论 -
【概念简析】浅谈Java关键字synchronized原理及使用
前言简介Java中提起synchronized很多人第一反应就是锁,这是不准确的,翻译一下中文意思为同步,锁是概念,抽象名词,同步是动作,操作结果。由于翻译不准确导致理解上的偏差,好比Robust翻译为中文意思是健壮的,这也是我们学习Java时讲到一个特性,但是有的地方音译为“鲁棒性”,假如有人这么问你你是不是一脸懵逼,同样的还有双亲委派机制,这里就不多说了。既然说到同步,那肯定就会想到异...原创 2021-11-28 19:51:00 · 355 阅读 · 0 评论 -
Java中Thread详解(一篇就够了)
前言操作系统中,一个进程往往代表着一个应用程序实例,而线程是进程中轻量级的调度单元,也可以看作是轻量级的进程,可以共享进程资源。下面简单介绍在操作系统中线程通用实现方式。接下来内容主要对线程模型进行简单介绍,然后对Java线程实现Thread类进行了解。线程模型暂且抛开Java线程,先说明一下在操作系统中,线程通用的几种实现方式。实现线程主要有三种方式。内核线程模型使用内核线程实现的方......原创 2022-05-04 21:11:00 · 37632 阅读 · 5 评论 -
Java 合并多个文件内容到一个文件(递归遍历某个文件夹下所有文件)
这段代码通过Java I/O流API实现将多个文件合并到一个文件中,输出为文本文件,提供一个支持语法高亮的网站,http://www.codeinword.com/适合粘贴代码到word文档,小巧实用,希望可以帮到有需要的你。/** * @author Vincente * @date 2020/08/09-21:48 * @desc **/public class MergeFi...原创 2020-08-10 17:06:00 · 2349 阅读 · 0 评论 -
Java内存模型
在计算机的发展历史中,有这样两大定律Amdahl定律和摩尔定律,这两个定律的更替代表了近年来硬件发展从追求CPU频率到追求多核心并行处理的发展过程。Amdahl定律通过系统并行化与串行化的比重来描述多CPU系统能获得的运算加速能力。摩尔定律用于描述CPU晶体管数量与运行效率之间的关系。多任务处理的场景已经是现代计算机必不可少的能力了,这包括多核并行和单核并发。而上层应用程序开发大部分时............原创 2022-06-21 10:17:00 · 301 阅读 · 1 评论 -
Java中常见内存溢出模拟及错误分析
在JVM虚拟机规范中,Java虚拟机运行时数据区域除了程序计数器(Program Counter Register)外都有可能出现OutOfMemoryError的情况,使用Hotspot虚拟机简单的模拟堆栈内存溢出的场景,方便快速定位是什么区域的内存溢出。堆通过VM参数设置Java堆的大小,避免堆可扩展内存(设定-Xms和Xmx一样可避免堆自动扩展);通过设定-XX:+HeapDumpO...原创 2020-04-05 18:39:00 · 298 阅读 · 0 评论 -
Java8 常用函数式接口
Java8中提供了许多新特性,其中之一就是函数是编程,官方提供了一些常用的函数式接口,基本已经满足日常使用,简单介绍一下常用的一些函数式接口。消费型接口Consumer<T>/** * 消费型接口 void accept(T t); * @param count * @param consumer */public static void consumer(int co...原创 2020-09-06 17:32:00 · 150 阅读 · 0 评论 -
Java运行时数据区
Java中对象创建,内存分配,垃圾回收的权力交给了虚拟机,这其中有利也有弊,程序员也减轻了负担,但是如果不熟悉Java的内存区域划分,一旦出现内存溢出和泄漏,将会很难定位问题的根源,这就有必要了解Java的运行时数据区划分。方法区(Method Area)是由各个线程共享的内存区域,用来存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。堆(Heap)...原创 2020-04-04 21:09:00 · 81 阅读 · 0 评论 -
Java8 方法引用和构造方法引用
如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言Java也可以写出优雅的函数式调用,学习的过程并不复杂,当你学会了Java8中函数式编程的新特性,你一定会对他爱不释手的。下面介绍一下基于Lambda表达式简写的两种引用。避免再次看到这种代码时的尴...原创 2020-09-07 00:09:00 · 190 阅读 · 0 评论 -
Java线上问题诊断工具Arthas
常见线上问题常见的系统异常现象包括: CPU占用率过高、CPU上下文切换频率次数较高、磁盘 I/O 过于频繁、网络流量异常(连接数过多)、系统可用内存长期处于较低值(导致 oom killer)等等。Arthas简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。(摘自【官方文档】)当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 ja...原创 2021-08-05 13:38:00 · 249 阅读 · 0 评论 -
Java中ThreadLocal详解(一篇就够了)
前言ThreadLocal直译为线程局部变量,或许将它命名为ThreadLocalVariable更为合适。其主要作用就是实现线程本地存储功能,通过线程本地资源隔离,解决多线程并发场景下线程安全问题。ThreadLocal接下来,通过ThreadLocal的使用案例、应用场景、源码分析来进行深层次的剖析,说明如何避免使用中出现问题以及解决方案。使用案例前面提到关于ThreadLocal.........原创 2022-05-03 23:52:00 · 17311 阅读 · 3 评论 -
Java发展历程时间线
前言世界上并没有完美的程序,因为写程序本来就是一个不断追求完美的过程。同样没有一门语言在一诞生就是完美的,不变的唯有变化。Java诞生至今已经不仅仅是一门语言,背后所涵盖的是一个庞大的技术体系。网上每隔一段时间就能见到几条“未来X语言将会取代Java”的新闻,此处“X”可以用Kotlin、Golang、Dart、JavaScript、Python等各种编程语言来代入。这大概就是长期占据编...原创 2022-02-08 19:25:00 · 2129 阅读 · 0 评论 -
代理设计模式及Java常见代理实现(JDK Proxy、Cglib、ASM、javassist)
基本概念字节码动态代理运用了代理模式、字节码操作、反射等技术,在介绍常见字节码操作类库前,先了解一下一些基本概念。名词解释字节码文件:Java源代码经过编译后生成的二进制流文件,通常一个接口或者一个类对应一个class文件,但是由于动态字节码技术的存在一个字节码并不一定对应一个真实的磁盘文件。字节码中的二进制可以被转换为16进制,Java虚拟机在加载读取class文件时以字节为单位,这也...原创 2022-07-07 23:20:00 · 639 阅读 · 0 评论 -
Java中String类原理详解
初识StringString位于java.lang包中,从JDK1.0时期引入,不需要导包就可以直接使用。一个Java应用程序中使用最多的可能就是String对象了。由于其使用的广泛性,几乎在每一代的JDK优化升级中都存在对String的优化。JDK7中字符串常量池从方法区迁移到堆内存中,对字符串常量池容量进行扩容。JDK8前String底层存储为char[ ],在JDK9中开始使用by...原创 2022-03-25 01:05:00 · 2083 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor详解(一篇就够了)
前言创建一个新的线程可以通过继承Thread类或者实现Runnable接口来实现,这两种方式创建的线程在运行结束后会被虚拟机销毁,进行垃圾回收,如果线程数量过多,频繁的创建和销毁线程会浪费资源,降低效率。而线程池的引入就很好解决了上述问题,线程池可以更好的创建、维护、管理线程的生命周期,做到复用,提高资源的使用效率,也避免了开发人员滥用new关键字创建线程的不规范行为。说明:阿里开发手册中......原创 2022-05-03 23:56:00 · 20105 阅读 · 0 评论 -
Java8 Lambda表达式
说到Java8新特性,就算没使用过的人估计也会说函数式编程,Lambda表达式,到底该怎么使用呢,第一次学习,做个简单笔记记录一下。Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包什么是...原创 2020-06-29 18:39:00 · 128 阅读 · 0 评论 -
【概念简析】浅谈Java SPI机制的理解及应用
Java SPI(Service Provider Interface),是JDK提供的一套用来被第三方实现或者扩展的接口,通过java.util.ServiceLoader类加载META-INF/services/中的配置进行服务发现,可以用来启用框架扩展和替换组件。主要好处在于解耦,可拔插,面向接口编程,本质是基于接口的编程+策略模式+约定配置文件组合实现的动态加载机制。这种思想被广泛...原创 2022-02-10 20:54:00 · 288 阅读 · 0 评论 -
Java枚举类
为什么要用枚举类什么场景会用到枚举,比如在表示一周的某一天,一年中的四季,这样一组常量的时候我们会用到枚举。在Java引入枚举类之前常用一组int常量来表示枚举,这种方式称为int枚举模式(int enum pattern)。private static final int MONDAY = 1;private static final int TUESDAY = 2;private s...原创 2020-02-11 17:01:00 · 163 阅读 · 1 评论 -
Java 异常
什么是异常正如文档开头所说,世界上并没有完美的程序,程序在运行中可能会存在着异常状态,这种异常状态,可能是异常(Exception),也可能是错误(Error),一个健壮性的程序就要考虑程序可能存在的异常状态,并对其进行处理。Throwable类是Java中所有错误和异常的超类,位于java.lang包,从JDK1.0开始引入。Throwable有两个子类Exception(Java中所有异常...原创 2021-01-09 15:06:00 · 84 阅读 · 0 评论 -
Java 多线程Thread
基本概念Java语言是支持多线程的,一个正在运行的Java程序可以称之为一个进程(process),在每个进程里面包含多个线程,线程是进程中单一的顺序控制流,CPU在执行计算机指令的时候都是按顺序执行,但是由于其执行速度很快,可以把时间分成很细小的时间片,交替执行,线程和进程的区别在于创建进程的开销大于创建线程的开销,进程之间的通信比线程间要难线程不能独立存在,依托于进程而存在,线程也可...原创 2021-01-09 15:10:00 · 157 阅读 · 0 评论 -
VisualVM 插件安装
https://visualvm.github.io/pluginscenters.html原创 2021-02-24 09:47:00 · 196 阅读 · 0 评论 -
Java普通JSON转为树状JSON
package com.xxx.xxx.elearning.util;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.muyuan.platform.elearning.entity.TreeNode;import lombok.extern.slf4j.Sl...原创 2021-03-19 21:06:00 · 1087 阅读 · 0 评论 -
Java线程池Executor
为什么使用线程池创建线程可以继承Thread类或者实现Runnable接口,根据线程的生命周期,这两种方式创建的线程在运行结束后会被虚拟机销毁,进行垃圾回收,如果线程数量过多,频繁的创建和销毁线程会浪费资源,降低效率,线程池的引入就很好解决了这一问题,线程执行结束后,不立即销毁,而是让线程复用,大大提高了效率。在实际生产中,阿里开发手册中明确指出,线程资源必须通过线程池提供,不允许在应用中显式的创建线程。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。Execu原创 2021-05-18 09:35:54 · 370 阅读 · 1 评论