月泉的博客

月泉的博客

分享行走在技术路上的知识

JUC-ThreadLocalRandom原理剖析
JUC-ThreadLocalRandom原理剖析ThreadLocalRandom是什么在Java中生成随机数通常都会使用Random来生成随机数,用法如下: 123456public static void main(String[] args) { Random random = new Random(); for (int i = 0; i < 10; i++) { System.out.println(random.nextInt(5)); }} 上述代码会生成0-4的十次随机数,那么Random在...
并发编程基础(下)
并发编程基础(下)什么是并发编程想要知道什么叫并发编程,就先要区分什么是“并发”什么是“并行”,并发是指多件事情同时发生,而并行是指的多件事情执行,一个是侧重于发生,一个是侧重于执行,在单核单线程的CPU上实际上使用多线程是没有太大意义的因为一个CPU的一个超线程同时能够执行的线程中的命令只有一个,且都是时间片轮转机制进行轮转占用的,例如CPU0 -> ThreadA -> ThreadB -> ThreadC 一个CPU对应3条线程,那么其结果就是轮流执行,在随着时代的发展,单核CPU的晶体管已经放不下了,发展成了多核,那么再多核CPU的情况下,再去跑多线程,能够使得...
并发编程基础知识(中) 深度剖析ThreadLocal机制
并发编程基础知识(中)ThreadLocal是什么Java中有一个类能够给线程提供线程的局部变量,使用这个类来设置值可以使得每个线程都有自己的一份变量副本,这个类就是ThreadLocal ThreadLocal 的使用123456789101112131415161718192021222324252627282930class ThreadLocalTest{ private static ThreadLocal<String> threadLocal = new ThreadLocal(); public static void getThread...
并发编程基础知识(上)
并发编程基础知识(上)线程是什么?进程是系统调度及分配资源的基本单位,在现今每个进程中都至少拥有一个线程在执行,而线程就是CPU调度执行的基本单位。 为什么需要线程从操作系统的角度出发,从最开始的单进程阻塞执行再到实现了多进程,使得整个操作系统可以运行多个应用程序,如果没有线程,那么系统本身是可以运行多个应用程序,但这些应用程序其本身是阻塞的,比如我点击一个查询按钮,需要耗费30秒, 那么其应用程序就得无响应30秒,为了使进程本身不是阻塞执行且更大化的利用进程的资源和CPU及用户体验从而在进程中在建立了线程的概念,每个线程都拥有一个栈和程序计数器(此句话大多通用,这里限定为Java) 理...
Java并发底层的一些细节
Java并发底层的一些细节 别问为什么不是文章是一张脑图,最近太忙了,本来想写的,结果脑图一梳理发现没时间,那么就在脑图上面做补充了。
JVM调试工具和类结构还有类加载机制
JVM调试工具和类结构还有类加载机制大纲如下: JVM调试工具 Class文件结构 类加载机制 JVM调试工具打开$JAVA_HOME/bin目录下,当然我这里是指的JDK(Java Development Kit)可以看到里面很多可执行文件,这里面都是官方提供的一些工具,都是基于$JAVA_HOME/lib/tools.jar进行的封装,这里介绍几款常用的以及我常用的使用方式。 命令行 jps jinfo jstat jmap jhat jstack 图形化(以后再说) jconsole jvisualvm jps 和Linux下的ps命令很类似,只不过Linux下的ps命...
初识JVM
初识JVM大纲如下: JVM运行时数据区 对象是如何在虚拟中创建的 对象的内存布局 对象访问的定位 垃圾回收算法 垃圾收集算法 Hotspot的实现 JVM的垃圾收集器 对象的引用类型 JVM运行时数据区JVM运行时数据区主要分为5块,先从粗略的角度看,分为线程共享和线程独享 线程共享: 堆、方法区(Java8后被移除,用元空间替代其作用还是一样的) 线程独享: Java方法栈、本地方法栈、程序计数器 线程共享的区域随着虚拟机的启动而启动,虚拟机的销毁而销毁,线程独享的区域随着线程的启动而启动线程的消亡而消亡 堆:基本上所有的对象都是在堆上完成分配,也是GC关注的重点对象,因为现...
跟我volatile从表面到底层
跟我volatile从表面到底层 食用该篇文章,作者建议你最好已经提前了解过:JMM以及CPU缓存一致性协议还有相关的内存屏障的知识并且能够理解CPU的乱序执行,如果作者理解不当,欢迎指出。 如果本文对你有所帮助不妨给博客的Github点个小星星,提问和文章有什么地方理解错了也可以直接在Github上提交issue 该篇文章讨论的议题: java语义上的volatile 内存屏障 JVM的实现 生成的汇编指令 如何保障的的可见性和有序性 为什么volatile不能保证复合操作的原子性 java语义上的volatile我们从一个很常见的案例开始出发 1234567891011121...
浅谈使用Spring Annotation容器注册与注入
首先,我先列个大纲目录,简明扼要的说明一下这一篇文章要写的内容是啥 迷宫入口的宏观结构 入口的背后 容器中获取一个bean的背后 迷宫入口的宏观结构嗯,迷宫,迷宫的入口是什么?标题说的很明确,是使用Annotation的方式来注册和注入,那么我分析的入口就是AnnotationConfigApplicationContext,那么入口有了,但是并不准备直接从这个迷宫走进去。 Spring结构还是清晰有序中透着复杂,直接闯像我这种闯迷宫已经好多次的“老司机”到是能来去自如,但是新司机怕不是要晕头转向,所以明人不说暗话,我要看图,没图说个XX 不要慌,虽然结构复杂,但只关注主要的,...
手把手带你分析Class字节码文件
分析Class文件的源码如下: 123456789package org.yuequan.klass;public class Foo{ private int m; public int inc(){ return m + 1; }} 笔者使用JDK1.8将源文件编译成class文件,为了更好的手动分析这个class文件,笔者将使用现有的Class分析工具去打开这个class文件。 打开后的Class文件: Java虚拟机规范对Class文件结构做了严格的规定,其中的字节严格的按顺序紧密的排在一起,中间没有任何的...
avatar
月泉
热爱技术
FRIENDS
charles