![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 92
我思知我在
内容简洁、更喜欢用图文并茂的方式展示文章内容
如果喜欢我就一键三连吧!!!
展开
-
Java 线程池ThreadPoolExecutor的应用与源码解析
ThreadPoolExecutor 应用ThreadPoolExecutor就像AQS一样,是属于比较底层的,也可以说是线程池的基础,我们平时所用到的CachedThreadPool、FixedThreadPool、ScheduledThreadPool、SingleThreadExecutor等都是基于ThreadPoolExecutor,通过对ThreadPoolExecutor的构造函数进行设置实现不同功能的线程池CachedThreadPool:创建一个可缓存线程池,如果线程池长度超过实际原创 2021-01-07 23:01:58 · 2641 阅读 · 0 评论 -
Java 并发编程CAS、volatile、synchronized原理详解
CAS(CompareAndSwap)What–CAS在Java中调用的是Unsafe的如下方法来CAS修改对象int属性的值: /** * * @param o 对象所在类本身的对象(一般这里是对一个对象的属性做修改,才会出现并发) * @param offset 属性在对象中的相对偏移量位置(获取偏移量也是通过unsafe的⼀个⽅法: objectFieldOffset(Fieldfield)来获取属性在对象中的偏移量;) * @param exp.原创 2021-01-05 22:55:11 · 2787 阅读 · 0 评论 -
Java 并发编程Semaphore的应用与源码解析
WhatSemaphore标识信号量,允许指定数量的线程同时访问某个资源How通过以下两部实现信号量:acquire方法用于获得准入许可(如果没有获得许可,则进行等待,直到有线程释放许可而获得许可为止)release用于释放准入许可应用场景实现某种资源池限制,类似于数据库连接池对容器施加边界,比如一个集合中最多只能添加5个元素资源并发访问数量限制当作普通的锁使用(信号量为1时相当于普通的锁 信号量大于1时共享锁)Semaphore代码示例import java.util.c原创 2020-12-29 22:47:54 · 2570 阅读 · 0 评论 -
Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)
什么是CyclicBarrier?CyclicBarrie和上一篇中讲到CountDownLatch很类似,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于:所有必须同时到达栅栏位置才能够继续执行。也就是闭锁用于等待某个事件,栅栏用于等待其它线程CyclicBarrier的基本过程CyclicBarrier可以使一定数量的线程反复的在栅栏处汇集。当线程到达栅栏位置时将调用await方法,直到所有方法都到达栅栏位置当所有线程都到达栅栏位置后,那么栅栏将打开,所有的线程将被释放栅栏被原创 2020-12-29 21:21:40 · 2353 阅读 · 0 评论 -
Java 并发编程CountDownLatch的应用与源码解析
应用场景CountDownLatch是一个多线程控制工具。用来控制线程的等待。设置需要countDown的数量,然后每一个线程执行完毕后调用countDown()方法,而在主线程中调用await()方法等待,直到num个子线程执行了countDown()方法,则主线程开始继续执行示例:import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.con原创 2020-12-29 19:48:48 · 2575 阅读 · 0 评论 -
各种锁的介绍、锁之间的区别
公平锁/非公平锁 (FairSync/NotfairSync)公平锁:按照申请锁的顺序来获取锁。非公平锁:不是按照申请锁的顺序来获取锁。非公平锁的优点在于吞吐量比公平锁大。ReentrantLock可以通过构造函数来选择是公平锁or非公平锁。Synchronized也是一种非公平锁。由于是JVM控制的,所以没有任何办法使其变成公平锁。独占锁/共享锁 (ReadWriteLock 写入时——> 独占锁 读取时——> 共享锁)独享锁:指某个锁一次只能被一个线程所持有。共享锁:指原创 2020-12-29 14:58:51 · 7262 阅读 · 0 评论 -
Java 并发编程ReentrantLock--源码解析(底层AQS实现)
ReentrantLock 介绍ReentrantLock类使用AQS同步状态来保存锁重复持有的次数。当锁被一个线程获取时,ReentrantLock也会记录下当前获得锁的线程标识,以便检查是否是重复获取,以及当错误的线程试图进行解锁操作时检测是否存在非法状态异常。ReentrantLock 使用示例ReentrantLock lock = new ReentrantLock();try{ lock.lock(); // 其它逻辑} finally{ lock.unlock();}可以原创 2020-12-29 14:04:51 · 2820 阅读 · 0 评论 -
Java 并发编程AQS--源码解读
AQS的源代码实现AQS主要通过独占式、共享式同步状态的获取和释放,接下来我们来看下AQS代码是如何实现的源代码实现公平锁与非公平锁公平锁非公平锁Node节点在AQS中,是使用队列的方式来实现同步管理的,我们先来认识下队列中的Node节点数据结构 static final class Node { /** * 共享模式节点 */ static final Node SHARED = new Node();原创 2020-12-29 10:55:12 · 2686 阅读 · 0 评论 -
Java 并发编程AQS基本介绍
why-为什么需要AQS?原创 2020-12-23 22:01:04 · 2835 阅读 · 1 评论 -
Java 并发编程概念深入理解
why-为什么要有多线程?单线程情况下:在有IO操作的情况下,线程是在阻塞的,cpu什么事情也不干,直到IO操作完成如果没有IO操作且是单核cpu,可以是单线程多线程的情况下:有IO操作的情况下,分配其中一条线程去等待IO操作,让cpu去执行另一个线程的计算任务,直至IO操作完成,cpu切换到原来的线程继续执行任务在有用户交互的情况下,多线程是必须的what-什么是线程?它和进程有什么区别?进程进程是资源管理的最小单位进程拥有更多的系统权限:地址空间(Address space)公原创 2020-12-20 17:26:22 · 2595 阅读 · 0 评论 -
SWT实现Text输入自动提示
/** * 生成自动提示 * * @param textObj * 要自动提示的文本控件 */ private void createAutoTip(Text textObj, String[] proposals) { textContentAdapter = new TextContentAdapter() { /** * 在控件中添加该关键字 * * @param control * @param tex..原创 2020-10-31 09:56:13 · 4007 阅读 · 0 评论 -
如何继承SWT组件?
extends 组件并实现super(parent, style);重写checkSubclass方法,取消子类验证检查@Overrideprotected void checkSubclass(){ }原创 2020-10-31 09:53:17 · 3593 阅读 · 0 评论 -
System.getProperty("user.dir") 获取jar包所在目录
/** 获得当前类的完整路径。最后一句 */ package org.outman.dms.server; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException;转载 2017-11-17 13:25:11 · 7452 阅读 · 0 评论 -
一文快速理解Java反射(详细对比图)
反射在java中使用频率还是比较高的,比如JDK动态代理使用反射获取到目标类所有的接口列表。还有我们熟悉的JDBC获取驱动,Class.forName(“com.mysql.jdbc.Driver”)定义在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。术语RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象.原创 2020-10-24 22:53:07 · 3840 阅读 · 0 评论 -
Spring boot logback的使用(日志记录)
1 在spring boot中已经自动包含了logback的jar包,如果不是spring boot需要在maven中导入依赖<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --><dependency> <groupId>ch.qos.logback</groupId> <artifac原创 2017-11-30 20:34:37 · 3595 阅读 · 0 评论 -
Spring Boot拦截器(WebMvcConfigurerAdapter)
直接按我的步骤走都没有问题:1 配置自定义的拦截器:package com.configs;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.servlet.HandlerInt原创 2017-11-16 14:45:28 · 3269 阅读 · 0 评论 -
Spring Boot 中使用MyBatis Mapper方式(xml)
1 移动原有的**Mapper.xml格式的文件到Resource静态资源文件2 在Application.java 中添加Mapper扫描 @MapperScan("com.dao") 3 在applicationl.properties中配置指定的Mapper.xml文件位置:mybatis.mapper-locations=classpath:mapper/*Mapper.xm原创 2017-11-15 17:18:14 · 3549 阅读 · 1 评论 -
maven 连接sqlserver
1 在微软官网下载sqljdbc的jar包:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=117742 在有sqljdbc4.jar包的文件夹下,通过shift+右键的方式--》此处打开命令窗口,然后执行以下maven命令mvn install:install-file -Dfile=s原创 2017-11-15 16:42:04 · 6731 阅读 · 0 评论 -
垃圾收集六大算法全面理解
计数法算法描述通过分析对象被引用的次数来判断是否可以被回收不足最古老的垃圾收集算法无法处理两个对象循环引用问题性能问题标记清除算法(Mark-Sweep)算法描述仅清理标记的,未标记的不做任何处理。如图可知,仅仅是把一些可以回收的对象及逆行了回收,其它存活对象和未使用的区域不做任何处理优点实现简单兼容保守式GC算法(保守式GC对象是无法移动的)不足内存空间碎片化严重效率问题(分块不连续,分配大对象需要寻找合适的内存空间)复制算法(Coping)算法描原创 2020-11-14 15:24:54 · 3326 阅读 · 0 评论 -
JVM类加载理解(线程上下文类加载器、Tomcat类加载器)
类加载机制概念Java虚拟机把描述类的class文件加载到内存,对其进行校验、转换解析、初始化等操作,最终得到可以被虚拟机直接使用的java类型,这就是虚拟机的加载机制。加载将class文件读入到内存中,并将其放在运行时数据区的方法区内,然后在堆中创建一个java.lang.Class对象,用来封装在方法区的数据结构。在这个阶段,主要完成如下三件事:通过一个类的全限定名获取此类的二进制字节流(Class文件)。而获取的方式可以通过jar、war、zip、网络等方式将字节流静态存储结构转换为原创 2020-11-05 16:43:50 · 3917 阅读 · 0 评论 -
JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
一个类创建实例的时候,需要经过多个步骤,比如我们调用new的时候经过了哪些流程,本文就来详细分析下内存分配内存分配整体流程步骤1检查该指令参数是否能够在常量池中定位到这个类的符到引用检查这个符号引用所代表的类是否已加载、解析、初始化。如果没有则执行类加载过程步骤2内存分配根据java堆内存是否绝对规整,分为:指针碰撞&空闲列表指针碰撞法:假设堆中内存完整,一分配的内存和空闲内存分别在不同的一侧,这时通过一个指针为分界点,需要分配内存时将指针往空闲的一端移动与对象大小.原创 2020-11-05 12:18:16 · 4549 阅读 · 2 评论 -
一文学会JVM常见参数设置+调优经验(JDK1.8)
内存管理参数本参数以JDK1.8为基础进行整理,目前默认参数大概有660个左右,使用java -XX:+PrintFlagsFinal -version可以输出所有参数的名称及默认值名词解释-XX:开头的参数代表虚拟机非稳定参数-XX:+ 开启option参数-XX:- 关闭option参数-XX:= 将option参数的值设置为valueJVM设置经验客户端应用-Xverify:none-XX:+UseG1GC-XX:MinHeapFreeRatio=10-XX:MaxHeap原创 2020-10-13 22:01:21 · 5940 阅读 · 1 评论 -
一行命令轻松获取JVM默认配置
jvm默认有非常多的配置,而这些配置我们可以依据实际场景和情况进行调整与修改,比如UseG1GC、MaxDirectMemorySize、SurvivorRatio等配置都在里面,不同环境下配置也不同,可以通过此方式查看配置环境win10 家庭中文版4v16GBjdk1.8.0_201 win32配置如果要查看jvm的全部默认配置,使用命令:java -XX:+PrintFlagsFinal -versionC:\Users\RX1270.000>java -XX:+PrintF.原创 2020-10-13 20:16:25 · 3806 阅读 · 0 评论 -
Java OOM异常原因及解决方案
Java堆溢出现象java.lang.OutOfMemoryError: Java heap space原因大量对象没有释放,无法回收解决方案使用内存映像分析工具分析 Dump 出来的堆转储快照,分析对象是是否合理存在,可以排查是内存泄露还是溢出如果内存泄露,工具查看泄漏对象到 GC Root 的引用链,定位出泄漏的位置;如果不存在泄漏,检查虚拟机堆参数(-Xmx 和 -Xms)是否可以调大配置配置 -XX:HeapDumpOnOutOfMemoryError,在发生内存溢原创 2020-10-11 17:34:53 · 6141 阅读 · 8 评论 -
一文读懂Java七大垃圾回收器
java和c++最大的不同就是java中不需要手动去回收对象,在运行时jvm会自动帮我们进行垃圾回收,接下来让我们揭开垃圾收集器的面纱名词解释并行:多条线程并行工作并发:多个线程并发执行,但他们不是并行的,有可能交交替执行吞吐量:吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))为什么要垃圾回收?不回收你养我啊,就和我们电脑磁盘满了删除文件、房间乱了整理房间一个道理什么时候回收垃圾?老年代或年轻代对象满,无法存放新对象时触发GC代码中调用System.gc(),触发Ful.原创 2020-10-11 17:13:59 · 4292 阅读 · 0 评论 -
Java 对象各种引用类型作用(强引用、软引用、弱引用、虚引用)
在java中我们用的最多的是new,但这属于强引用类型,在内存不足时,一定需要牺牲某些对象,我们需要使用其它的引用类型,比如软引用一图看懂所有引用类型:相关代码import java.util.Date;/** * 强引用,JVM停止运行时终止 * * @author 游四七 * @date 2019/9/28 */public class StrongReference { public static void main(String[] args) { .原创 2020-10-09 20:29:53 · 3011 阅读 · 0 评论 -
Java运行时内存工作过程
介绍在Java8中,运行时内存是如何工作的,对象的走向如何,Java7和Java8内存模型的变化又是什么?接下来让我给你解开谜团运行时内存基本组成如图:其中新生代又分为Eden区、SurvivorFrom、SurvivorTo三个区,这么分的目的是因为年轻代采用的是复制算法进行垃圾回收。年轻代Eden区:Java新对象都在这里(如果新对象的内存占用很大,则直接分配到老年代)。当Eden区内存不够时会触发Minor GC(新生代垃圾回收),对新生代区进行一次垃圾回收SurvivorFrom.原创 2020-10-06 18:29:24 · 3112 阅读 · 0 评论 -
JVM 内存模型组成+经典总结
Java内存模型(Java Memory Model),简称JMM,定义了JVM(Java虚拟机)在计算机内存(RAM)中的工作方式,目的是定义一个一致的、跨平台的内存模型,是隶属于JVM的。我们先来看看内存模型的组成(Java 8)其中需要注意的几个点:线程私有:私有数据区域其它线程不可见,生命周期随着线程的的启动而创建,线程结束而销毁。线程共享:所有线程可见,生命周期跟随着JVM的启动/关闭而创建/销毁直接内存:并不是JVM的一部分,可以使用native函数直接分配堆外内存,然后使用Dir原创 2020-10-06 16:08:10 · 3148 阅读 · 0 评论 -
Hotspot JVM的系统线程说明
Hotspot JVM的系统线程说明说明:JVM中所使用的线程与原生操作系统线程有着直接的映射关系,这些线程由操作系统统一调度并分配到可用的CPU上当JVM创建线程时其实就是在系统原生上创建线程 原生线程初始化完成后会调用java中的run()方法 当Java线程结束后,原生线程随之被回收在Hotspot JVM中,后台运行的线程有如下几个: 虚拟机线程 (VM Thread) 这个线程等待JVM到达安全点操作出现。这些操作位于独立的线程执行。原创 2020-10-06 14:22:23 · 3185 阅读 · 0 评论 -
LinkedList 实现原理及源码解析(jdk8 底层⽤的是链表)
LinkList顾名思义,就是通过链表实现的集合,优点就是插入、删除速度快,但遍历速度不及ArrayList,本质原因还是数据结构的不同,至于ListList和ArrayList的优缺点网上很多,这里不再赘述。前言LinkList源码其实不难,主要关注三个重要的方法和Node内部类:将新添加的元素e作为链表的最后一个元素并维护进去linkLast(E e)从链表中删除x节点的链接unlink(Node<E> x)根据传入的index值,返回对应的节点nodenode(int.原创 2020-10-30 21:22:28 · 3477 阅读 · 0 评论 -
HashMap 实现原理及源码解析(jdk8 底层⽤的是数组+链表/红⿊树)
本文会通过HashMap中的put方法为入口,进行源码解读,文章较长,需要耐心阅读说明/** */: 代表注释,区别于例子注释egx::代表例子注释解读前须知解读是通过HashMap的put方法为入口进行分析,其中eg注释的都是测试例子,具体测试代码如下:@Testpublic void testResize(){ HashMap hashMap = new HashMap(); // 下标0和1插入Node hashMap.put(0, "a0"); // 00000000 h.原创 2020-10-28 22:46:29 · 4022 阅读 · 7 评论 -
ArrayList 实现原理及源码解析(jdk8 底层⽤的是数组)
本文会主要从集合扩容、添加元素、删除元素三个方面来进行源码解读在开始解读之前,我们先来看一下ArrayList添加一个元素的流程基本在图中已经比较全面的说明了add一个元素的全流程源码解读我们先来看ArrayList中几个关键的字段/** * ArrayList默认的容量为10个Object */ private static final int DEFAULT_CAPACITY = 10; /** * 用于空实例的共享空数组实例 *.原创 2020-10-26 22:40:53 · 3731 阅读 · 3 评论 -
泛型之类型擦除和桥接方法
泛型是将类型参数化,允许定义在类、接口、方法时使用类型参数,当使用的时候指定具体类型。泛型主要应用在集合泛型的优点代码需要更精简程序更加健壮编码期,可读性很高泛型的上下限上限格式:类型名称 <? extend 类> 对象名称说明:只能接收该类型及其子类下限格式:类型名称 <? super 类> 对象名称说明:只能接收该类型及其父类型类型擦除和桥接方法泛型是给javac编译器使用,在编译器编译之后的class文件中是没有泛型信息的,所以泛型的使用不会.原创 2020-10-26 20:16:02 · 3839 阅读 · 0 评论 -
Java 文件路劲获取(流的方式),适用与jar包或war包运行方式
读取文件使用流的方式在基本的场合都不会发生错误!以下是读取文件的几种方式: public static void main(String[] args) { //获取classpath路径,就是根目录 /D:/Program/idea/DayIndicators/target/classes/ System.out.println(IndexAction.cl原创 2017-11-16 21:24:15 · 5374 阅读 · 0 评论