自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 锁的优化——浅谈偏向锁、轻量级锁、重量级锁

JavaSE1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。在JavaSE1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁,重量级锁也不能降级成轻量级锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效...

2018-12-24 20:45:52 249

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

先给结论:class(字节码)文件经过JVM编译成机器码进行解释执行(解释执行)。对于热点代码,JIT(JustInTime)编译器会在运行时将其编译为机器码执行(编译运行)所以在JVM默认的mixed模式下JAVA既不完全是解释运行也不完全是编译运行。 正文:许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代...

2018-12-23 21:00:33 534

原创 Java——Mybatis二级缓存

一、什么是二级缓存二级缓存是mapper级别的缓存,Mybatis默认是没有开启二级缓存。多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,也就是说,二级缓存是跨SqlSession的,因此二级缓存的作用范围更大。UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespac...

2018-12-23 14:55:14 400

原创 Java——Mybatis一级缓存

一、概述当用户频繁查询某些固定的数据时,第一次将这些数据从数据库中查询出来,保存在缓存(内存,高速磁盘)中。当下次用户再次查询这些数据时,不用再通过数据库查询,而是去缓存里面查询。这么做的目的,一是提升查询速度,二是降低数据库的并发请求压力。在Mybatis中,缓存分为两种 : 一级缓存和二级缓存。而Mybatis默认开启一级缓存。一级缓存是SqlSession级别的,二级缓存是M...

2018-12-23 13:50:56 157

原创 常见加密算法原理及概念

一、概述在安全领域,利用密钥加密算法来对通信的过程进行加密是一种常见的安全手段。利用该手段能够保障数据安全通信的三个目标:1、数据的保密性,防止用户的数据被窃取或泄露2、保证数据的完整性,防止用户传输的数据被篡改3、通信双方的身份确认,确保数据来源与合法的用户而常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。下面我们来了解下相关的算法原理及其常见的算法。...

2018-12-22 16:20:17 755

原创 Java——继承机制详谈

先给出结论:子类只能继承父类的非静态方法,并可以对之进行覆盖。对于父类的成员变量和静态方法,子类不能够继承,但是子类可以访问到父类的成员变量和静态方法。如果此时子类中有与父类相同的成员变量或静态方法,也只是把父类的静态方法隐藏。当通过该变量访问它所引用的对象的成员变量和静态方法时,该实例变量的值取决于该变量的声明类型;当通过该变量来调用它所引用的对象的非静态方法时,该方法取决于它实...

2018-12-20 11:13:23 81

原创 Java——类加载机制详解

一、什么是类加载虚拟机把描述类的数据从class文件(代表类和接口,是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。 二、什么时候进行类加载与那些在编译时需要进行连接工作的语言不同,在java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。这种策略虽然会令类加载时稍微增加一些性能开销 ,但是会为Java...

2018-12-19 20:30:48 70

原创 Java——迭代器iterator详解

一、Iterator的API      关于Iterator主要有三个方法:hasNext()、next()、remove()      hasNext:没有指针下移操作,只是判断是否存在下一个元素      next:指针下移,返回该指针所指向的元素      remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素 二...

2018-12-18 15:41:07 167

原创 Java——反射的意义及优缺点

意义:1.增加程序的灵活性,避免将程序写死到代码里。例:定义了一个接口,实现这个接口的类有20个,程序里用到了这个实现类的地方有好多地方,如果不使用配置文件手写的话,代码的改动量很大,因为每个地方都要改而且不容易定位,如果你在编写之前先将接口与实现类的写在配置文件里,下次只需改配置文件,利用反射(java API已经封装好了,直接用就可以用 Class.newInstance())就可完成...

2018-12-15 17:26:54 4856

原创 JAVA——synchronized方法与synchronized代码块的区别

区别:1.当A线程访问对象的synchronized(this)代码块的时候,B线程依然可以访问对象方法中其余非synchronized块的部分。注:该情况在该方法没有加synchronized修饰的情况下成立。因为synchronized代码块和synchronized方法其实共享一把锁,锁住的同样是整个对象。2.同步方法直接在方法上加synchronized实现加锁,同步代码块则在...

2018-12-14 15:14:48 789

原创 JAVA——静态方法加锁和非静态方法加锁的区别

对象锁(实例锁,synchronized)该锁针对的是该实例对象(当前对象)。synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块。每个对象都有一个锁,且是唯一的。注意:1.指的是“类的当前实例”, 类的两个不同实例就没有这种约束了。2.锁住的只是synchronized块,static synchroni...

2018-12-14 14:44:37 1319 1

原创 Java——动态代理实现与原理详细分析

Java代理分静态代理和动态代理。 一、静态代理1、什么是静态代理编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。 2、静态代理的简单实现需求:假如一个班的同学要向老师交班费,但是都是通过班长把自己的钱转交给老师。这里,班长就是代理学生上交班费。代理模式在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加...

2018-12-14 00:29:48 94 1

原创 Java——设计模式之单例模式详解

一、单例模式定义单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 二、为什么要使用单例模式1.对于系统中的某些类来说,只有一个实例很重要。例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;售票时,一共有100张票,可有有多个窗口同时售票,但需要保证不要超售(这里的票数余量就是单例,售票涉及到多线程)。如果不是用机制对窗口对象进行唯一化将弹出...

2018-12-13 00:11:24 64

原创 JAVA——深入理解Java接口和抽象类

一、抽象类1.什么是抽象类如果一个类含有抽象方法或类用abstract关键字修饰,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。 2.抽象类和普通类的区别包含抽象方法的类称为抽象类,...

2018-12-12 22:56:32 69

原创 JVM——对象的回收

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

2018-12-12 14:30:33 44

原创 JVM——垃圾收集器GC算法

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

2018-12-12 14:27:50 36 1

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

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

2018-12-12 14:25:24 55

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

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

2018-12-12 14:19:05 50

转载 数据库——SQL Server基础之存储过程

一:存储过程概述 SQL Server中的存储过程是使用T_SQL编写的代码段。它的目的在于能够方便的从系统表中查询信息,或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口。在很多情况下,一些代码会被开发者重复编写多次,如果每次都编写相同功能的代码,不但繁琐,而且容易出错,而且由于SQL Server逐条的执行语句会降低...

2018-12-04 00:20:39 39

原创 数据库——sql优化(百万数据优化方案)

一、sql数据库优化1、索引建立索引是数据库优化各种方案之中成本最低,见效最快的解决方案,一般来讲,数据库规模在几十万和几百万级别的时候见效最快,即便是有不太复杂的表关联,也能大幅度提高sql的运行效率。 建立索引需要注意的地方1、索引一般加在查询条件的关键字上,如果有多个查询条件关键字,还可以添加组合索引,写sql的时候需要注意,索引字段和sql字段需要保持一致,否则索引会无效。...

2018-12-03 22:46:15 289

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

一、架构数据单片分发数据多片分发二、流程解析数据单片分发数据分发到一个片上,这是默认的redis分发模式。先分发请求到各个片,再在内存中构成树结构数据多片分发数据分发到多个片,显著降低数据传输速度,但是数据在内存中构成树结构所耗费的时间并未大幅减少,因为平衡二叉树的时间复杂度是o(logn),所以数据减少,时间并不会减少。...

2018-12-03 00:15:07 367

原创 可承载千万级用户的互联网ZooKeeper框架结构详解

一、架构二、流程解析1.在zookeeper注册生产者,给生产者分配标识key注:不同的生产者可以有不同的key,也可以选择使用相同的key2.在zookeeper注册消费者,也给消费者分配key注:key也可以相同,根据具体情况判断。3.消费者拿给生产者分配的key去访问对应的生产者4.生产者先对消费者分发一些服务器,再对请求的数据进行一系列计算,判断分发到哪个服务器。同时将消费...

2018-12-03 00:02:02 66

原创 可承载千万级用户的互联网公司网络框架详解

一、架构二、流程解释1.DNS根据域名查询地址注:因为DNS服务器性能数量的原因,有时候公司会选择让DNS来承担一部分分流的任务,在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。2.公司部署防火...

2018-12-02 23:05:10 327

原创 for循环和foreach的区别

1.在固定长度或者长度不需要计算的时候for循环效率高于foreach,在不确定长度或者计算长度有损性能的时候用foreach比较方便2.foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。3.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterat...

2018-12-01 22:36:44 2835

原创 List、Set、Map的区别

一、集合概述 二、List、Set、Map特点List1.可以允许重复的对象。2.可以插入多个null元素。3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 Li...

2018-12-01 22:01:44 38

原创 ArrayList、Vector和LinkedList有什么区别

ArrayList、Vector、LinkedList类均在java.util包中,均为可伸缩数组,即可以动态改变长度的数组一、ArrayList和Vector的区别存储结构ArrayList和Vector是按照顺序将元素存储(从下表为0开始),删除元素时,删除操作完成后,需要使部分元素移位,默认的初始容量都是10.ArrayList和Vector是基于数组实现的,LinkedLi...

2018-12-01 21:47:23 75

原创 HashMap、Hashtable、TreeMap、LinkedHashMap、IdentityHashMap、ConcurrentHashMap和WeakHashMap的区别

一、Map概述java为数据结构中的映射定义了一个接口java.util.Map;它有三个实现类,分别是HashMap、Hashtable 和TreeMap.Map是用来存储键值对的数据结构,在数组中通过数组下标来对其内容进行索引的,而在Map中,则是通过对象来进行索引,用来索引的对象叫做key,其对应的对象叫value。 二、类图 注:以下说的无序的意思是指不会记录插...

2018-12-01 19:23:57 435

原创 Java——集合和数组的区别

1、数组声明了它容纳的元素的类型,而集合不声明。2、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。3、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。4、数组是java语言中内置的数据类型,是线性排列的...

2018-12-01 17:42:37 92

原创 HTTP协议详解

为了更好的理解HTTP协议,我们先简单的了解一下TCP/IP协议族。通常我们所使用的网络都是在TCP/IP协议族的基础上运作的,HTTP也不例外。一. TCP/IP协议族客户端与服务器端进行相互通信,双方必须遵循相同的规则,比如1 如何探测到通信目标2 由哪一边先发起通信3 使用哪种语言进行通信4 怎样结束通信5 不同的硬件、操作系统之间如何通信1. TCP/I...

2018-11-30 00:20:58 40

原创 equals和hashcode区别

equals方法Object类中默认的实现方式是  :   return this == obj  。那就是说,只有this 和 obj引用同一个对象,才会返回true。而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals.按照约定,equals要满足以下规则。自反性:  x.equals(x) 一定是true...

2018-11-29 20:14:48 42

原创 堆外内存和堆内内存

堆内内存堆外内存和堆内内存是相对的二个概念,其中堆内内存是我们平常工作中接触比较多的,我们在jvm参数中只要使用-Xms,-Xmx等参数就可以设置堆的大小和最大值,理解jvm的堆还需要知道下面这个公式:堆内内存 = 新生代+老年代+持久代在使用堆内内存(on-heap memory)的时候,完全遵守JVM虚拟机的内存管理机制,采用垃圾回收器(GC)统一进行内存管理,GC会在某些特定的时...

2018-11-28 21:05:58 217

原创 CAS算法简介

在了解CAS之前,我们先看看几个概念来知道为什么会有CAS的出现乐观锁和悲观锁悲观锁:独占锁是一种悲观锁,synchronized就是一种独占锁,它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁:每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。 悲观锁的代价锁是...

2018-11-28 19:33:27 116

原创 微信红包架构

架构图发红包1.为了减轻服务器端压力,在客户端对红包金额数值进行拆分2.用算法为每个红包加一个唯一标识id。此处我采用的是uuid(雪花算法)+ip+时间戳3.请求通过nginx分发到各个服务器。4.服务器把数据双写到数据库中。5.服务器同时也把数据双写写入redis中。 抢红包1.抢红包请求通过nginx分发到各个服务器。2.双写到同一个消息队列中一个...

2018-11-20 17:48:19 234

原创 互联网名企面试模拟题

1.OSI有哪几层?其中http协议在哪一层?应用层网络服务与最终用户的一个接口。协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP 表示层数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)格式有,JPEG、ASCll、DECOIC、加密格式等 会话层建立、管理、终止会话。(在五层模...

2018-11-20 00:11:42 70

原创 海量数据排序算法

题目:有100万无序数据,要求从小到大排序。但是每次内存只能排序1万条数据。1.因为每次只能处理1万条数据,所以要分组处理,我们将100万数据分成100组2.因为每组数据都是无序的,所以我们使用平均时间复杂度较好的算法。3.当我们分组排序完成后,我们要排序1万条数据就会简单很多了。我们一共要取1万条数据,一共有100组,那么每组取100条数据,一共1万条数据进行堆排序。每次堆排序可以取...

2018-11-19 21:46:16 653

原创 Java——进程和线程区别(纠正网上几个常见的误解)

1.什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。进程由两部分构成:进程内核对象,地址空间。每个进程至少由三要素组成:程序块、数据块、进程控制块进程是系统进行资源分配的一个基本单位,是资源分配的最小单位。进程只能通过通信共享而一个进程又是由多个线程所组成的。 进程的执行进程执行的时候通过进程控制块找到入口进...

2018-11-16 23:59:40 60

原创 Java多线程详解

什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。单核CPU时:有多个线程,A线程先运行一段时间然后切换成B线程,如此继续切换。中间切换时会有卡顿,但是只占很短的时间片,在用户眼中,就好像有多个线程在执行。多核CPU时:多个线程确实在并发运行,每个CPU运行一个线程。如果不...

2018-11-16 23:59:09 41

原创 杂谈——ajax跳转的一些坑

1.ajax提交请求,被@RequestMapping方法接收,返回ModelAndView对象,想通过视图解析器返回到相应的视图解析页面是不能成功的。因为之前提交的ajax请求并没有结束,因此页面也未关闭,不能跳转到想要的视图页面。解决办法:1.form表单 2.类似a链接的跳转2.在js页面中提交form表单,这个时间ajax提交请求后返回,如果想要跳转到相应的页面也不能成功,猜测应该...

2018-11-15 20:49:07 100

原创 Java——内部类详解

内部类定义将一个类的定义放在另一个类的内部 为什么要内部类?1.每个内部类自身都能单独的继承基类或实现接口,而不受外部类的约束2.通过内部类加上接口,可以很好的实现多继承的效果。3.public interface Contents { int value(); } public class Goods { private class ...

2018-11-15 09:17:43 35

原创 JAVA128陷阱

测试:public static void main(String[] args){ Integer a=128; Integer b=128; System.out.print(a==b);//false a=127; b=127; System.out.print(a==b);//true}实际情况是当Integer的值处于-...

2018-11-14 23:18:31 75

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