自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

斜阳雨陌

你有多努力,就有多特殊!

原创 【精心总结】java内存模型和多线程必会知识
原力计划

内存模型 (1)java内存模型到底是个啥子东西? java内存模型是java虚拟机规范定义的一种特定模型,用以屏蔽不同硬件和操作系统内存访问差异,让java在不同平台中能达到一致的内存访问效果,是在特定的协议下对特定的内存或高速缓存进行读写访问的抽象。我来简单的总结成一句话就是:java内存模型...

2020-04-19 23:50:46 118 0

原创 一起唠唠分布式锁

(1)分布式锁和分布式事务的区别 1.分布式锁是在集群环境下,用来控制不同机器对全局共享资源的访问。 2.分布式事务是在集群环境下,用来保证全局事务的一致性,保证多个数据库的数据整体上能正确的从一个一致性状态转到另一个一致性状态。 (2)分布式锁应用场景 在我们的某个jvm应用程序中,如果需要对某...

2020-03-26 23:18:57 93 0

原创 带你理解Spring AOP

AOP概述 在我们的日常开发中,除了正常业务逻辑外,还可能经常会需要在业务逻辑的特定位置加入日志,以便于调试和问题分析。但是这种插入日志的逻辑和业务逻辑间并不存在连续性和依赖性,这种逻辑侵入随着项目的不断发展,会导致项目越来越来臃肿,同时也更加难以管理。为了解决这个问题,优秀的前辈们推出了AOP...

2020-03-01 23:04:31 180 0

原创 深入了解Spring IoC
原力计划

IoC全称Inversion of Control即控制反转,它还有一个别名依赖注入。spring利用Ioc容器帮我们自动构建对象及注入依赖对象,减少了对象构建与业务代码的耦合,使得我们能够更加高效愉快的写bug????了( ̄▽ ̄)"。接下来我们详细介绍下这个spring Ioc吧。 依...

2020-02-29 22:58:37 128 0

原创 Thread.yield()和Thread.sleep(0)

关于Thread.yield()和Thread.sleep(0)的语义问题真是一个让人挠头的问题,翻了好多资料,在java6语言规范中看到了一段这样的描述: 重点在红框中,简而言之就是:sleep(0)和yield()的实现不需要任何可见的效果。那么在实现这两个函数的语义时就可以什么都不做,这取...

2019-12-07 22:26:18 488 0

原创 java线程实现及线程池的使用

(一)Java线程实现 线程把处理器的调度和资源分配分开,是cpu的最小调度单位。多个线程可以共享进程的内存资源,又可以独立调度。java线程关键方法都是通过高效的本地方法实现的。Java线程的主要实现方式有三种:内核实现、用户实现、内核用户混合实现。 1.内核实现 内核线程就是由内核调度、映射的...

2019-12-01 23:14:24 135 0

原创 JVM对象占用内存计算

大家都知道,jvm中对象实例存储在堆中,对象的引用存储在栈中,而对象的元数据(类型数据)存储在方法区。在我们进行内存优化的过程中经常需要了解每个对象占用的内存大小。接下来我将介绍对象占用内存大小的计算方式,首先从java对象模型说起。 Java的对象模型 java是面向对象的语言,每个对象都属于...

2019-11-05 22:31:34 297 0

原创 使用final修饰局部变量???

为什么有些人使用final修饰局部变量

2019-09-28 17:56:12 314 4

原创 java内存区域及静态常量池、运行时常量池介绍

java内存区域介绍 我们先来介绍下虚拟机运行时数据区的结构: 我们项目中的每一个线程在运行时,都会有拥有自己独立的栈数据和程序计数器。程序计数器可以看作字节码命令的指示器,记录了下个需要执行的字节码指令,栈数据主要分为本地方法栈和java虚拟机栈。java虚拟机栈就是用来处理我们程序中代...

2019-08-03 20:23:51 356 0

原创 如何使用log.debug()

log4j是一个开源的日志,共分为六个等级:LOG、DEBUG、INFO、WARN、ERROR、和FATAL。 DEBUG是其中的一种日志级别。一般我们用这个方法的时候都是这样的: if(log.isDebugEnabled()){ log.debug("debug!"...

2018-03-21 20:41:57 18866 4

原创 Minor GC和Full GC

我们在日常开发中可能经常会听大家谈论GC,但是其实很多人对GC的种类其实并不是很了解,接下来我们简单介绍下Minor GC和Full GC及他们的区别。 MinorGC: 也可以叫作新生代GC,指的是发生在新生代的垃圾收集动作。因为新生代中对象大部分的生命周期都很短,都是朝生暮死,所以MinorG...

2020-04-12 16:28:19 93 0

原创 同步/异步&阻塞/非阻塞

平时开发中经常会听大家说到什么同步阻塞、异步非阻塞等等名词,这里我谈下自己对这两个名词的理解,仅仅是个人观点,并不一定正确。 1.阻塞/非阻塞 我认为判定阻塞还是非阻塞,取决于线程所做的操作是否需要将线程挂起等待。 举个例子,我们都知道CAS是非阻塞的,而synchronized是阻塞的。为什么呢...

2020-04-07 00:04:59 68 0

原创 从源码看ConcurrentHashMap
原力计划

简介 ConcurrentHashMap是线程安全且高效的HashMap实现。这里主要研究JDK8后的ConcurrentHashMap。下面是ConcurrentHashMap的简单结构: ConcurrentHashMap基于HashMap的基本逻辑,通过CAS + synchronized ...

2020-03-28 21:50:46 83 0

原创 java类加载顺序及对象实例化顺序

在java中类的加载、连初始化都是在程序运行期完成的,虽然会稍微增加开销,但是却很大的增加了灵活性,我们可用在运行期间动态的去网络获取其他地方加载一个二进制流来作为程序代码的一部分。接下来我们简单介绍下java类的加载顺序。 从上图中我们可以看到类的生命周期主要有7个过程,分别为加载、验证、准备...

2020-03-01 18:35:22 136 2

原创 Spring事务那些事儿

(一)事务的隔离级别 大家都知道事务有四个属性,即ACID(原子性、一致性、隔离性、持久性)。这四个里面稍微难理解点的是一致性和持久性。所谓的一致性是指:事务执行前后数据的一致性状态,例如事务执行前用户有1万元,事务回滚后用户仍应该有1万元。而这里的持久性指的是:事务在提交后结果是永久的,即使程...

2020-02-19 23:07:14 193 0

原创 java Exception

(1)异常类体系 我们先来看下java异常类的体系结构: Java将java.lang.Throwable作为所有异常的超类。Throwable有两个重要的子类:Exception(异常)和 Error(错误)。 Error:代表程序无法处理的异常,一般发生在严重故障时,通常都是jvm错误,例如...

2020-02-05 17:54:16 113 0

原创 深入理解HashMap

1.HashMap的序列化 HashMap中的数据主要存储在类型为Node<K,V>的table数组中。但是我们看下源码,却会发现table使用了transient修饰(即不参与序列化),那么问题来了:HashMap是如何实现序列化的呢?我们仔细翻下代码,可以看到HashMap自己实现...

2019-12-23 22:17:53 158 0

原创 红黑树和B+树

红黑树简介 红黑树是一种自平衡二叉查找树,也被称为"对称二叉B树",它可以在O(logn)时间内利用 O(logn)的空间来完成查找、插入、删除操作。红黑树的读操作与普通二叉查找树相同,而插入和删除操作可能会破坏红黑树的规则,需要进行恢复操作。恢复红黑树的性质需要少量的颜色变更...

2019-12-11 23:01:55 121 2

原创 java transient关键字

transient是用在序列化中的,当我们序列化的过程中,如果我们不想序列化某个字段,那么我们就可以使用这个关键字。jvm就会在序列化的时候忽略这个字段的数值。 transient主要有两个用途: 1.保证数据的安全。在进行序列化时,可以将我们的私密数据隐藏起来,不对外暴露。 2.减少无用数据的传...

2019-11-17 19:16:59 72 0

原创 mysql中count(*)和count(1)和count(column)区别

在日常的mysql使用中,我们经常会看到SELECT COUNT(*)、SELECT COUNT(1)等查询语句,他们到底有什么区别呢?今天我就来总结下两者的区别。 我们从COUNT()函数的含义说起: count(*) 统计满足查询条件的结果集的总行数(包含null) count(1) 统计满...

2019-11-14 21:52:28 141 0

转载 Synchronization and Object Locking

One of the major strengths of the Java programming language is its built-in support for multi-threaded programs. An object that is shared between mul...

2019-11-10 18:27:52 73 0

原创 占用较多堆外内存的区域

(1)Director Memory 主要在nio中会使用,在内存不足时会抛出OOM或者OOM:Direct buffer memory。 (2)线程堆栈 为每个线程分配的栈空间,用于保存局部变量,执行程序代码。内存不足时可能抛出StackOverflowError或者OOM:unable to ...

2019-10-19 16:41:35 88 0

原创 JVM中安全点safePoint有哪些?

安全点是jvm选来进行GC的线程中断点。线程在执行到安全点后询问GC标志位,若标志位标识将要进行GC,则程序主动中断挂起线程等待GC。安全点的选定基本上是根据"是否具有让程序长时间执行的特征"为标准进行选定的。目前会产生安全点的主要有:1.方法调用、2.循环跳转、3.异常跳转。...

2019-10-04 18:34:35 102 0

原创 JVM中GC Root对象有哪些?

众所周知,我们目前最常用的虚拟机hotspot使用可达性分析来进行垃圾回收,而可达性分析需要依赖GC Root。下面我就来可以作为GC Root的对象。 (一)虚拟机栈中引用的对象 虚拟机栈中的引用的对象可以作为GC Root。我们程序在虚拟机的栈中执行,每次函数调用调用都是一次入栈。在栈中包括...

2019-10-04 17:21:47 829 0

原创 重载与重写(overload and override)

在java编程中经常会遇到重载和重写,刚接触java的时候对这对概念比较懵比,也不能理解其中的区别,后来在逐渐的学习中更加深刻的理解了其中的原理。哎,说来还是基础知识学的不扎实,这些都是大学期间偷懒欠下的帐。 (一)简单理解 (我自己的理解方式) 1.重载是在一个类中有多个名称一样的方法,需要根据...

2019-09-21 21:16:39 144 2

原创 动态代理

动态代理是一种字节码生成技术,用来实现代理模式以对目标类或方法进行增强。这里的动态是相对我们自己手动编写的代理类而言的。动态代理依靠jvm或各种字节码类库在程序编译期或运行期间自动生成代理类。这些字节码类库中有些是我们比较常见和熟悉的,例如CGlib、Aspectj,以及jdk自带的。下面列出了这...

2019-09-15 19:44:01 107 0

原创 Class.forName和ClassLoader

(1)ClassLoader使用来加载类数据的(加载的方式由具体的加载器决定)。类加载器根据类的全限定名加载类的二进制字节流,然后将字节流转换成jvm方法区中的运行时数据结构,并在方法区生成一个代表该类的Class对象作为访问入口(单例的)。 (2)Class.forName方法会首先获取调用对象...

2019-09-15 16:42:50 63 0

翻译 What is PECS (Producer Extends Consumer Super)?

"PECS" is from the collection's point of view. If you areonlypulling items from a generic collection, it is a producer and you should ...

2019-08-21 20:52:09 125 0

原创 java8中LocalDate、LocalTime、LocalDateTime介绍

很久以前java8中就推出了新的Time API,旨在解决旧版Date和Calendar的缺陷。讲道理真的挺好用的,不过由其他工具对新版time的兼容并不够完善,导致现在使用还不够普及。大家都还在用老的Date类,苦

2019-08-01 21:32:40 145 0

原创 java装箱拆箱

所谓的拆箱装箱,其实就是一个简单的语法糖。我们以Integer为

2019-07-31 22:07:51 142 0

原创 Java程序编译运行过程

整体流程 1.首先由源程序文件编译成class文件。注意这里的源程序并不仅限于java程序,其他语言如果能够编译成class文件,并且符合jvm规范也能够在jvm上运行。 2.jvm将class文件拷贝到内存,解释成相应的机器语言运行。我们常用的hotspot虚拟机在运行时会挑选出一些热点代码...

2019-07-21 16:23:21 712 0

原创 java中byte、short、char、boolean实际都是按照int处理的!

byte、char、short、boolean四种类型在汇编期或运行期间采取和int类型一样的存储方式,在计算时会先转换为int类型,后进行计算。所以两个short类型数据做算数运算,结果却为int类型。这主要是因为jvm的字节码为了简洁高效,设计时只使用一个字节,导致命令的数量有限,不能为所有类...

2019-07-20 20:58:03 188 0

原创 jackson/fastJson boolean类型问题

1.我们以Person对象举个栗子,person有三个属性。name,age和isGay @Data public class Person { public Person(String name, int age, boolean isGay) { this.nam...

2019-07-18 22:26:51 838 0

原创 Java-Type简单分类

(1)ParameterizedType: 参数化类型,例如List<T>。 (2)GenericArrayType: 泛型数组类型,例如T[]。 (3)TypeVariable: 泛型的类型变量,例如T。 (4)Class: 类型对象,实现了type接口,例如T.cla...

2019-07-15 22:11:55 101 0

原创 java接口类支持多继承

一个类只能extends一个父类,只能有一个父类,但可以implements多个接口。java通过使用接口的概念来取代C++中多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。Java中的接口是支持多继承的。 ...

2019-07-09 22:23:47 155 0

原创 java对象占用内存大小?

一个不包含任何内部成员变量的空Object大约占33byte,若增加成员变量,则增加相应大小的内存占用。 测算方式:设置jvm的堆大小为1m,在堆中不停new不含任何成员变量的OOMObject对象,直到堆内存溢出。如下图,在创建31351个对象后内存溢出。则1m = 1024*1024byte...

2019-06-16 16:11:06 571 1

原创 cpu执行命令方式

(一)有序处理器 早期的处理器为有序处理器(In-order processors),有序处理器处理指令通常有以下几步: 指令获取 如果指令的输入操作对象(input operands)可用(例如已经在寄存器中了),则将此指令分发到适当的功能单元中。如果一个或者多个操作对象不可用(通常是由于...

2019-06-05 21:52:54 593 0

原创 java ++i、i++、i++ + ++i、i++ + i++原理

先上代码: public static void main(String args[]) { int A = 1; int B = 10; int C = 100; int D = 1000; System.ou...

2019-06-01 20:13:38 217 0

原创 静态代码块

private static final HashMap<String, String> MAP = new HashMap<String, String>(); static { MAP.put("banana", "honey&...

2019-05-24 21:43:04 383 0

原创 mysql event 简单demo

功能:每3秒删除b表数据,查询a表中的5条数据并插入b表。 /* 查看mysql事件状态 */ show variables like '%event_scheduler%'; /* 开启mysql事件 */ SET GLOBAL event_scheduler = ON...

2019-04-30 16:16:01 137 0

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