自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring中的设计模式

1、简单工厂spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。2、单例模式保证了一个类仅有一个实例,并提供一个访问它的全局访问点。spring中的单例模式完成了后半句,即提供了全局访问点BeanFactory,但没有从构造器级别去控制单例,这是因为spring管理的是任意的Java对象。spring下默认的bean都是singleto...

2019-10-26 12:39:56 123

原创 redis和memcached有什么区别?

1)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去,这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的数据操作通常和一般的SET和GET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么redis会是不错的选择。2)内存使用...

2019-10-21 16:07:18 214

原创 synchronized的局限性与lock的好处

synchronized的局限性与lock的好处:如果一个代码块被synchronized关键字修饰,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待直至占有锁的线程释放锁。事实上,占有锁的线程释放锁一般会是以下三种情况之一:占有锁的线程执行完了该代码块,然后释放对锁的占有;占有锁线程执行发生异常,此时JVM会让线程自动释放锁;占有锁线程进入 WAITING 状态从而释...

2019-10-18 23:48:24 358

原创 双亲委派机制的破坏

第一次被破坏其实发生在双亲委派模型出现之前–即JDK1.2发布之前。由于双亲委派模型是在JDK1.2之后才被引入的,而类加载器和抽象类java.lang.ClassLoader则是JDK1.0时候就已经存在,面对已经存在 的用户自定义类加载器的实现代码,Java设计者引入双亲委派模型时不得不做出一些妥协。为了向前兼容,JDK1.2之后的java.lang.ClassLoader添加了一个新的pr...

2019-10-18 23:22:28 780

转载 数据库的分库分表

分库: 一个库一般最多支撑到并发2000,就要扩容了,而且一个健康的单库并发值最好保持在每秒1000左右,不要太大。那么就可以将一个库的数据拆分到多个库中,访问的时候就只访问存取该数据的库就可以了。分表: 把一个表的数据放到多个表中,然后查询就查询一个表。比如按用户id来分表,将一个用户的数据放在其中一个表里,然后操作的时候只对那个表进行操作就好了。这样可以控制每个表的数据在可控的范围内,比如每...

2019-10-15 23:39:09 1007

原创 如何设计一个高并发的系统?

1、系统拆分将一个系统拆分成多个子系统,可以用dubbo来搞。然后每个系统连接一个数据库,多个系统就由多个数据库,这样可以抗高并发。2、缓存大部分高并发的场景都是读多写少,对热点数据进行缓存,用redis,单机轻松搞定几万并发。3、用消息队列MQ可能会出现高并发写的场景,这个时候用redis来承载写就不行了,因为是缓存,数据随时可能被LRU了,数据格式还无比简单,没有事务支持。只能用My...

2019-10-15 14:53:11 485

转载 JVM常见的问题

方法区方法区与Java堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。对于JDK1.8之前的HotSpot虚拟机而言,很多人经常将方法区称为我们上图中所描述的永久代,实际上两者并不等价,因为这仅仅是HotSpot的设计团队选择利用永久代来实现方法区而言。同时对于其他虚拟机比如IBM J9中是不存在永久代的概念的。其实,移除永久...

2019-10-14 15:41:05 137

转载 什么是幂等性?

HTTP 幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。HTTP GET 方法HTTP GET 方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。GET /tickets # 获取ticket列表GET /tickets/12 # 查看某个具体的ticket只...

2019-10-14 15:32:25 1162 1

转载 JDK8接口的新特性

在JDK8环境中,接口中的方法不再是只能有抽象方法,他可以有静态方法和default方法。package com.wangcc.MyJavaSE.jdk8interface;public interface NewInterface { static void staticMethod() { System.out.println("staticMethod"); ...

2019-10-13 14:14:43 112

转载 海量数据解决思路之BitMap

使用场景:给一台普通PC,2G内存,要求处理一个包含40亿个不重复并且没有排过序的无符号的int整数,给出一个整数,问如果快速地判断这个整数是否在文件40亿个数据当中?问题分析:40亿个int占(40亿*4)/1024/1024/1024 大概为14.9G左右,很明显内存只有2G,放不下,因此不可能将这40亿数据放到内存中计算。要快速的解决这个问题最好的方案就是将数据搁内存了,所以现在的问题...

2019-10-13 10:47:26 234

原创 synchronized和lock的区别

1、synchronized是Java内置关键字,在jvm层面上,lock是个Java类。2、synchronized无法判断是否获取锁的状态,lock可以判断是否获取到锁。3、synchronized会自动释放锁,lock需要在finally中手动释放锁,否则容易造成线程死锁。4、用synchronized关键字,如果线程1获得锁,线程2会等待下去。而lock锁就不一定会等待下去,如果尝试...

2019-10-12 19:48:25 132

原创 MySQL主从复制的原理

MySQL主从复制涉及到三个线程,一个运行在主节点,其余两个运行在从节点,如图:主节点 log dump 线程:当从节点连接主节点时,主节点会创建一个log dump线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。从节点 I/O线程:当从节点上执行‘ start slave ’ ...

2019-10-11 21:58:46 132

转载 SpringSecurity 基础入门

介绍:Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架(简单说是对访问权限进行控制嘛)。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系...

2019-10-06 23:52:03 160

转载 String源码解析

string的底层还是char数组,用final修饰,只是引用的地址不可变,但地址存放的内容是可以改变。String不可变的本质原因是它不提供修改char数组的方法,是严格封装的。具体看这篇,很详细。...

2019-10-06 20:36:43 139

转载 Redis的淘汰策略

Redis的六种淘汰策略maxmemory 配置指令maxmemory 用于指定 Redis 能使用的最大内存。既可以在 redis.conf 文件中设置, 也可以在运行过程中通过 CONFIG SET 命令动态修改。例如, 要设置 100MB 的内存限制, 可以在 redis.conf 文件中这样配置:maxmemory 100mb将 maxmemory 设置为 0, 则表示不进行内...

2019-10-06 11:00:14 159

转载 Java IO和NIO的区别

一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。二、NIO和IO的主要区别下表总结了Java IO和NIO之间的主要区别:1、面向流与面向缓冲 Java IO和NIO之间第...

2019-10-06 10:43:56 483

转载 泛型常见面试题

Java中的泛型是什么 ? 使用泛型的好处是什么?在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全 ,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException。Java的泛型是如何工作的 ? 什么是类型擦除 ?泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不...

2019-10-06 10:07:41 461

转载 Java开发必会的Linux命令

https://juejin.im/post/5ac04f206fb9a028d1413bf2

2019-10-06 09:41:10 131

原创 ActiveMQ如何保证消息不丢失

如何确保ActiveMQ的消息不会丢失呢?除了消息持久化,还要取决于ACK的返回,主要设置服务器session。默认是Session.AUTO_ACKNOWLEDGE,客户端onmessage监听到接收后,返回ACK给服务器。这样就能保证消息不会丢失了。(还有其他设置,Session.CLIENT_ACKNOWLEDGE ,客户端主动调用acknowledge 方法签收消息,第三种是Sessi...

2019-10-06 09:40:06 7441 2

原创 ActiveMQ处理消息积压问题

1、为什么消息会积压?平台中每个交易的发生可能会产生一到多条的消息通知数据,这些通知数据会通过消息队列(ActiveMQ)来中转消费并处理,那么在交易量突发洪峰的情况下会产生大量的消息通知数据,如果消息队列(ActiveMQ)的消费能力被阻塞的话会严重影响到数据的吞吐量,从而积压大量数据无法被快速处理!2、为什么配置多个消费者还是无法缓解?①:经过分析消息队列的数据消费处理模块的代码,消息的...

2019-10-05 20:48:06 6635

转载 HttpClient和Dubbo的区别

HttpClientHttpClient用来调用服务,它是模拟一个浏览器,发送Http的请求,服务器会返回请求的一个响应结果;Httpclient然后把响应的结果取出来。 HttpClinet相当于一个客户端,使用Http协议调用系统中的方法HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。Http...

2019-10-05 16:58:38 2566

转载 NIO的基础知识

转自该链接,描述很详细:添加链接描述NIO的简单概念缓存区Buffer:在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。区别于面向流的I/O:数据直接写入或者将数据直接读到流对象中。通道Channel:通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任...

2019-10-05 14:44:36 208

转载 redis缓存击穿,失效以及热点key解决方案

缓存击穿:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。解决方案: 当通过某一个key去查询数据的时候,如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的失效时间,这时在缓存失效之前,所有通过此key的访问都被缓存挡住了。后面如果此key对...

2019-10-05 13:22:47 1063

转载 zookeeper作为注册中心的原理

RPC框架有三个重要的角色:1、注册中心:保存所有服务的名字,服务提供者的ip列表,服务消费者的ip列表。2、服务提供者:提供跨进程的服务。3、服务消费者:寻找到指定命名的服务并消费。zookeeper作为注册中心的原理zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)...

2019-10-05 12:42:06 902

原创 zookeeper之故障恢复

一、zookeeper之数据结构ZnodeZnode包含了数据,子节点引用,访问权限等。如图:data:Znode存储的数据信息。ACL:记录Znode的访问权限,即哪些人或哪些IP可以访问本节点。stat:包含Znode的各种元数据,比如事务ID,版本号,时间戳,大小等。child:当前节点的子节点引用,类似于二叉树的左右孩子。需要注意的是:zookeeper是为读多写少的...

2019-10-05 10:19:26 1810

原创 用户态和内核态的区别

1、Linux进程有4GB的地址空间,如图:3G-4G大部分是共享的,是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。2、特权级的概念:对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特...

2019-10-04 17:01:35 396

原创 Java多线程的各种锁

1、乐观锁:CAS乐观锁正好和悲观锁相反,它获取数据的时候,并不担心数据被修改,每次获取数据的时候也不会加锁,只是在更新数据的时候,通过判断现有的数 据是否和原数据一致来判断数据是否被其他线程操作,如果没被其他线程修改则进行数据更新,如果被其他线程修改则不进行数据更新。2、悲观锁:synchronized悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此...

2019-10-04 16:25:07 172

原创 深入理解数据库索引结构

1)数据库文件存储的方式:数据库文件存储都是以磁盘文件存储在系统中的,这也是数据库能持久化存储数据的原因。2)从数据库读取数据的原理:从数据库读取数据,先暂且不考虑从缓存中读取数据的情况,那就是从磁盘文件中读取数据的,我们知道从磁盘文件中读取数据是比较耗时的,数据库的select操作的时间,取决于执行磁盘IO的次数,因此尽量减少磁盘IO就可以显著的提升数据的查询速度。3)减少磁盘IO操作的...

2019-10-04 15:40:08 261

原创 什么是B-树和B+树?

一、B树即B-树定义:一个m阶(它的每个节点最多包含m个孩子,m就是B树的阶)的B树具有以下特征:1. 根节点至少含有两个子女。2. 每个中间节点都包含k-1个元素和k个孩子,其中m/2 <= k <=m。3. 每个叶子节点都包含k-1个元素,其中m/2 <= k <= m。4. 所有的叶子节点都位于同一层,叶子节点不包含任何关键信息。5. 每个节点中的元素从小...

2019-10-04 15:03:40 4447

原创 高并发下线程安全的单例模式

一、饥饿模式的单例//饥饿模式public final class EagerSingleton { private static EagerSingleton singObj = new EagerSingleton(); private EagerSingleton(){ } public static EagerSingle...

2019-10-04 10:27:38 185

转载 分布式锁之zookeeper

一、zookeeper节点的概念Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode。Znode分为四种类型:1、持久节点(presistent)默认的节点类型。创建节点的客户端和zookeeper断开连接后,该节点依旧存在。2、持久节点顺序节点(presistent_sequential)所谓顺序节点,就是在创建节点时,zookeeper根据创建的时...

2019-10-04 09:31:18 345

原创 分布式锁之Redis

一、什么是分布式锁对于单进程应用而言,即所有线程都在同一个JVM进程里的时候,使用Java语言提供的锁机制就可以起到对共享资源进行同步的作用。如:如果是分布式环境下,多个不同线程需要对共享资源进行同步,那么用Java的锁机制就无法实现了。这个时候就必须借助分布式锁来解决分布式环境下共享资源的同步问题。举例:项目中服务采用集群部署,不同的客户端都可以同时对资源进行访问。二、Redis实现...

2019-10-03 23:34:41 180

原创 跨域请求的原因及解决方案

一、什么是跨域?请求方与服务方的源不同,就是跨域,包括:协议不同域名不同端口不同跨域的缘由:主要是因为浏览器指定的同源策略,即“协议+域名+端口”都相同,它是浏览器最基本和最核心的安全机制,关闭它会容易受到XSS和CSRF的攻击。跨域的后果:Cookie,LocalStorage,IndexDB无法获取DOM和JS对象无法获得AJAX请求不能发送(实际能发送,但拿不到结果...

2019-10-03 13:00:41 593

原创 静态代理和动态代理

一、代理Proxy代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让我们完成与另一个类之间的关系的统一管理,但是切记,代理类和委托类要实现相同的接口,因为代...

2019-10-02 16:30:58 101

原创 Java自动装箱和拆箱的实现原理

一、装箱和拆箱原始类型转换为对象类型就是装箱,反之就是拆箱。原始类型byte,short,char,int,long,float,double,boolean对应的封装类为Byte,Shor,Character,Integer,Long,Float,Double,Boolean.二、源码解读自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intV...

2019-10-02 10:23:55 2793

原创 ArrayList源码解读(基于JDK8)

一、ArrayList简介ArrayList的实现原理就是数组,是线程不安全的,允许其中元素为null。它实现了List<E>, RandomAccess, Cloneable, java.io.Serializable接口,其中RandomAccess代表了其拥有随机快速访问的能力,ArrayList可以以O(1)的时间复杂度去根据下标访问元素。因为底层是数组,所以会占用一块连...

2019-10-01 19:52:08 207

原创 LinkedList源码解析(JDK1.8)

一、LinkedList简介LinkedList是通过双链表来实现的,本身实现了List接口和Deque接口,并且实现了所有可选的列表操作,并且允许包含所有元素(包括null)。继承了AbstractSequentialList抽象类: 遍历LinkedList的时候,官方推荐使用顺序访问,就是使用迭代器,相当于直接遍历一个链表。***(虽然LinkedList提供了get(index)...

2019-10-01 14:58:58 225

原创 RPC框架详解

一、什么是RPC?RPC(Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。就是从一台客户端上通过参数传递的方式调用另一台服务器上的一个函数或方法,并得到返回的结果。RPC会隐藏底层的通讯细节(不需要直接处理Socket通信或Http通讯)。客户端发起请求,服务端返回响应,RPC在使用形式上像调用本地函数一样去调用远程的函数。为什么要用RPC...

2019-09-30 23:20:15 2420

原创 CAS的实现原理及Atomic的原子性

D## 一、锁机制的缺点悲观锁存在的问题:在多线程的竞争下,加锁和释放锁会导致比较多的上下文切换和调度延时,引起性能问题。一个线程持有锁会导致其他所有需要此锁的线程被挂起。乐观锁的好处:认为在并发场景下大部分时间都不会产生冲突,因此每次读写数据不加锁而是假设没有冲突去完成某项操作,如果因冲突失败就重试,直到成功为止。用到的机制就是CAS。二、CAS的实现原理CAS操作包括三个操作数...

2019-09-29 18:55:03 1759

原创 Java类加载器和加载机制详解

一、原理:JVM将class文件字节码文件加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.class对象,作为方法区类数据的访问入口。二、类加载过程:JVM类加载机制分为五部分:加载,验证,准备,解析,初始化。其中,加载,检验,准备,初始化,和卸载这五个阶段的顺序是固定的,而解析则未必。为...

2019-09-29 17:16:33 212

空空如也

空空如也

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

TA关注的人

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