- 博客(10)
- 收藏
- 关注
原创 java中实现数组越界判断和获取数组长度的实现
1. 背景介绍 java中的数组比c语言中的数组, 多了两个很重要的功能 当索引越界时, 会自动抛出ArrayIndexOutOfBoundsException, 避免一错再错 另一个很重要的方法是获取数组长度 这两个功能都不是通过java代码层面实现的, 而是在jvm中通过c++来实现的. 本文就针对这连个点来一探究竟 2. 原始java代码 public class TestArrayIndexOutOfBoundsException { public static void main(St
2020-10-12 19:29:08
2757
原创 在java中找到被吃的异常
1. 背景介绍 在开发过程中, 遇到平台代码不规范的写法(如下图), 将异常直接吃掉, 或者吞掉了详细堆栈. 当生产运行到这段代码时, 抛出的信息非常少, 而且不知道是哪行代码抛出的异常, 排除问题非常困难. 为解决这个问题, 想到了一个好办法. 2. 解决思路 将jdk中的java.lang.Exception类重写. 在本机创建Exception这个类, 并在构造器中将堆栈输出 package java.lang; public class Exception extends Throwabl
2020-08-27 17:51:50
842
原创 java中Lock相关类实现的探索(非synchronize)
1. 背景介绍 都知道synchronize是通过markword相关机制实现同步, 众所周知java中还有另一种同步机制, 就是通过Lock相关类来实现, 今天我们就以ReentrantLock来探索一下java对Lock的具体实现方式 2. 源码追踪 2.1 ReentrantLock的源码分析 ReentrantLock内部实现了两种锁机制, 一种是公平锁, 一种是非公平锁. 当调用无参构造器时, 采用的是非公平锁 public ReentrantLock() { sync = n
2020-07-23 18:52:20
262
原创 java Object的hashCode方法的计算逻辑
1. 背景介绍 在为重写hashCode方法的时候, 看到hashCode打印出的数据像是一个地址值, 很是好奇. 加之最近在研读jvm源码, 特此一探究竟, 看看在hotspot中hashCode究竟是如何实现的 2. 调用过程梳理 1. java的Object代码 public native int hashCode(); 通过官产jdk的Object.class的源码, 发现hashCode被native修饰. 因此这个方法应该是在jvm中通过c/c++实现 2. jvm的hashCode相关代码
2020-07-10 18:10:59
3719
2
原创 对java几种内部类的分析
1. 背景介绍 在sonar扫描代码时, 有个内部类未使用到外部类的非静态成员, 推荐我们将此内部类修改改静态内部类, 因而本文来探究一下各种内部类的差异已经使用场景 2. 内部类分析 分析使用代码的 package com.test; public class TestInnerClass { private int outer; // 非静态内部类 public class InnerClass { int a = outer + 1; priva
2020-06-05 17:43:30
272
原创 java中cas实现的探索
1.背景简介 当我们在并发场景下,增加某个integer值的时,就涉及到多线程安全的问题,解决思路两个 将值增加的方法使用同步代码块同步 使用AtomicInteger,来逐步增加其值 这两种实现方式代码如下 import java.util.concurrent.atomic.AtomicInteger; public class CASTest { private static AtomicInteger countAI = new AtomicInteger(0); privat
2020-05-31 12:15:03
1641
原创 SecureRandom.getInstanceStrong()引发的线程阻塞问题分析
1. 背景介绍 sonar扫描到使用Random随机函数不安全, 推荐使用SecureRandom替换之, 当使用SecureRandom.getInstanceStrong()获取SecureRandom并调用next方式时, 在生产环境(linux)产生较长时间的阻塞, 但开发环境(windows7)并未重现 2. 现象展示 使用测试代码: package com.youai.test; import java.security.NoSuchAlgorithmException; import jav
2020-05-15 19:04:15
18338
12
原创 java 两种lambda表达式的区别
1. 背景介绍 在进行sonarqube扫描代码优化时, 有给出如下的提示改进 建议将 b -> b.getName()这种形式修改为B::getName, 就引申出来如下思考: 为何后一种书写形式比前一种更高效? 既然后一种更高效, 那前一种有何存在价值? 本文接下来就围绕这个两个问题进行探讨 2. 两种表达式字节码的分析 2.1 使用的测试代码如下: package com.you...
2020-04-27 11:47:41
1140
原创 关于在线程池场景中使用ThreadLocal导致OOM的一点分析
1. OOM场景分析 测试oom使用的类 package com.concurrency.thread; import com.concurrency.MyFixSizeThreadPool; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.List;...
2020-04-17 18:45:28
1278
原创 java中boolean类型基础数据在内存中占用的空间大小分析
boolean对象到底占用多少内存 0. 本文所用的java代码 package com.youai.test; import org.openjdk.jol.info.ClassLayout; /** * VM argument: E:\Java\jdk1.8.0_144\bin\java.exe * -XX:+UnlockDiagnosticVMOptions #针对product版本的...
2020-04-15 18:48:59
1518
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅