Java基础
独家技术
这个作者很懒,什么都没留下…
展开
-
Java程序运行流程
原创 2021-03-22 16:08:19 · 158 阅读 · 0 评论 -
Java 并发编程之 Synchronized 关键字最全讲解
synchronized关键字synchronized锁什么?锁对象。锁的对象包括: 1. this 2. 临界区资源对象(任意对象) 3. Class类对象 synchronized 除了保障原子性外,其实也保障了可见性。 因为 synchronized 无论是同步的方法还是同步的代码块,都会先把主内存的数据拷贝到工作内存中,同步代码块结...原创 2019-02-19 11:57:33 · 152 阅读 · 0 评论 -
什么是CAS机制?(高级篇)
一、Java当中CAS的底层实现 CAS的底层究竟是怎么来实现的呢? 比如:AtomicInteger,是怎么做到【原子性】的比较和更新一个值?二、AtomicInteger源码分析1. AtomicInteger当中常用的自增方法 incrementAndGet: public final int incrementAndGet...原创 2019-02-28 15:36:21 · 806 阅读 · 0 评论 -
什么是CAS机制?
一、什么是CAS机制? Synchronized保证了【线程安全】,但是在某些情况下,却不是一个最优选择。关键在于【性能】问题。 1. Synchronized关键字会让没有得到【锁资源】的线程进入Blocked状态,而后在争夺到【锁资源】后恢复为Runnable状态,这个过程中涉及到操作 系统【用...原创 2019-02-27 22:51:18 · 718 阅读 · 0 评论 -
Idea开发环境中搭建Maven并且使用Maven打包部署程序
阅读目录 配置Maven的环境变量 Idea开发环境中搭建Maven 使用Maven开发JavaWeb项目(Idea14) 使用Maven打包JavaWeb项目 1.配置Maven的环境变量a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示:b.配置M2_HOME的环境变量,然后将该变量添加到Path中备注:必须要有JA...转载 2019-02-18 13:37:44 · 141 阅读 · 0 评论 -
深入分析 ThreadLocal 内存泄漏问题
前言 ThreadLocal的作用就是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。 但是如果滥用ThreadLocal,就可能会导致内存泄漏。 下面,我们将围绕三个方面来分析ThreadLocal 内存泄漏的问题 ThreadLocal 实现原理 ThreadLocal为什么会内存泄...转载 2019-02-18 12:47:22 · 331 阅读 · 1 评论 -
理解HTTPS
摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样。但是这并不代表HTTPS的真实设计过程。在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于“还原”过程。我们先不了聊HTTP,HTTPS,我们先从一个聊天软件说起,我们要实现A能发一个hello消息给B:如果我们要实现这个聊天软件,本文只考虑安全性问题要实现A发给B的hello消息包...转载 2019-02-18 09:53:25 · 126 阅读 · 0 评论 -
java中如何模拟真正的同时并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了。但是,这种请求,一般会存在启动的先后顺序了,算不得真正的同时并发!怎么样才能做到真正的同时并发呢?是本文想说的点,java中提供了闭锁 CountDownLatch, 刚好就用来做这种事就最合适了。只需要:...转载 2019-02-17 22:45:09 · 544 阅读 · 0 评论 -
Java HTTP 组件库选型
最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 1.连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连接数配置等。基本上,我们想要一个 go HTTP 标准 库自带的连接池管理功能。 2.域名解析控制。因为调用量会比较大,因此希望在域...转载 2019-02-17 22:35:35 · 311 阅读 · 0 评论 -
从今天起让我们忘记Java中的get/set方法吧!Lombok分析
Lombok Java代码简化神器Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。如何使用 1、安装IDEA插件Lombok Plugin 2、引入pom3、简单使用,设置get/set方法 4、稍微复杂一点的使用 其他使用...转载 2019-01-31 00:24:36 · 198 阅读 · 0 评论 -
集合系列—ArrayList源码分析
本篇分析ArrayList的源码,在分析之前先跟大家谈一谈数组。数组可能是我们最早接触到的数据结构之一,它是在内存中划分出一块连续的地址空间用来进行元素的存储,由于它直接操作内存,所以数组的性能要比集合类更好一些,这是使用数组的一大优势。 但是我们知道数组存在致命的缺陷,就是在初始化时必须指定数组大小,并且在后续操作中不能再更改数组的大小。在实际情况中我们遇到更多的是一开始并不知道要存放多...原创 2019-02-20 10:27:07 · 64 阅读 · 0 评论 -
什么是Volatile关键字?
一、Java的内存模型(JMM) 在仔细讲解Java的volatile关键字之前有必要先了解一下【Java的内存模型】 Java的内存模型简称JMM(Java Memory Model),是Java虚拟机所定义的一种抽象规范用来屏蔽【不同硬件】和【操作系统】的【内存访问差异】。 让Java程序在各种平台下都能达到一致的内存访问效果。...原创 2019-02-28 19:35:48 · 8842 阅读 · 2 评论 -
集合系列—LinkedList源码分析
上篇我们分析了ArrayList的底层实现,知道了ArrayList底层是基于数组实现的,因此具有查找修改快而插入删除慢的特点。本篇介绍的LinkedList是List接口的另一种实现,它的底层是基于双向链表实现的,因此它具有插入删除快而查找修改慢的特点,此外,通过对双向链表的操作还可以实现队列和栈的功能。LinkedList的底层结构如下图所示。F表示头结点引用,L表示尾结点引用...原创 2019-02-20 12:41:23 · 136 阅读 · 0 评论 -
Java中创建对象的5种方式
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。1.使用new关键字这是最常见也是最简单的创建对象的方式了。通...原创 2019-03-12 10:05:52 · 150 阅读 · 0 评论 -
什么是红黑树?
一、什么是红黑树? 要学习【红黑树】,需要先理解【二叉查找树(Binary Search Tree)】 二叉查找树(BST)具备的特性: 1. 左子树上所有节点的值均小于或等于它的根节点的值 2. 右子树上所有节点的值均大于或等于它的根节点的值 3. 左、右子树也分别为二叉排序树。...原创 2019-02-26 22:29:05 · 393 阅读 · 1 评论 -
什么是ConcurrentHashMap?
一、回首往事-HashMap 回顾HashMap的结构: HashMap是一个Entry对象的数组。 数组中的每一个Entry元素,又是一个【链表】的【头节点】 HashMap不是【线程安全的】,在高并发环境下做【插入操作】,有可能出现【环形链表】。 二、避免...原创 2019-02-26 21:29:11 · 218 阅读 · 0 评论 -
多线程/高并发下的HashMap
有一定经验的开发者都知道,HashMap是非线程安全的。 在高并发环境下,HashMap可能出现致命问题。一、Rehash是HashMap在扩容时候的一个步骤 HashMap的【容量】是有限的,当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射index位置发生冲突的几率会逐渐提高。 这时候,HashMap需要扩展它的长度(...原创 2019-02-26 18:08:02 · 3237 阅读 · 1 评论 -
HashMap原来如此简单!
一、概述 1、HashMap是一个用于存储Key-Value键值对的集合,每个【键值对】也叫作【Entry】, 这些【键值对(Entry)】分散存储在一个【数组】中,这个数组就是HashMap的主干。 大概如下图: 2、HashMap数组每一个元素的【初始值】都是Null ...原创 2019-02-26 17:13:50 · 544 阅读 · 0 评论 -
减少该死的 if else 嵌套
写在前面不知大家有没遇到过像“横放着的金字塔”一样的if else嵌套:我并没夸大其词,我是真的遇到过了!嵌套6、7层,一个函数几百行,简!直!看!死!人!if else作为每种编程语言都不可或缺的条件语句,我们在编程时会大量的用到。但if else一般不建议嵌套超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。所以,我们程序员都...转载 2019-02-21 10:43:11 · 250 阅读 · 0 评论 -
浅析 Servlet 执行原理
在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础。无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效果,本篇将主要分析Servlet的运行原理。一、UML下图为Servlet UML关系图。(Servlet,ServletConfig,Serializable)---Generic...转载 2019-02-20 22:41:20 · 402 阅读 · 0 评论 -
Java 必须掌握的 20+ 种 Spring 常用注解
注解本身没有功能的,就和 xml 一样。注解和 xml 都是一种元数据,元数据即解释数据的数据,这就是所谓配置。本文主要罗列 Spring | Spring MVC相关注解的简介。Spring部分1、声明bean的注解@Component 组件,没有明确的角色@Service 在业务逻辑层使用(service层)@Repository 在数据访问层使用(dao层)@...转载 2019-02-20 16:41:44 · 120 阅读 · 0 评论 -
8 张图理解 Java
一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。1、字符串不变性 下面这张图展示了这段代码做了什么? String s = "abcd"; s = s.concat("ef"); 2、equals()方法、hashCode...转载 2019-01-31 00:00:47 · 119 阅读 · 0 评论 -
Java多线程编程-(4)-线程本地ThreadLocal的介绍与使用
ThreadLocal简介 变量值的共享可以使用:public static变量的形式,所有的线程都使用同一个被public static修饰的变量。 那么如果想实现每一个线程都有自己的共享变量如何解决? JDK提供了ThreadLocal解决这样的问题。 类ThreadLocal主要解决的就是:每个线程绑定自己的值,可以将ThreadLocal类比成全局存放数据的盒子,...原创 2019-02-22 00:09:43 · 182 阅读 · 0 评论 -
Java大型互联网公司经典面试题,JDK源码的重要性
我们看一下这道面试题是什么呢? 题目的意思是:定义了两个Integer类型变量,通过swap方法交换这两个变量的值。 看似简单的题目,是不是不知道从何下手,我猜想有些大家第一想到的是这样的解法:来看代码: 运行结果如下: 从结果来看是错误的,不能解决我们的问题。为什么? 在分析之前,我们先介绍一下【Java访问对象的方式】。在Java堆中还必须包含能...转载 2019-02-01 00:25:16 · 1214 阅读 · 0 评论 -
Java提供的排序算法是怎么实现的?快排?
Java的JDK中我们见到的Collections.sort()和Arrays.sort()这两个排序算法的实现方式是什么?很多小伙伴心里边默认的应该是快排,但是不全对或者理解的不够深刻,以下我们从源码的层次一点点解释一下这个问题:一、Arrays.sort()的排序算法先来看看Arrays.sort(),sort方法拥有很多的重载,有十几种,以int查看如下:public st...转载 2019-01-31 22:23:03 · 279 阅读 · 0 评论 -
关于Java代码优化的N条建议!
为什么要进行代码优化?就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸鱼自然饱了。代码优化一样,也许一个两个的优化,对于提升代码的运行效率意义不大,但是只要处处都能注意代码优化,总体来说对于提升代码的运行效率就很有用了。一、代码优化的目标是: 1、减小代码的体积 2、提高代码运行的效率二、代码优化细节: 1、尽量指定类、方法的...转载 2019-01-31 21:56:54 · 172 阅读 · 1 评论 -
鲜为人知的序列化和反序列化底层实现原理!
序列化和反序列化底层是如何实现的?一、基本概念 1. 什么是序列化和反序列化 (1)Java序列化是指:把【Java对象】转换为【字节序列】的过程 而反序列化是指:把【字节序列】 恢复为【Java对象】的过程 (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完...转载 2019-01-24 13:02:08 · 831 阅读 · 2 评论 -
Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值? 检查数组是否包含某个值的方法使用LIstpublic static boolean useList(String [] arr,String target){ return Arrays....转载 2019-01-24 10:52:50 · 5619 阅读 · 0 评论 -
Java中OIO与NIO的简单区别
1、OIO中,每个线程只能处理一个channel(同步的,该线程和channel绑定)。线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。如图:NIO中,每个线程可以处理多个channel(异步)。线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。AI...转载 2019-01-23 22:48:18 · 674 阅读 · 0 评论 -
Java编译时与运行时
在开发和设计时,需要考虑【编译时】、【运行时】、【构建时】这三个概念。理解这几个概念可以更好地帮助你去了解一些基本的原理。Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢?public class ConstantFolding { static final int number1 = 5; static final int number2 = 6; ...转载 2019-01-23 22:26:12 · 388 阅读 · 0 评论 -
为什么Java中1000==1000为false 而 100==100为true?
如果你运行下面的代码Integer a = 1000, b =1000;Integer c = 100, d = 100;System.out.println(a == b);System.out.println(c == d);你会得到: false true基本知识:如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它...转载 2019-01-23 21:55:55 · 537 阅读 · 0 评论 -
Java性能优化之字符串优化处理
1. String对象 String对象是Java中重要的数据类型,其实在Java语言中,其设计者也对String做了大量的优化工作,这些也是String对象的特点,它们就是:不变性,常量池优化和String类的final定义。 1.1 不变性 String对象的状态在其被创建之后就不在发生变化。为什么说这点也是Java设计者所做的优化? ...转载 2019-01-23 18:17:39 · 260 阅读 · 0 评论 -
Java与CPU缓存是如何亲密接触的!
在解释【伪共享】这个概念之前,我们先来运行一段代码,小编的电脑上有4个core。这个程序的逻辑是4个线程共享同一个数组读写不同下标的变量。每个线程循环1亿次读写,也就是+1操作。然后统计4个线程同时跑完总共花的时间。下面我们来看看在小编的电脑上运行的结果:然后我把SharingLong里面的注释代码去掉,再跑了一下:在性能上注释前后差别高达5比1,为什么会在性能...转载 2019-02-01 14:41:16 · 114 阅读 · 0 评论 -
优秀的代码都是如何分层的?
1、背景 大部分应用分层,controller,service,mapper三层。 看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。 这样往往造成后面代码无法复用,层级关系混乱,对后续代码的...转载 2019-02-01 15:29:34 · 344 阅读 · 0 评论 -
Java多线程编程——从一个错误的双重校验锁代码谈一下volatile关键字
在Java多线程编程中提及到了一段使用Synchronized关键字实现的单利模式--双重校验锁,代码如下:其实上面这段代码是不正确的。双重锁校验需要将对象申明为volatile,不然会因为【指令重排序】导致在第一个判空时将未初始化的对象返回上述的代码是错误的写法,之所以是错误的,这是因为:指令重排优化可能会导致初始化单利对象和将该对象地址赋值给instance字段的顺序与上面...原创 2019-02-21 23:04:58 · 384 阅读 · 0 评论 -
HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!
HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。但你对这两者的区别了解有多少呢?1、线程安全 Hashtable是线程安全的,HashMap不是线程安全的。 为什么说Hashtable是线程安全的? 来看下 Hashtable 的源码,Hashtable 所有的元素操...转载 2019-02-16 10:48:44 · 194 阅读 · 0 评论 -
别再写 bug 了,避免空指针的 5 个案例!
空指针是我们 Java 开发人员经常遇到的一个基本异常,这是一个极其普遍但似乎又无法根治的问题。什么是空指针?当一个变量的值为 null 时,在 Java 里面表示一个不存在的空对象,没有实际内容,没有给它分配内存,null 也是对象成员变量的默认值。所以,一个对象如果没有进行初始化操作,这时候,如果你调用这个对象的方法或者变量,就会出现空指针异常。如下面示例会发生空指针异常:...转载 2019-02-16 10:27:04 · 146 阅读 · 0 评论 -
架构设计需要进行【服务隔离】
在做系统架构设计的时候,经常离不开的一个话题就是进行服务的隔离设计。什么是【服务隔离】呢? 服务隔离是指:将系统按照一定的原则划分为若干个服务模块,各模块之间相互独立,无强依赖。 当故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不涉及其他模块,不影响整体的系统服务。一、为什么要做服务隔离设计呢? ...转载 2019-01-23 16:41:01 · 200 阅读 · 0 评论 -
Java缓存的进化史
1. 背景 java缓存道路的发展 图中分为几个阶段: 第一阶段: 数据同步加Redis 通过[消息队列]进行数据同步至[Redis],然后Java应用直接去取缓存 优点:由于使用的【分布式缓存】,数据更新快。 缺点:依赖Redis的稳定性,一旦Redis挂了,整个缓存系统不可用...转载 2019-01-23 16:04:32 · 404 阅读 · 0 评论 -
任务代码执行时间记录器——Spring StopWatch
背景 有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值。 然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进一步控制,则需要在程序中很多地方修改。 目前spring-framework提供了一个StopWatch类可以做类似任务执行时间控制,也就是封装了一个对开始时间,结束时间记录操作...原创 2019-01-28 14:57:57 · 367 阅读 · 0 评论