Java底层
文章平均质量分 83
路途芬芳
这个作者很懒,什么都没留下…
展开
-
map.get(key)出现NPE问题以及解决方案
平时使用Map时都会给定里面的元素类型,在拿到数据后用Optional判空处理,比如以下形式:String value = Optional.ofNullable(mapData.get("xxx")).orElse(""); 一般情况下没出现问题,但是今天从mongodb拿到数据后,代码走到map.get(key)报了NPE,一开始让人有点懵逼,我做了处理啊,我是谁,我在哪? 后边才发现拿数据的接口返回的是List<Map>类型,Map并没有指定类型,但是我获取其中对应的map原创 2021-08-16 18:09:20 · 496 阅读 · 0 评论 -
快速掌握ThreadLocal
一、ThreadLocal概念ThreadLocal是线程变量,在每个线程中都创建了一个ThreadLocalMap对象,存储当前ThreadLocal副本,该Map是以ThreadLocal对象为key,任意对象为值的存储结构,每个线程都能够访问属于自己的ThreadLocalMap存储的value。而ThreadLocal能够集中管理和操作这些Map。类中定义的ThreadLocal实例一般会被private static修饰,这样可以让ThreadLocal实例的状态和Thread绑定在一起原创 2020-07-23 21:56:06 · 134 阅读 · 0 评论 -
关于volatile你必须掌握这些,不然5K都没得!
文章目录一、volatile介绍二、JMM(Java内存模型)JMM的主存JMM中的工作内存三、细说volatile的特点3.1、可见性3.2、volatile不能保证原子性3.3、volatile如何禁止重排优化的happens-before八大原则内存屏障(Memory Barrier)3.4、经典问题——单例的双重检测实现四、volatile和synchronized的区别一、volatile介绍volatile牵扯的知识不少,我们慢慢来说。volatile是Java虚拟机提供的轻量级同步机制,原创 2020-07-23 14:58:14 · 316 阅读 · 0 评论 -
那些你需要掌握的synchronized的实现原理
一、synchronized介绍以及基本使用1.1、synchronized近来的变动JDK1.6之前,一般认为synchronized是重量级锁。JDK1.5之前,能够协调线程间对共享变量的访问的机制只有synchronized和volatile,但是这样存在一些局限性JDK1.5新增了ReentrantLock,它的出现给了我们另外一个选择,当synchronized重量级锁不适用时,可以选择它JDK1.6对synchronized进行了各种优化,有些情况就没有那么重了,整体性能与Reent原创 2020-07-22 16:09:10 · 578 阅读 · 1 评论 -
快速了解Java多线程——notify和notifyAll的区别
文章目录一、我们先来了解两个概念锁池等待池二、notify和notifyAll的区别2.1、唤醒wait()后的线程测试2.2、测试两个方法的不同点一、我们先来了解两个概念锁池EntryList等待池WaitSet锁池假设线程A已经拥有了某个对象(不是类)的锁,而其它线程B、C想要调用这个对象的某个synchronized方法(或者块),由于B、C线程在进入对象的synchroniz...原创 2020-05-07 19:46:50 · 446 阅读 · 0 评论 -
快速了解Java多线程——sleep()和wait()的区别
基本的差别sleep是Thread类的方法,wait是Object类中定义的方法sleep()方法可以在任何地方使用wait()方法只能在synchronized方法或者synchronized块中使用本质区别Thread.sleep()只会让出CPU资源,不会导致锁行为的改变Object.wait()不仅让出CPU资源,还会释放已经占有的同步锁我们来看下面两个例子pack...原创 2020-05-07 17:51:15 · 196 阅读 · 0 评论 -
快速了解Java多线程——start方法和run方法的区别
文章目录一、Thread和Runnable是什么关系二、线程start方法和run方法的区别在进入文章主题之前我们先来说一下Thread和Runnable是什么关系一、Thread和Runnable是什么关系Thread是一个类,Runnable是一个接口public interface Runnable { // 这里面就一个抽象方法 public abstract ...原创 2020-05-07 16:46:59 · 409 阅读 · 0 评论 -
进程与线程的区别
一、什么是进程和线程进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。简单来说呢,就是一段程序的执行过程线程:一条线程指的是进程中一个单一顺序的控制流。二、进程和线程的由来串行:初期的计算机智能串行执行任务,并且需要长时间等待用户输入批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍无法并发执行进程:进程独占内存空间,保存各自运行状态,相互间不干扰且...原创 2020-05-07 16:00:54 · 152 阅读 · 0 评论 -
快速了解GC有这篇文章就够了!
文章目录一、什么是GC二、为什么要了解GC三、对象被判定为垃圾的标准四、判断对象是否为垃圾的算法4.1、引用计数算法4.2、可达性分析算法五、垃圾回收算法5.1、标记-清除算法5.2、复制算法一、什么是GCGC(Garbage Collection)垃圾收集,回收垃圾,释放内存(那Java中的垃圾是什么呢?垃圾一般是没有被任何对象引用的对象),Java 提供的 GC 功能可以自动监测对象是否过...原创 2020-05-03 11:03:36 · 5722 阅读 · 0 评论 -
JVM内存结构详解
文章目录一、你了解JVM内存模型吗在这之前需要知道JVM内存模型图——JDK1.81.1、程序计数器1.2、Java虚拟机栈(Stack)1.1.1、java.lang.StackOverflowError问题1.3、本地方法栈1.4、元空间(MetaSpace)1.4.1、MetaSpace相比PermGen的优势1.5、Java堆(Heap)二、JVM三大性能调优参数 -Xms -Xmx -X...原创 2020-05-02 16:27:30 · 12926 阅读 · 19 评论 -
一篇文章搞定JVM如何加载.class文件
一、Java虚拟机JVM是一个内存中的虚拟机,主要运用内存存储,所有类、类型、方法,都是在内存中,这决定着我们的程序运行是否健壮、高效。二、.class文件装载执行流程图Class Loader(类加载器):依据特定格式,加载class文件到内存Execution Engine:(执行引擎)对命令进行解析,解析完毕之后就可以提交到操作系统里面执行了Native Interface:融...原创 2020-04-27 21:16:47 · 466 阅读 · 0 评论 -
关于Java平台无关性你该知道这些
一、什么是平台无关性Java语言是一款跨平台的语言,不管是在windows还是在Linux又或者是mac os,它都可以支持并在上边运行,秉持着一次编译,随处运行(Compile Once,Run Anywhere)的原则。Java程序可以编译成.class二进制文件,通过ClassLoader装载进系统,然后由各个平台的JVM(Java虚拟机)解析进行连接、初始化等操作,从而达到不改变程序...原创 2020-04-27 16:26:40 · 752 阅读 · 0 评论