- 博客(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 2449
原创 在java中找到被吃的异常
1. 背景介绍在开发过程中, 遇到平台代码不规范的写法(如下图), 将异常直接吃掉, 或者吞掉了详细堆栈. 当生产运行到这段代码时, 抛出的信息非常少, 而且不知道是哪行代码抛出的异常, 排除问题非常困难. 为解决这个问题, 想到了一个好办法.2. 解决思路将jdk中的java.lang.Exception类重写. 在本机创建Exception这个类, 并在构造器中将堆栈输出package java.lang;public class Exception extends Throwabl
2020-08-27 17:51:50 675
原创 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 187
原创 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 3317 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 174
原创 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 1537
原创 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 16567 12
原创 java 两种lambda表达式的区别
1. 背景介绍在进行sonarqube扫描代码优化时, 有给出如下的提示改进建议将 b -> b.getName()这种形式修改为B::getName, 就引申出来如下思考:为何后一种书写形式比前一种更高效?既然后一种更高效, 那前一种有何存在价值?本文接下来就围绕这个两个问题进行探讨2. 两种表达式字节码的分析2.1 使用的测试代码如下:package com.you...
2020-04-27 11:47:41 1000
原创 关于在线程池场景中使用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 1114
原创 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 1295
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人