自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

以后我要当村长

记录学习

  • 博客(12)
  • 收藏
  • 关注

原创 搞定CAS的原理,看这一篇就够了!

一、什么是CAS?CAS (compareAndSwap),中文叫比较交换,是一种无锁原子算法,映射到操作系统就是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,在intel的CPU中,使用的是cmpxchg指令,就是说CAS是靠硬件实现的,从而在硬件层面提升效率。执行过程是这样:它包含 3 个参数 CAS(V...

2020-04-16 15:59:45 12026 1

转载 秒懂JDK14的几个重要特性

一、instanceof(in 死等 of)的模式匹配Instanceof是java中用于检查对象引用是否为给定Type类型的实例,并返回布尔值。在Java 14之前,我们在完成判断之后,经常需要做一下类型的强制转换,如下:Java 14增强功能特性:注意:仅当object不为null时,instanceOf才会匹配,然后仅将其分配给str。在instanceof中...

2020-04-19 20:52:11 1026

原创 两分钟带你搞定常见垃圾收集器!

(1)JVM的运行模式Server ClientClient的启动比Server模式快,但是长期运行进入稳定期后Server模式的程序运行速度会比Client快,这是因为Server模式启动的是重量级的JVM,对程序进行了更多了优化。命令行执行java -version即可查询自己电脑上的JVM运行模式:(2)垃圾收集器之间的联系不同的垃圾收集器可能针对不...

2020-04-16 23:52:38 264

原创 堆内存划分(新生代、老年代)

在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。堆的内存模型大致如下图所示:从图中可以看出: 堆大小 = 新生代 + 老年代。默认...

2020-04-16 23:07:49 4339

原创 秒懂ThreadLocal及其引发的内存泄露!

ThreadLocal是Java中的一种线程绑定机制,可以为每一个使用该变量的线程都提供一个变量值的副本,并且每一个线程都可以独立地改变自己的副本,而不会与其它线程的副本发生冲突,解决了变量并发访问的冲突问题。每个线程内部有一个 ThreadLocal.ThreadLocalMap 类型的成员变量 threadLocals,这个 threadLocals 存储了与该线程相关的所有ThreadL...

2020-04-16 17:02:56 907

原创 Redis之集群原理及一致Hash算法

一、如何设计系统,能够从Redis服务器的海量数据中快速找到所需?我们可以采用分片,按照Hash算法划分数据,分散存储在多个节点上。但是会涉及到一个问题,如果某个节点失效,那么存储在节点上面的数据也将失效,并且新增定位到该节点的数据将无法存储,容错性很低,利用一致性Hash算法可以解决这个问题。二、利用一致Hash算法来解决分片的问题其原理模于某个数(例如2的32次方),将哈希值空间变成虚...

2020-04-15 15:48:59 410

原创 JUC下的BlockingQueue阻塞队列详解

一、前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。二、认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队...

2020-04-14 16:24:08 206

原创 什么是线程池?如何创建一个Java线程池?

一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行的任务的队列。线程池可以避免线程的频繁创建与销毁,降低资源的消耗,提高系统的反应速度。java.util.concurrent.Executors提供了几个java.util.concurrent.Executor接口的实现用于创建线程池,其主要涉及四个角色:线程池:Executor 工作线程:Worker线程,Worker的r...

2020-04-14 16:04:59 2250

原创 如何让线程返回数据?

从线程中返回数据和向线程传递数据类似,也可以通过类成员以及回调函数来返回数据,但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪。一、通过类变量和方法返回数据使用这种方法返回数据需要在调用start方法后才能通过类变量或方法得到数据,让我们先来看看会得到什么结果:package mythread;public class MyThread extends...

2020-04-13 16:15:01 1502

原创 String、StringBuffer、StringBuilder的区别?我懵了!

String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的...

2020-04-13 15:23:07 173

原创 你知道StringBuffer是如何扩容的吗?

来看一下源码,在没有传参的情况下默认构造初始容量为16的空字符缓冲区。public StringBuffer() { super(16);}有参数的情况下,初始容量是16+字符串的长度,然后用append()方法将传入的字符放入字符缓冲区中:public StringBuffer(String str) { super(str.length() + 16); ap...

2020-04-12 21:36:17 779

原创 Class.forName和ClassLoader.loadClass两个方法的区别?

一、类的加载过程类的加载是指将指定的Class文件的二进制数据,加载到JVM的方法区中,并在堆区中创建对应的Class对象,该过程主要分为以下几步:装载:查找并导入对应的Class文件到JVM中链接: (1)检查:检查载入的class文件数据的正确性和完整性      (2)准备:给类的静态变量分配存储空间      (3)解析:将常量池中的符号引用转化为直接引用...

2020-04-12 19:24:36 329

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除