自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 单例模式 的 双重检查锁定 错在哪?

在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源 。双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化(单例)。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出...

2018-12-27 17:50:15 2127

原创 java中 Map, List与Set的 区别和联系

集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引(reference)。集合的主要分为三种类型:Set(集) List(列表) Map(映射)三者关系Collection├List│ ├LinkedList│ ├ArrayList│ └Vector│   └Stack└SetMap...

2018-12-24 16:52:25 2175

原创 Java中 ( Iterator ) 迭代器 详解 ( JDK8源码 )

Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作...

2018-12-24 12:18:58 3028 1

原创 Https的加密过程 / 对称加密和非对称加密

先说具体过程client请求服务端(指定SSL版本和加密组件) server返回CA证书+公钥 client用机构公钥认证server返回的CA证书上的签名是否正确 client生成一个密钥R,用公钥对密钥R加密发送给server server用服务器的私钥解密获取密钥R 后续通信都是采用密钥R进行加密Https和Http区别WEB服务存在http和https两种通信方式,h...

2018-12-24 11:21:00 7735 1

原创 Java语言是" 解释执行" 的语言吗

本篇来自周志明的<<深入理解java虚拟机>>许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,在本章中,我们先来探讨一下在解释执行时,虚拟机执行引擎是如何工作的。解释执行Java语言经常被人们定位为“解释执行”的语言,在Java初生的JDK 1.0时代 ,这种定义还算是比较准...

2018-12-22 11:50:14 3488

原创 ConcurrentHashMap详解 ( JDK6,7,8 区别 )

线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环(导致CPU利用率接近100%), 数据丢失等情况 , HashMap是线程不安全的 ,所以在并发情况下不能使用HashMap。关于HashMap参考:https://blog.csdn.net/q5706503/article/details/85123141效率低下的HashTable容器...

2018-12-21 22:19:19 2992

原创 HashMap详解( JDK8 之前与之后对比)

HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap 的实例...

2018-12-21 19:23:12 3058

原创 Java中Map的 entrySet() 详解以及用法(四种遍历map的方式)

Entry由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。 Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)Map.Entry里面包含getKey()和getValue()方法Iterator<Map.Entry<Integer, Integer>> ...

2018-12-20 15:09:52 151919 17

原创 深入理解 hashcode() 和 HashMap 中的hash 算法

前言Java中的HashMap非常常用也非常重要, 提到HashMap是离不开hashcode()方法的, 整天嘴边挂着HashMap、Hashtable、TreeMap、LinkedHashMap、IdentityHashMap、ConcurrentHashMap和WeakHashMap等词, 也许用起来简单, hash的原理也很简单, 经常不以为然, 但是细想下来总觉得有哪里有疑惑, 这里...

2018-12-20 12:09:13 19092 3

原创 JVM----重载 与 重写的本质 : 分派

本篇来自周志明的<<深入理解java虚拟机>>众所周知,Java是一门面向对象的程序语言,因为Java具备面向对象的3个基本特征:继承、封装和多态。本节讲解的分派调用过程将会揭示多态性特征的一些最基本的体现, 如“重载”和“重写”在Java虚拟机之中是如何实现的,这里的实现当然不是语法上该如何写, 我们关心的依然是虚拟机如何确定正确的目标方法。1.静态分派在开始...

2018-12-18 10:32:27 568 1

原创 JVM----类加载的过程

本篇来自周志明的<<深入理解java虚拟机>>上一篇介绍了类加载的时机:https://blog.csdn.net/q5706503/article/details/85012392这篇详细讲解一下 Java 虚拟机中类加载的全过程,也即是加载、验证、准备、解析和初始化这 5 个阶段所执行的具体动作加载 “加载” 是 “类加载”(Class L...

2018-12-15 17:11:10 271

原创 JVM----类加载的时机

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析三个部分统称为连接(...

2018-12-15 11:20:35 1579 1

原创 java 代理的原理与实现

Java中的动态代理,涉及到一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。静态代理静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成静态代理简单实现静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将...

2018-12-14 17:10:28 369

原创 JAVA----静态方法上加锁 和 非静态方法加锁 区别

Synchronized修饰非静态方法,是对调用该方法的对象加锁,俗称“对象锁”。这里的对象加锁并非是说执行该加锁方法的时候整个对象的所有成员都不允许其他线程访问了,而是说该对象内所有的加锁的非静态方法共用这一把锁, 一个加锁非静态方法执行, 另一个加锁非静态方法不能执行,要等持有锁的线程释放锁, 不同对象之间的方法不互相作用这里举第一个例子:两个线程执行同一个对象的不同加锁非静态...

2018-12-14 00:24:15 7960 2

原创 通俗易懂happens-before理解

在JMM(JAVA内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happensbefore关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。 happen...

2018-12-13 23:02:28 4542 1

原创 为啥要指令重排序?

我们知道java在运行的时候有两个地方可能会把指令重排序,一个是编译器编译的的时候,一个是处理器运行的时候。那么为啥要用指令重排序呢?编译期重排序有啥好处?CPU计算的时候要访问值,如果常常利用到寄存器中已有的值就不用去内存读取了,比如说int a = 1;int b = 1;a = a + 1;b = b +1 ;就可能没有int a = 1;a = a ...

2018-12-12 22:54:24 2567

原创 并发与并行的区别

只是一个概念问题, 并不是很复杂, 网络上大多数的解释是:并发(concurrency):指应用能够交替执行不同的任务例:吃完饭-->喝口水-->继续吃饭-->再喝口水-->再吃饭......这时候时候就算是喝水和吃饭并发执行并行(parallellism):指应用能够同时执行不同的任务例:吃饭的时候边吃饭边打电话,这两件事情可以同时执行这...

2018-12-12 21:45:07 319

原创 JVM----G1垃圾收集器

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,早在JDK 1.7刚刚确立项目目标,Sun公司给出的JDK 1.7 RoadMap里面,它就被视为JDK 1.7中HotSpot虚拟机的一个重要进化特征。从JDK 6u14中开始就有Early Access版本的G1收集器供开发人员实验、试用,由此...

2018-12-08 23:49:35 188

原创 JVM----CMS垃圾收集器

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。从名字(包含“Mark Sweep”...

2018-12-08 23:31:22 262

原创 JVM----根节点的枚举, 安全点与安全区域

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;枚举根节点  以可达性分析中从GC Roots 节点找引用链这个操作为例,可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在的很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。  另外,可达性分析对执行时间的敏感还体现...

2018-12-08 22:45:49 807 1

原创 JVM----JVM 垃圾收集算法

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;标记-清除算法标记-清除(Mark-Sweep)算法是最基础的算法,就如它的名字一样,算法分为”标记”和”清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它主要有两个缺点:一个是效率问题,标...

2018-12-08 22:29:15 135

原创 JVM----关于方法区的垃圾回收

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区中进行垃圾收集 的“性价比” 一般比较低:在堆中 ,尤其是在新生代中,常规应用进行一次垃圾收集一般可以回收70%〜95%的空间,而永久代的垃圾收集效率远低于此。永久代的垃圾...

2018-12-08 22:08:07 1244

原创 JVM----对象回收过程: 记一次对象的自我救赎

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;预备知识: 如何判定对象存在活引用? https://blog.csdn.net/q5706503/article/details/84899581即使在可达性分析算法中不可达的对象,也并非是“非死不可”的 ,这时候它们暂时处于“缓刑” 阶段 ,要真正宣告一个对象死亡 ,至少要经历两次标记过程 : 如 果对象在进行可达性...

2018-12-08 22:05:01 349

原创 JAVA----四种引用: 强软弱虚

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。在JDK 1.2以前,Java中的引用的定义很传统 :如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种...

2018-12-08 21:59:17 206

原创 JVM----判断对象是否存活 : 引用计数算法OR可达性分析算法?

本篇来自周志明的&lt;&lt;深入理解java虚拟机&gt;&gt;在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着 ,哪些已经“死去”(即不可能再被任何途径使用的对象)。引用计数算法很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有—个地方引用它时,计数器值就加1 ; 当引用失效时...

2018-12-08 21:54:47 264

原创 利用 反射 检查类的结构 Class类和java.lang.reflect包的使用 ( 含demo )

先上运行效果:  输入我们想分析检查的类(全类名, 带包名), 以java.lang.Double为例可以看到Double类的结构一览无余,无论公有私有 是否为final和static, 即使native的本地方法都被我们的火眼金睛发现了, 这就是java反射机制的威力, 其实更可怕的是反射不仅仅用于编译程序时可以使用的类, 更多的是在程序运行的时候动态地分析类的结构并创建实例, 再通...

2018-12-08 15:56:12 2257

原创 可承载千万级用户的 RPC框架结 构详解

RPC(Remote Promote Call): 一种进程间通信方式。允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式(XML/JSON/二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。RPC结构图如下:...

2018-12-03 23:02:17 303

原创 B树(B-树)详解

B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,B-tree就是指的B树。B-树容易让人误解,建议大家用B树称呼, 本文以下直称B树这篇介绍概念, 优点应用等, B树的描述和增删改查请到隔壁我写的另一篇(篇幅较长,和这篇分开了):https://blog.csdn.net/q5706503/article/details/84729052...

2018-12-03 00:12:37 3591

原创 B树的增删改查

B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,B-tree就是指的B树。B-树容易让人误解,建议大家用B树称呼, 本文以下直称B树对概念不理解的可以参考 我的另一篇介绍B树概念和应用的博客: https://blog.csdn.net/q5706503/article/details/84729768B树的基本概念B树中结点允许...

2018-12-02 23:47:27 1408

原创 序列化和反序列化

把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。序列化的目的:1、以某种存储形式使自定义对象持久化;2、将对象从一个地方传递到另一个地方。3、使程序更具维护性。应用:对象的序列化主要有两种用途:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 在网络上传送对象的字节序列。在很多应用中,需要对某些对象进行序列化,让它...

2018-12-01 19:16:58 185

原创 通用唯一识别码: UUID

什么是UUID?UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目...

2018-12-01 16:26:29 1458

原创 ID生成 : 雪花算法(snowflake)

背景Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。雪花算法简单描述: 最高位是符号位,始终为0,二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位的时间序...

2018-12-01 16:04:45 2465

原创 乐观锁和悲观锁

悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。JAVA中synchronized关键字:(CAS在下面介绍)Java并发...

2018-12-01 15:46:41 164

原创 URL和URI区别

URI 是统一资源标识符,而 URL 是统一资源定位符。“A Uniform Resource Identifier (URI) 是一个紧凑的字符串用来标示抽象或物理资源。”“A URI 可以进一步被分为定位符(URL)、名字(URN)或两者都是. 术语“Uniform Resource Locator” (URL) 是URI的子集, 除了确定一个资源,还提供一种定位该资源的主要访问机制(...

2018-12-01 15:15:34 269

空空如也

空空如也

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

TA关注的人

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