Java与JVM
文章平均质量分 66
Java与JVM
玖涯菜菜子
投资未来的人,是忠于现实的人。
展开
-
CGLIB 和 JDK 两种动态代理方法对比
Spring 动态代理时提供了 JDK 代理和 CGLIB 两种方式,一般而言,代理的目标是接口时 AOP 使用 JDK 代理来实现,CGLIB 则负责对类进行代理,两种代理方法结合使用。原创 2023-08-11 14:48:48 · 234 阅读 · 0 评论 -
在 Java 中,什么条件下两个 String 会是同一个对象?
这段时间工作上经常用遇到 String 对象比较的问题,这是一个比较基础的问题,但有时候对其原因还是有些迷惑,所以稍微总结一下。原创 2023-03-09 09:38:28 · 417 阅读 · 0 评论 -
在 Java 中,什么条件下两个 String 会是同一个对象?
这段时间工作上经常用遇到 String 对象比较的问题,这是一个比较基础的问题,但有时候对其原因还是有些迷惑,所以稍微总结一下。原创 2022-12-08 21:22:10 · 818 阅读 · 0 评论 -
Java 并发系列(二)——Semaphore源码分析
Semaphore 通常叫它信号量, 可以用来控制同时访问特定资源的线程数量,也可以用来保持资源生产者和消费者之间的资源限制关系,通过协调各个线程,以保证合理的使用资源。Semaphore 具有公平和非公平两种模式,本文通过源码对 Semaphore 的实现做简单分析。原创 2021-12-28 16:08:42 · 439 阅读 · 0 评论 -
Java 并发系列(一)——CountDownLatch源码分析
CountDownLatch 构造一个用给定计数初始化的并发计数器,能够协调多个线程之间的同步,当前线程在计数器倒计数至零之前一直等待,除非线程被中断。一般用于流程控制之类的场景,大流程分成多个子流程,子流程全部结束后大流程开始操作。原创 2021-12-27 11:32:19 · 346 阅读 · 0 评论 -
Java 集合类系列(二)——常见List源码分析
List 是对有序集合的分装,可对其中每个元素的插入位置进行精确地控制,并通过索引来访问、遍历元素。List 集合中,常用的是 ArrayList 和 LinkedList 这两个类。其中,ArrayList 底层通过数组实现,随着元素的增加而动态扩容,LinkedList底层通过双向链表来实现,随着元素的增加不断向链表的后端增加节点。原创 2021-12-15 16:22:03 · 725 阅读 · 0 评论 -
Java 集合类系列(一)——HashMap源码分析
HashMap 在 java 里用于存储 Key-Value 结构的数据,它允许 key 和 value 为 null,是一种无序并且线程不安全的集合对象。HashMap 基于 hashing 的原理,内部使用的是数组加链表的结构,在 JDK 1.8 上对查询性能进行优化,链表长度大于一定值过后链表将重构为红黑树。本文对 HashMap 源码进行分析,了解其实现原理。原创 2021-12-07 14:41:12 · 923 阅读 · 0 评论 -
Java 基础之迭代器的使用
迭代器是一种设计模式,迭代器可以用于遍历集合,开发人员不必去了解这个集合的底层结构。迭代器封装了数据获取和预处理逻辑,屏蔽了容器的实现细节,无需暴露数据结构内部。在数据量非常庞大时使用迭代器进行数据迭代获取,避免全部取出占用过多的服务器资源,且可以对部分数据进行预加载,提升性能。本文将对 java 提供的 Iterator、Iterable 和 Spliterator 三个数据迭代接口做介绍,了解其使用场景。原创 2021-12-06 11:31:03 · 5763 阅读 · 0 评论 -
Java 锁系列(七)——StampedLock源码分析
一、StampedLock概述StampedLock 是读写锁的实现,对比 ReentrantReadWriteLock 主要不同是该锁不允许重入,多了乐观读的功能,使用上会更加复杂一些,且仅支持非公平锁,但是具有更好的性能表现。StampedLock 的状态由版本和模式组成。 获取锁方法返回一个邮戳,表示和控制与锁状态相关的访问; 这些方法的“尝试”邮戳可能会返回特殊值 0 来表示获取锁失败。 锁释放和转换方法需要标记作为参数,如果它们与锁的状态不匹配则失败。本文对 StampedLock 的实现源码原创 2021-11-30 16:08:28 · 839 阅读 · 0 评论 -
Java 锁系列(五)——ReentrantReadWriteLock源码分析
一、ReentrantReadWriteLock概述ReentrantReadWriteLock 是读写锁的实现,读锁可以在没有写锁的时候被多个线程同时持有,写锁就是和 ReentrantLock 类似的独占锁,它同样有包含公平锁和不公平锁两种实现方式,在实例化时将同时实例化 ReadLock 和 WriteLock 实例,本文主要聚焦于 WriteLock 的实现分析,因为 ReentrantReadWriteLock 中的部分实现与 ReentrantLock 一样基于 AbstractQueuedS原创 2021-11-18 09:11:21 · 445 阅读 · 0 评论 -
Java 锁系列(四)——ReentrantLock源码Condition实现分析
一、Condition 概述Condition 是个接口,依赖于 Lock 接口的实现,基本的方法就是 await() 和 signal() 方法,是在 java 1.5 中才出现的,用于替代 Object 的 wait()、notify() 实现线程间的协作,相比使用 Object 的 wait()、notify(),使用 Condition 的 await()、signal() 这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来原创 2021-11-02 19:28:48 · 423 阅读 · 0 评论 -
Java 锁系列(三)——ReentrantLock源码分析
一、ReentrantLock 概述ReentrantLock 是一个可重入的独占锁,是基于 AQS(AbstractQueuedSynchronized,抽象队列式同步器)实现的,它有公平锁和不公平锁两种实现方式。简单查看源码,可以发现 ReentrantLock 其实是一个代理的模式,Reentranlock 的核心是其内部继承自 AbstractQueuedSynchronized 的抽象类 Sync,将 Sync 作为锁的同步基础,其中加锁/解锁等操作其实都是由 Sync 对象完成的,也是通过实例原创 2021-10-18 10:08:32 · 335 阅读 · 0 评论 -
Java 锁系列(二)——ReentrantLock 和 ReadWriteLock基础运用
Lock 接口提供了与 synchronized 相似的功能,和 synchronized 不同的是,Lock 在使用的时候需要显示的获取和释放锁。虽然牺牲了隐式获取释放锁的便捷性,但是对于锁的操作具有更强的可操作性、可控制性以及提供可中断操作和超时获取锁等机制。本文将描述 ReentrantLock 和 ReadWriteLock 锁的基础使用。一、ReentrantLock 运用package com.nineya.test;import java.util.concurrent.Executo原创 2021-09-24 15:18:55 · 477 阅读 · 0 评论 -
Java 锁系列(一)——锁分类和基础概述
一、乐观锁和悲观锁乐观锁和悲观锁从看待并发问题的不同角度延伸出来的锁概念。1.1 乐观锁乐观的看待并发问题,认为数据不会被修改,所以不对数据上锁,只是在更新的时候判断一下在此期间数据有没有被更新。常见的乐观锁实现方式有“数据版本机制”或“CAS操作”。1.1.1 数据版本机制在表中进行更新数据时,先给数据表加一个版本字段,每成功操作一次记录,记录的版本号+1。先查询那条记录,获取版本字段,更新时判断此刻版本字段的值是否与刚刚查询出来的值相等。相等说明这段时间没有其他程序对其进行操作,可以执行原创 2021-09-23 09:26:51 · 350 阅读 · 0 评论 -
Spring Security系列(四)——Spring Oauth2实现登录同时授权、自定义授权界面
本文环境: org.springframework.cloud:spring-cloud-starter-oauth2:2.2.4.RELEASE本文场景: 希望实现类似 QQ 的登陆并授权功能,但是将 /oauth/authorize 路径加入 permitAll 没有生效,加入 web.ignoring() 后抛出了 User must be authenticated with Spring Security before authorizing an access token. 异常,在 Spri原创 2021-02-04 00:32:31 · 4418 阅读 · 14 评论 -
JVM原理(一)——JVM概述
1. 编程语言兼容性JVM最初的目标:开发者无须关注底层平台就能实现兼容性。实现编程语言兼容性大体分为两种方式:通过编译器实现兼容例如:C、C++等实现原理:针对不同的平台开发不同的编译器,编译器能将同样的代码段翻译成与目标平台匹配的机器指令。缺陷:如果涉及系统调用,大多都需要修改程序,调用特定的API。通过中间语言实现兼容例如:java、C#等实现原理:程序被编译后生成中间语言(ML),中间语言指令由虚拟机负责解释和执行。源代码编译生成的中间语言是相同的,原创 2020-09-12 19:14:24 · 360 阅读 · 0 评论 -
通过javadoc生成文档
一、pom.xml 添加插件<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>3.1.1</version> <configuration> <show>private</show&原创 2020-08-09 20:10:54 · 1599 阅读 · 0 评论 -
Springboot关闭默认的日志输出
本文环境springboot 2.2.6jdk 1.8.0_241一、配置application.yml在resources目录下新建application.yml文件(或:application.properties),添加如下内容:logging.level.[包名]: OFF# 例如,OFF可改成某个日志级别logging.level.org.apache.ignite: OFF二、添加日志配置文件添加log.xml文件,内容如下:<?xml version="1原创 2020-05-22 18:37:49 · 24773 阅读 · 1 评论 -
SpringBoot使用Java修改端口、项目打包
本文环境1.SpringBoot 2.2.62.jdk 1.8.0_241一、使用java修改端口通过实现WebServerFactoryCustomizer<ConfigurableWebServerFactory>接口实现,springboot2.X之前的版本会有所不同。@SpringBootApplicationpublic class SpringbootApplication implements WebServerFactoryCustomizer<Configur原创 2020-05-22 18:35:57 · 837 阅读 · 0 评论 -
java取得对象占用的内存大小
本文环境win 10jdk 1.8.0_241IntelliJ 2019.1.3一、通过Instrumentation获取内存在java工程中添加如下代理类:package com.nineya.memorymeasurs;import java.lang.instrument.Instrumentation;public class MemoryMeasurs { static Instrumentation inst; // 由jvm注入 publi原创 2020-05-19 14:34:51 · 3948 阅读 · 0 评论 -
JVM系列(一)——类加载器以及双亲委托机制
写在前面本文主要介绍了四种类加载器,以及算清委托机制。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。本文使用到的东西java文章目录写在前面本文使用到的东西1.类加载器2.双亲委托机制3.总结1.类加载器1.1 类加载器作用:类加载器负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间。1.2 启动类加载器(BootStrap ClassLoader)...原创 2020-01-27 22:03:36 · 255 阅读 · 0 评论 -
常见排序算法冒泡排序、快速排序等java实现
写在前面本文描述了常见的几种排序算法,文章可能还有很多不足,请大家谅解,欢迎大佬提意见。本文使用到的东西java文章目录写在前面本文使用到的东西1.选择排序2.冒泡排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.总结1.选择排序1. 1 算法思想 从未排序的区间中找出最小的元素,将该元素与未排序区间中第一个元素交换,第一个元素即为排序好的元素,再继续比较余下未...原创 2020-01-21 23:03:49 · 346 阅读 · 0 评论 -
java多线程共享数据、线程同步与互斥
写在前面本文全文以售票系统为例,简诉了java多线程间共享数据的两种方式、线程同步。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。本文使用到的东西javaeclipse 2019-11文章目录写在前面本文使用到的东西1.多线程共享数据1.1 共享Runnable1.2 封装数据为对象2.线程同步与互斥2.1 上述代码存在的问题2.2 同步与互斥2.3 synchronized实现...原创 2020-01-21 15:34:18 · 3714 阅读 · 0 评论 -
java实现多线程的四种方式及多线程源码分析
写在前面本文描述了java实现多线程的四种方式,文章可能还有很多不足,请大家谅解,欢迎大佬提意见。本文使用到的东西eclipse 2019-11java文章目录写在前面本文使用到的东西1.继承Thread类1.1实现代码1.2源码分析2.实现Runnable接口2.1实现代码2.2 源码分析3.实现Callable3.1实现代码3.2 Callable源码分析3.3 FutureTa...原创 2020-01-20 21:44:46 · 350 阅读 · 0 评论