- 博客(46)
- 资源 (2)
- 收藏
- 关注

原创 Java
1.Java基础-源码1. 常用的设计模式Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模版模式Decorator装饰器模式Observer观察者模式2. Spring5源码和层次分析Beans1.接口实例化2.代理Bean操作Context1....
2018-12-03 18:32:26
338
原创 Synchronized与J.U.C(java.util.concurrent)下的ReetrantLock区别及使用场景
通常在面试时,面试官会问到你,Java中实现同步有哪些方式(或者可以问你Java中有哪些加锁的方式?或是Java中有哪些方式可以保证线程并发安全?)此类的问题,今天谈谈相应的实现方式和使用场景。Synchronized关键字这个JVM原生语法层面的互斥锁,核心是通过使用对象锁进行实现(对象锁,简单的说在每个Java对象的对象头中的Mark Word中都会有一个Monitor对象-由C语言的ObjectMonitor实现),在对实例方法或者类方法(static方法)添加此关键字时,是通过标志位AC.
2020-08-26 12:31:41
347
1
原创 “大话”-简单工厂、工厂方法、抽象工厂模式
最近在又细读了一遍《大话设计模式》之后,对其中提到的3种工厂模式有些概念和使用上的模糊,因此结合书中讲解和码友们的资料,自我总结一下,供以后复习时参考。1. 几种工厂模式的本质:“工厂”二字,其含义是使用工厂(一个或一系列方法)去生产产品(一个或一系列类的实例)。有时候,我们常常会将生产产品的一个或一系列方法封装到一个类中,我习惯把这个类叫做“工厂类”;而被实例化的类称作“产品类”。2...
2019-05-10 10:39:01
259
原创 数据库的锁
悲观锁和乐观锁:并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳:乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据;----- 乐观锁就比较简单了,就是不做控制,这只是一部分人对于并发所持有的一种态度而已。----- 乐观锁一般会使用版本号机制或CAS算法实现。悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度...
2019-05-08 17:30:01
224
原创 重构-要点列表
《重构-改善代码的既有设计》-阅读后,在书中的重点归纳,记录一下,随时复习。如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便的达成目的,那就先重构那个程序,使特性的添加比较容易,然后再添加特性。重构前,先检查自己是否有一套可靠的测试机制。这些测试必须有自我检验的能力。重构技术就是以微小步伐修改程序。如果你犯下错误,很容易便可发现它。任何一个傻瓜都能写出计算机可以理解的代...
2019-05-08 15:23:19
194
转载 “大话”-分布式事务
分布式事务分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。分布式事务产生的原因Service 多个节点随着互...
2019-05-06 17:23:16
165
原创 Java内存模型中,一些“天然的”先行发生(happens-before)关系
这些先行发生关系无须任何同步协助器就已经存在,可以在编码中直接使用。如果两个操作之间的关系不在此列,并且无法从下列规则中推导出来的话,他们就没有顺序性保障,虚拟机可以任意对他们进行重排序。先行发生是指Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在操作B发生之前,操作A产生的‘影响’就能被操作B观察到。‘影响’包括了修改了共享变量的值,发送了消息...
2019-05-05 16:02:48
221
原创 Mysql数据库的四种事务隔离级别以及Spring声明式事务,事务隔离级别和传播
MySQL数据库为我们提供的四种隔离级别:① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。采用锁表方式,锁外的线程只能等候。② Repeatable read (可重复读):可避免脏读、不可重复读的发生。Mysql默认隔离级别③ Read committed (读已提交):可避免脏读的发生。④ Read uncommitted (读未提交):最低级别,任何情况...
2019-04-17 16:12:15
498
原创 JVM-GC,“大话'”垃圾收集器
基于JDK1.7 update 14之后的HotSpot虚拟机的垃圾收集器。1. Serial收集器Client模式下的默认新生代垃圾收集器。单线程、单CPUSTW简单高效2. ParNew收集器Serial收集器的多线程版本,Server模式下虚拟机新生代垃圾收集器。多线程目前为止,只有前面这两种垃圾收集器能够与CMS收集器(并发,垃圾收集线程和用户线程几乎同时进行...
2019-04-17 11:39:03
161
原创 重构-Java(代码的坏味道)
1. Duplicate Code(重复代码)同一个类的两个函数含有相同的表达式-Extract Method两个互为兄弟的子类的含有相同的表达式-Extract Method,Pull Up Method,Template Pattern两个不相关的类出现Duplicate Code,对其中一个使用Extract Class2. Long Method(过长函数)把函数变小-Ex...
2019-04-15 15:53:12
554
原创 Java语言中,哪些对象可作为GC Roots?
Java语言中,哪些对象可作为GC Roots?虚拟机栈(栈帧中的本地变量表)中引用的对象;方法区中类静态属于引用的对象;方法区中常量引用的对象;本地方法栈中JNI(即一般说的Native方法)引用的对象。...
2019-04-10 11:13:09
1066
原创 MinorGC、MajorGC、FullGC的异同-自我认知
最近看JVM书籍,在GC这一章节被几种常见的GC类型困扰,根据书籍上的描述和资料查找,大致作出以下归纳,如有不对,请各位看官在评论区指正。Minor GC:从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。每次 Minor GC 会清理年轻代的内存。指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特性,所以MinorGC非常...
2019-04-09 15:48:29
687
转载 BIO、NIO、AIO-异同
1. 同步阻塞IO(BIO)我们熟知的Socket编程就是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。2. 同步非阻塞IO(NIO)New IO是对BIO的改进,基于Rea...
2019-04-09 15:02:22
122
原创 Http(Hyper Text Transfer Protocol)
1. Http协议超文本传输协议,构建与TCP/IP(Internet)协议之上,默认端口号为80,处于网络体系结构的最顶层应用层上,Http协议采用的是请求/响应的工作方式。Http是无连接无状态的。无连接是指限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态...
2019-04-04 12:15:47
753
原创 初识-OSGi(入门篇)
1. 什么是OSGi?OSGi的名称来源于其开源组织的名称Open Services Gateway initiative,OSGi是一个标准,它致力于提供给Java项目一个模块化的底层环境,以及一系列通用的服务(Service)。和普通的JVM程序相比,OSGi的程序天生拥有动态模块的特点,不同的模块(OSGi里称之为Bundle)有着独立的生命周期,可以独立进行安装、启动、停止、卸载的操作,...
2019-03-29 10:03:27
836
1
原创 Java设计模式-适配器模式,装饰模式,代理模式的异同
最近在学习Java的设计模式,推荐入门级的猿们阅读下《大话设计模式》这本书,语言通俗,简洁易懂。到目前为止,遇到几种比较类似的设计模式,比如“策略模式(strategy)和状态模式”、代理(proxy)和适配器(adapter)模式等。这篇文章特别把装饰器、代理和适配器这三种模式拿到这里特别拿出来做一下比较,顺便也是对学习的一个复习和总结了,文章参考了一些网上的资料。首先肯定是基础概念必...
2019-03-27 13:43:24
544
转载 Throwable的两个子类:Error/Exception(面试中异常体系和JavaError问题)
1、error和exception有什么区别error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。2、运行时异常和一般异常有何不同Java提供了两类主要的异常:runtimeE...
2019-03-25 11:05:49
6062
原创 Java之[static]关键字的作用和用法
据现在所知,我这里总共有5种用法:static修饰类的成员变量-静态变量:在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这句话挺起来都点奇怪,其实这是相对于对象的属性和方法来说的。static修饰的成员变量和方法,从属于类。static修饰类的成员方法-静态方法:static的另一...
2019-03-22 16:54:24
154
原创 JVM调优
对于单线程情况下,无论如何抛出的都是StackOverflowError。如果要抛出OOM异常,导致的原因是不断地在创建线程,直到将内存消耗殆尽。JVM的内存由堆内存 + 方法区内存 + 剩余内存,也就是剩余内存 = 操作系统分配给JVM的内存 - 堆内存 - 方法区内存。-Xss设置的是每个线程的栈容量,也就是说可以创建的线程数量 = 剩余内存 / 栈内存。此时如果栈内存越大,可以创建...
2019-03-21 11:59:41
111
转载 JVM的符号引用和直接引用
在读《深入理解JVM虚拟机》一书的类加载机制章节中,在类加载过程中的解析中提到“符号引用转换为直接引用”,对这块的概念不是很了解,遂记录此博客。在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二进制数据中的符号引用替换为直接引用。1.符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到...
2019-03-07 10:33:07
355
原创 深入理解volatile关键字-(volatile有什么作用?)
volatile - 被其修饰的变量所具有的特性1、保证该变量对所有线程的可见性;2、禁止指令重排序优化。
2019-02-25 14:52:37
728
原创 反射用到了哪些接口,哪些类?反射机制中可以获取private成员的值吗?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.以上的总结就是什么是反射反射就是把...
2019-02-21 17:33:13
1426
转载 Minor GC ,Full GC 触发条件
从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC;对老年代GC称为Major GC;而Full GC是对整个堆来说的;在最近几个版本的JDK里默认包括了对永生带即方法区的回收(JDK8中无永生带了),出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的。Major GC的速度一般会比Minor GC慢10倍以上。下边看看有那种情...
2019-02-21 15:59:34
293
转载 Java中wait和sleep方法的区别
这两个方法来自不同的类分别是Thread和Object最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异...
2019-02-21 09:42:46
117
原创 Gabage Collection-垃圾回收中为什么新生代的Eden:Survivor from:Survivor to = 8:1:1
新生代垃圾较多,同时使用的垃圾回收算法也是用的(复制回收)这种算法,这种算法本就是作用于存活对象少的区域。
2019-02-20 10:05:34
2463
原创 2019-Java面试总结(基础篇)
1.什么是面向对象?把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。(这里简单的说下,具体太复杂)简写:面向对象是程序的一种面向方式,它的程序比较集中,它有两个成员,一个是属性,一个是方法,可以更集...
2019-02-19 11:22:45
324
转载 初始-Java运行时数据区
1.程序计数器程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条执行字节码指令。每条线程都有一个独立的程序计数器。如果执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址。如果是native方法,计数器为空。此内...
2019-01-16 22:55:33
111
转载 Java-GC(Gabage Collection)
首先,引入三个问题,通过这三个问题的步步深入来解决对GC的困惑:jvm怎么确定哪些对象应该进行回收jvm会在什么时候进行垃圾回收的动作jvm到底是怎么清楚垃圾对象的这里先提到JVM运行时数据区和JVM内存结构:JVM运行时数据区由程序计数器、堆、虚拟机栈、本地方法栈、方法区部分组成,结构图如下所示。JVM内存结构由程序计数器、堆、栈、本地方法栈、方法区等部分组成,结构图如下所...
2019-01-12 12:40:40
210
转载 Zookeeper学习-总结,重点问题归纳
1. ZooKeeper是什么?ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。Zookee...
2019-01-02 11:24:17
187
原创 MySQL进阶-MySQL的优化方案
Mysql数据库的优化技术对mysql优化时一个综合性的技术,主要包括a: 表的设计合理化(符合3NF)b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]c: 分表技术(水平分割、垂直分割)d: 读写[写: update/delete/add]分离e: 存储过程 [模块化编程,可以提高速度]f: 对mysql配置优化 [配置最大并发数m...
2018-12-30 22:12:30
206
转载 Java内存模型
经过长时间的验证和修补,在JDK1.5发布后,Java内存模型就已经成熟和完善起来了。主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。Java内存模型中...
2018-12-26 20:28:46
103
原创 Java消息队列-JMS
一、什么是JMSJMS是Java中的消息服务(Java Message Service),是Java关于面向中间件MOM(Message-Oriented Middleware)编程的API。即:两个应用程序之间需要进行通信,我们使用一个JMS服务,进行中间的转发,通过JMS 的使用,我们可以解除两个程序之间的耦合。二、JMS的优势异步(Asynchronous):JMS 原本就是一个异...
2018-12-21 15:10:47
124
转载 【转】Java 8中HashMap和LinkedHashMap如何解决冲突
原文来自一个java大牛的博客原文地址http://javarevisited.blogspot.jp/2016/01/how-does-java-hashmap-or-linkedhahsmap-handles.html博客讲解了Java 8中HashMap和LinkedHashMap是如何解决冲突的。文章目录什么时候会产生冲突总结相关阅读在Java 8 之前,HashMa...
2018-12-21 11:40:14
533
原创 消息队列-M.Q.
为什么会需要消息队列(MQ)?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞;通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。消息通道:消息通道通常以队列的形式存在,这种先进先出的数据结构无疑最为适合这种处理消息的场景。通常情况下,发布者和订阅者都会被注册到用于传播变更的基础设施(即消息通道)上。发布者-订阅者(Publisher-Subscriber...
2018-12-20 16:46:37
266
转载 MySQL的表锁、行锁
锁是计算机协调多个进程或纯线程并发访问某一资源的机制。相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。MySQL大致可归纳为以下3种锁:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁...
2018-12-20 12:31:29
122
2
转载 Java动态代理
动态代理其实就是Java.lang.reflect.Proxy类动态的根据指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有指定的接口(在参数中传入的接口数组),也就是说,返回的对象可以转换类型为接口数组中的任何一个接口类型。然后再利用第一个参数的classloader将class byte加载进系统,最后生成这样一个类的对象并初始化该对象的一些值,如invoc...
2018-12-20 10:27:48
84
原创 Netty学习-组件
在Netty的学习过程中,形如SOAP协议、WSDL语言之于WebService,Netty有几个在使用时必不可少的组件。1.BootStrap/ServerBootStrap 分别对应客户端以及服务器端,用来配置整个Netty 程序,串联各个组件,一个Netty 程序也是由这部分开启;ChannelFuture channelFuture = serverBootstrap....
2018-12-19 16:19:27
175
转载 初识Netty,Java-NIO
Netty和Tomcat有什么区别?Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis访问的功能,这就是netty和tomcat最大的不同。特点:并发高;传输快;封装好;重要结构: s...
2018-12-17 11:37:23
194
转载 【转】如何线程安全的使用HashMap
为什么线程不安全个人觉得HashMap在并发时可能出现的问题主要是两方面,首先如果多个线程同时使用put方法添加元素,而且假设正好存在两个put的key发生了碰撞(hash值一样),那么根据HashMap的实现,这两个key会添加到数组的同一个位置,这样最终就会发生其中一个线程的put的数据被覆盖。第二就是如果多个线程同时检测到元素个数超过数组大小*loadFactor,这样就会发生多个线程同时...
2018-12-02 11:18:55
215
转载 【转】Java Collection(集合)必考面试题
Arraylist 与 LinkedList 异同1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别:); 详细可阅读JDK1....
2018-11-28 10:20:32
246
Netty实战(英文原版PDF)
2019-04-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人