JAVA底层
虎哥和你一起学编程
路漫漫其修远兮吾将上下而求索
展开
-
Thread.enumerate方法
Thread.enumerate方法的作用是将当前线程所对应的的线程组包含的所有线程放入一个数组。原创 2023-08-30 20:48:54 · 197 阅读 · 0 评论 -
Holder类的作用
很多框架和源码中都会有Holder这种类,主要作用就是让java中参数传递的时候可以保证引用改变。例如:public class Test { public static void main(String[] args) { User user = new User(); user.name = "1111"; change(user); System.out.println(user.name); } p原创 2021-12-12 16:29:42 · 2314 阅读 · 3 评论 -
为什么重写equals方法要重写hashcode方法
首先我们来看hashcode源码中的注释/** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided by * {@link java.util.HashMap}. * <p> * The general contract of {@code ha原创 2021-11-20 20:49:14 · 738 阅读 · 0 评论 -
ThreadLocal如何解决哈希冲突
ThreadLocal通过开放地址法来解决hash冲突,而hashMap则是通过链地址法来解决hash冲突。源码如下 /** * Set the value associated with key. * * @param key the thread local object * @param value the value to be set */ priv...原创 2021-11-18 08:49:59 · 1665 阅读 · 1 评论 -
锁消除与锁粗话
锁消除指的是通过逃逸分析,得知该代码块永远不会逃逸出当前线程的作用范围,无需加锁,但是加锁了,就可以通过锁消除技术来去除这种没有意义的锁。例如如下:public class LockClearTest { public static void main(String[] args) { LockClearTest test = new LockClearTest(); for (int i = 0; i < 100000; i++) {原创 2021-11-17 10:13:28 · 439 阅读 · 0 评论 -
线程池源码解析(三)
线程池可以通过工厂方法来创建,但是工厂方法创建的线程池一般不推荐使用,因为容易造成oom,同时自己构建线程池可以让程序员更加熟悉线程池的构建。 工厂方法可以创建以下线程池/** * Creates a thread pool that reuses a fixed number of threads * operating off a shared unbounded queue. At any point, at most * {@code...原创 2021-11-16 12:00:47 · 120 阅读 · 0 评论 -
线程池源码分析(二)
任务的提交流程/** * Executes the given task sometime in the future. The task * may execute in a new thread or in an existing pooled thread. * * If the task cannot be submitted for execution, either because this * executor has bee...原创 2021-11-16 11:48:30 · 62 阅读 · 0 评论 -
线程池源码解析(一)
/** * The main pool control state, ctl, is an atomic integer packing * two conceptual fields * workerCount, indicating the effective number of threads * runState, indicating whether running, shutting down etc * * In or.原创 2021-11-15 22:24:46 · 48 阅读 · 0 评论 -
safePoint与safeRegion
safePoint与safeRegion是指GC时所有用户线程必须跑到一个安全位置,达到一个一致性的状态,所谓一致性的状态即指对象的引用关系不再变化。当线程挂起时,由于没有分配cpu时间片,标记为在安全区域。...原创 2021-10-20 10:36:29 · 93 阅读 · 0 评论 -
java中字符串相加发生了什么
在平常不管是开发或者面试中,经常会出现字符串相加的情况,那么底层到底是如何实现的呢。 先写一个例子 public class Test { public static void main(String[] args) { String str = ""; for(int i = 0; i < 10; i++){ str += "aa"; ...原创 2020-08-11 11:15:58 · 460 阅读 · 0 评论 -
JMX实战demo
jmx(java management extension) 是jdk提供的为Java应用提供监控功能的一个标准,类似于jms等,在许多的由java编写的框架如es,tomcat,activiti中都引入了jmx进行应用监控。下面我就来写一个jmx的例子以供参考。 使用Jmx需要引入一个Jar包(jmxtools-1.2.1.jar),这个jar包不在jdk原生的jar包里面,需要另行下载,然后倒入到项目中去。这里提供一个下载地址 http://www.d...原创 2020-06-27 12:07:05 · 491 阅读 · 0 评论 -
日常问题剖析
最近在开发中碰到了一个问题,其实就是一个很简单的类型转换异常,最开始看到报错信息就很兴奋,其实就是ClassCastException: Integer can not be cast to String,本来以为马上就能够解决的,可是在看代码看了半天之后,发现自己却不明所以,虽然最后解决了bug,但是还是没有弄懂是什么原因,在此希望有大神能够给予解答。 ...原创 2019-08-24 17:01:53 · 375 阅读 · 1 评论 -
java的监听器实现
我们都知道,我们的spring容器是通过classLoaderListener来创建的,而ClasssLoaderListener实现了ServletListener接口,这样,在比如tomcat初始化servlet容器时,我们就可以创建出我们的spring容器了。 下面我就来讲一下java中监听器是怎么样实现的。先来讲一下原理 java中的监听器涉及到三个对象,事件源,事...原创 2018-04-12 23:56:19 · 4110 阅读 · 1 评论 -
JVM的三种类加载器
干java程序员有一段时间了,但是对JVM是怎么加载类的一直是懵懵懂懂,看了一些博客,现把自己对JVM的类加载器的一些理解和大家分享一下。 咱们的类经过javac编译后,生成.class文件保存下来,然后经过类加载器加载类至内存,生成java.lang.Class类的实例,这个实例就是程序访问这个类的入口,通过这个class实例的newInstance方法即可得到这个类的实例...原创 2018-02-23 23:00:06 · 13429 阅读 · 1 评论 -
浅谈Object类的toString方法
我们都知道,当我们需要打印一个对象时,都是直接调用的toString方法,而这个方法即使不重写,也是可以调用的,因为它是Object类的方法,我们都知道,在java中,所有的类的超类都是Object.Object这个类里面的方法显的尤其重要,toString这个方法呢,就是为了让我们能得到一个对象的文本表现形式,从而窥测这个对象里面的属性。 通常我们在不重写时,可能会得...原创 2018-03-10 23:25:40 · 5211 阅读 · 0 评论 -
增强for循环的线程安全问题
增强for循环在遍历集合的时候,底层是使用迭代器来实现的。当我们在for循环内部操作时,就会抛出一个异常。如下package com.deepCopy;import java.util.List;import java.io.IOException;import java.util.ArrayList;public class Test { public static...原创 2018-03-03 23:48:23 · 6998 阅读 · 0 评论 -
Object方法的finalize方法
Object对象里面有一个finalize方法,这个方法其实很少用,但是既然是Object里面的方法,就有必要来讲一下,因为Object是所有类的根类,它里面的方法每一个类里面都会有。所以它里面的方法是很重要,包含了设计者的很多考虑。 finalize方法在jdk里面的解释是一个对象在被GC回收之前会调用finalize方法,通常用来做一些系统资源的整理工作,为什么要有这个方法呢...原创 2018-03-11 23:23:35 · 601 阅读 · 0 评论 -
ThreadLocal解决多线程并发问题
在java程序中,常用的有两种机制来解决多线程并发问题,一种是sychronized方式,通过锁机制,一个线程执行时,让另一个线程等待,是以时间换空间的方式来让多线程串行执行。而另外一种方式就是ThreadLocal方式,通过创建线程局部变量,以空间换时间的方式来让多线程并行执行。两种方式各有优劣,适用于不同的场景,要根据不同的业务场景来进行选择。 在spring的源码中,就使用了T...原创 2018-03-12 22:45:56 · 3377 阅读 · 0 评论 -
反射之子类与父类
做java开发也有一段时间了,一直以为自己对反射懂的比较多,可是今天却突然发现自己竟然这么基础的东西都不知道,不废话了,直接贴代码。 父类 package com.reflect;public class Animal { private String name; /** * @return the name */ public synchronized Stri...原创 2018-03-05 22:37:15 · 759 阅读 · 0 评论 -
关于字符串的比较
先来看一段代码,再来谈我们的话题public class Test{ public static void main(String[] args){ String a="a"; final String b="a"; String c="a"+"b"; String d=a+"b"; String e=b+"b";原创 2018-03-29 21:08:46 · 108 阅读 · 0 评论 -
Arrays.asList()操作的异常问题
先来一段代码,引出一个问题。 public class Test { public static void main(String[] args) { List list1= Arrays.asList(1,2); List list2=Arrays.asList(1,2,3,4); list2.removeAll(list1)...原创 2018-04-14 23:07:20 · 1324 阅读 · 0 评论 -
方法重载的顺序问题
学了很长时间的java了,现在重新来讨论一下这个问题,因为这个问题还是很能够糊弄人的。 先来看一段代码 public class Test{ public static void say(Object arg){ System.out.println("object"); } public static void say(int arg){ Syst...转载 2018-04-16 23:52:03 · 1329 阅读 · 0 评论 -
HashMap的底层原理
HashMap在我们的日常开发以及面试中经常出现,它在实际应用中真的很频繁,一个老练的程序员对Hashmap的结构都是非常的熟悉。今天就来讲一下HashMap的底层原理。 HashMap底层就是通过数组+链表实现的,先通过对key进行hashing算法,得到Entry[]中该key被分配到的位置,然后用equals方法进行比较,如果key的equals方法判断相等,则覆盖,如果不等则在链表中...原创 2018-02-28 23:00:01 · 440 阅读 · 0 评论