- 博客(214)
- 收藏
- 关注
原创 Spring声明式事务的实现方式选择(JDK动态代理与cglib)
1、简介Spring声明式事务的具体实现方式是动态决定的,与具体配置、以及事务代理对象是否实现接口等有关。2、使用JDK动态代理的情况在满足下面两个条件时,Spring会选择JDK动态代理作为声明式事务的实现方式。(1)事务代理类必须实现接口且不能显式继承父类(Object这个父类不算)。(2)配置:springboot的启动类要加上@EnableTransactionManagement和@En...
2018-05-04 16:36:30
2223
2
原创 REQUIRES_NEW不起作用导致整个事务回滚——Spring事务传播机制
1、Propagation.REQUIRES_NEW的作用假设有个对象A,有a()方法,有个对象B,有b()方法。在a方法中调用了b方法,b方法被称为内嵌事务,不管a方法是否开启事务,只要b方法的事务的隔离级别为REQUIRES_NEW,则一定会在调用b方法时产生一个新的事务。2、一个场景A的a()方法: @Transactional public void a() { ...
2018-05-03 10:38:08
4126
5
原创 Java面试题及回答集锦(基础篇)
1、问题:如果A和B对象循环引用,是否可以被GC?回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GC Roots没有任何引用链连接,则证明对象是不可用的。2、Java中的内存溢出...
2018-03-16 13:46:19
1139
原创 数据库面试题
1、数据库有哪些索引?根据功能分类唯一索引(Unique):可单列也可多列组合,每个索引值对应唯一的记录,且索引的字段具有唯一性,最多只能有一个NULL。主键索引(Primary Key):可单列也可多列组合,其值唯一标识表中的一行,不能为NULL。聚集索引(Cluster):一个表只能包含一个聚集索引,表中行的物理顺序与键值的逻辑顺序相同,加快查询速度。根据实现方式分类B+树索引:平衡的树,不一...
2018-03-16 13:46:07
629
原创 计算机基础之操作系统
1、进程进程是具有独立功能的程序在一个数据集合上的动态性:进程的一次执行,生命周期有创建、活动、暂停、终止等过程。并发性:多个进程实体同存于内存中,能在同一时间段内运行。独立性:进程实体能独立运行,独立获得自由,独立接收调度。异步性:进程按照各自独立的,不可预知的速度执行,异步性会导致执行结果的不可再现性。结构性:程序段、数据集合、PCB(描述进程运行状态,是进程存在的唯一标志)。进程映像是静态的...
2018-03-02 13:14:14
674
原创 Redis原理知识点集锦
1、Redis有哪些数据结构?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。高级数据结构HyperLogLog:基数统计GEO:地理位置PUB/SUB:订阅发布2、Redis是单进程单线程的吗?是的。Redis是基于内存的单进程单线程KV数据库,基于C语言编写,不比单进程多线程的Memcached差。快的原因:(1)完全基于内存。(2)数据结构简单、对数据...
2018-02-26 12:51:04
1668
原创 Dubbo实现原理浅析
一、电商系统架构演进1、单一应用架构当网站规模很小时,采用单一应用框架,把所有的服务集中在一个应用中,但随着网站规模增大,单一应用框架会越来越难维护。2、垂直应用架构把应用垂直的拆分开来,拆分成如支付、查询等垂直模块,每个模块都有从顶层显示层到底层数据持久层的业务逻辑,每个模块都是一个独立的子系统。虽然在一定程度上降低了开发成本和维护成本,但是会导致许多底层业务逻辑代码的重复。3、分布式应用架构把...
2018-02-25 17:23:38
4346
1
原创 Java动态代理讲解——深入浅出
一、代理模式 要讲解动态代理,就要先说代理模式,这是一种最常用的设计模式。该模式中有以下三个角色。 抽象角色:通过接口或抽象类声明真实角色实现的业务方法,即被代理类与代理类都要实现的接口。 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色:实现抽象角色,定义真实所要实现的业务...
2018-02-25 12:24:23
693
原创 最通俗易懂的NIO讲解
一、NIO是什么?NIO的全称是New I/O,与之相对应的是Java中传统的I/O,这里都指的是Java的API包。传统的IO包提供的是同步阻塞IO,即当用户线程发出IO请求后,内核会去查看数据是否已经就绪,若未就绪,则用户线程会处于阻塞状态(让出CPU),当数据就绪后,内核会将数据复制到用户线程,并把结果返回给用户线程,同时接触用户线程的阻塞,同步体现在用户线程需要等待数据就绪后才能向后执行(...
2018-02-23 12:33:53
6063
转载 Java NIO:浅析I/O模型
也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Pr...
2018-02-23 10:09:30
354
原创 设计模式集锦
1、简单工厂模式、工厂模式、抽象工厂模式的区别?简单工厂模式(静态工厂模式):简单工厂是一个类,其中一个静态方法,根据传入的参数来生成特定的对象。工厂模式:工厂模式提供了一个抽象的工厂类,该类有一个生产抽象产品的接口,程序员可根据需要继承抽象工厂实现生产特定产品的方法,并且自己实现特定的产品。工厂模式关注的是产品的生成,而不在于生成产品之间的关系,在最终使用时,使用产品本身。抽象工厂模式:由一个抽...
2018-02-21 11:23:01
408
原创 分布式锁的作用及实现(Redis)
一、什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。进程锁:为了控制同一操作系统中多个进程访问某...
2018-02-19 15:29:38
83280
50
原创 最容易理解的Consistent Hashing讲解(一致性哈希算法使用场景及原理)
一、使用场景 考虑一个场景,有一个redis集群,那么我们如何分配不同的要缓存的数据,使之能够尽可能均匀的存储到各个redis服务器上呢?肯定有人会想到使用传统的hash + 取模 算法。 服务器ID = hash(object) % N (N为服务器个数) 举个例子,如果我们有4个redis服务器,编号分别为0,1,...
2018-02-16 17:17:02
1762
原创 SpringMVC 原理 (面试必备)
一、简介SpringMVC是Spring框架的一个子模块,类似于AOP,IOC等模块。也是通常所说的那层薄薄的Web层,也就是MVC架构中的C(Controller),负责接收分发用户请求。二、原理详细解释这幅图。1、用户发起请求,一般是HTTP请求,带有URL和参数。2、DispatcherServlet的匹配的URL与请求的URL相匹配,DispatcherServlet接收请求。3、把URL...
2018-02-14 13:21:15
4001
原创 Spring AOP 原理 (面试必备)
一、AOP是什么? AOP的全称是Aspect Orient Programming,即面向切面编程。是对OOP(Object Orient Programming)的一种补充,战门用于处理一些具有横切性质的服务。常常用于日志输出、安全控制等。 上面说到是对OOP的一种补充,具体补充的是什么呢?考虑一种情况,如果我们需要在所有方法执行前打印一句日志,按照OOP的处理思想,我们需要...
2018-02-13 16:02:26
59410
5
原创 Spring IOC 和 DI原理 (面试必备)
一、IOC是什么?IOC全称为“Inversion of Control”,即控制反转,不是一种技术,而是一种设计思想。在这种设计思想中,你设计好的对象交给容器管理,而不是在应用程序内部对对象进行管理。控制的含义是IOC容器控制了对象(也可以包括文件及其他外部资源);而反转的含义是IOC容器负责创建及注入依赖的对象,但在传统的应用程序中,我们需要在对象内部去创建(new)依赖的对象,这叫“正”,在...
2018-02-13 12:00:55
8714
2
原创 Java并发之ConcurrentHashMap详解
一、ConcurrentHashMap是什么? ConcurrentHashMap是线程安全的并发容器,是用来替代在多线程环境下的HashMap,因为HashMap是线程不安全的,多线程环境下put操作可能会导致死循环,CPU利用率上升到100%。虽然有同步容器Hashtable和Collections.synchronizedMap方法使得容器同步,但是这些容器效率都非常低,因为它们锁...
2018-02-12 18:18:54
2687
2
原创 Java并发之ReentrantLock原理详解
一、ReentrantLock是什么? ReentrantLock是Lock接口的默认实现,是一种独占锁。相对synchronized而言,ReentrantLock提供了更多的操作方式以及更细粒度的加锁方式。 主要特性: (1)可重入。ReentrantLock是可重入锁,因为它会记录之前获得锁线程对象,保存在exclusiveOwenerThread变量中,当一个线程要获取锁...
2018-02-12 12:13:03
1615
1
原创 Java并发之AQS(AbstractQueuedSynchronizer)原理讲解
一、什么是AQS? AQS的全称是AbstractQueuedSynchronizer,即抽象队列同步器,其底层是volatile与CAS,而其上层则是基于该抽象类构建的许多并发组件,如ReentrantLock、Semaphore等。AQS自身实现了一些基本方法,还剩余一些面向上层的方法,这些方法需要继承该抽象类的同步组件去实现。 volatile原理链接 CAS原理链接 ...
2018-02-10 17:51:31
1352
原创 Java并发之CAS与原子类实现原理讲解
一、CAS是什么?CAS的全称是Compare and Swap,即比较并交换。比较的是当前内存中存储的值与预期原值,交换的是新值与内存中的值。这个操作是硬件层面的指令,因此能够保证原子性。Java通过JNI(本地方法调用)来使用这个原子操作,也是乐观锁最常用的机制。CAS操作包含三个操作数——内存位置、预期原值和新值。在执行CAS操作时,先进行Compare操作,即比较内存位置的值与预期原值是否...
2018-02-10 12:40:29
2470
原创 最通俗易懂的乐观锁与悲观锁原理及实现
一、乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version...
2018-02-09 15:28:04
104569
17
原创 偏向锁、轻量级锁、重量级锁、自旋锁原理讲解
一、简介 在讲解这些锁概念之前,我们要明确的是这些锁不等同于Java API中的ReentratLock这种锁,这些锁是概念上的,是JDK1.6中为了对synchronized同步关键字进行优化而产生的的锁机制。这些锁的启动和关闭策略可以通过设定JVM启动参数来设置,当然在一般情况下,使用JVM默认的策略就可以了。二、Java对象头中的Mark WordHotSpot中,Java的对象内存模型分为...
2018-02-09 13:34:46
2084
3
原创 最通俗易懂的synchronized原理解析
之前有文章写过synchronized的作用,这里不多说了,直接开始讲原理。synchronized是Java的内置锁,是重量级锁,也是可重入锁。性能上不如Lock这种显示锁,而且缺乏许多功能,但是其优点是使用便捷。首先看一段代码及其字节码:public class SynchronizedTest { public synchronized void fun1(){ ...
2018-02-08 13:57:12
674
原创 最通俗易懂的volatile关键词详解
一、volatile能保证可见性 在描述可见性之前,首先要讲解一下Java的内存模型,Java内存模型规定了了所有变量都存储在主存中,每条线程中还有自己的工作内存,线程的工作内存内保存了线程所使用到的变量,这些变量是从主存中拷贝而来,不同线程的工作内存互相隔离,线程间的变量值传递都要通过主存;线程对变量的所有操作(读取、赋值)都必须在工作内存中进行。 在这种内存模型下,很有可能产生脏读现象
2018-02-07 15:37:48
712
原创 最通俗易懂的ThreadLocal原理详解
一、ThreadLocal的用途 ThreadLocal是线程局部变量,主要用于解决多线程程序的并发问题。产生并发问题的原因是多个线程并发访问共享变量。下面看一段程序。这是一个数据库连接工具类:public class DBConn { private static Connection conn; public static Connection getConn(){
2018-02-05 12:41:50
2684
3
原创 最通俗易懂的HashMap原理详解(JDK 1.8)
一、HashMap的数据结构 HashMap是存储键值对的集合,当然HashMap也是线程不安全的,每一个键值对存储在一个Node<K,V>(JDK1.7中是Entry<K,V>。HashMap的主干是一个名为table的Node数组。 每个键值对Key的hash值就对应数组的下标,当遇到hash冲突时,HashMap采用的策略是链地址法。在JDK1.7中通过键值对Entr...
2018-02-02 16:03:21
1425
4
原创 通俗易懂的红黑树简析
一、基本概念 红黑树本质上是一棵近似平衡的二叉树,它的节点只有两种颜色即红与黑,它满足二叉搜索树的基本性质,即树上的任何节点的值大于其左子节点(若左子节点存在),任何节点的值大于其右子节点的值(若右子节点存在)。 近似平衡:深度最大的节点的深度 红黑树与平衡二叉树比较:因为红黑树只追求近似平衡,所以在插入与删除节点时,翻转次数远远少于平衡树,因此在需要较多插入删除操作的
2018-01-31 13:59:54
842
1
原创 Tomcat卡住不响应请求但未抛出异常
前段时间在做一个android平台的QQ,服务器端是跑在Tomcat上的,但是每次测试一会,Tomcat就会卡住,不在响应任何请求,包括HTTP请求和TCP请求都不在响应。后来想到可能是连接池占满了,而且都未被释放,就通过系统命令查看了一下Tomcat监听的8080端口和Netty服务器监听的52621端口(自定义的),发现有一大堆ESTABLISHED的连接,而且很多都是源于同一个ip地址,
2018-01-30 17:24:36
5352
原创 Java虚拟机学习之类加载机制将
一、什么是类的加载机制1、虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。2、类的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高灵活性。3、Java里天生可以动态扩展的语言特性就是依赖云溪区动态加载和动态链接这个特点实现的。例如编
2018-01-30 14:58:19
264
原创 Java虚拟机学习之类文件结构
一、语言无关性与平台无关性语言无关性:Java虚拟机上运行的是Class文件(字节码文件*.class),而Class文件不一定由Java程序编译而来,JRuby经过jrubyc编译器编译生成的是Class文件,Groovy程序经过groovyc编译器编译后生成的也是class文件,都可在虚拟机上运行,虚拟机不关心Class的来源是何种语言。平台无关性:一次编写,到处运行,各种不同平台的虚拟机与所...
2018-01-29 14:12:45
280
原创 Java虚拟机学习之垃圾收集器
一、为什么要学习GC技术垃圾收集也称GC,是Java内存动态分配和回收背后的关键技术,有了垃圾收集器,Java程序员就与C++程序员有了巨大的区别,C++程序员需要谨慎的申请和释放内存,而Java程序员就不需要那么辛苦了,但是我们还是需要了解GC技术,当我们需要排除各种内存溢出,内存泄漏问题时,我们就需要对这些自动化技术实施必要的监控和调节。二、判断对象
2018-01-27 17:34:13
343
原创 MySQL 5.6 占用内存过高解决方案
前段时间在阿里云服务器上装了个Mysql,结果发现5.6版本的MySQL一启动就占好几百兆内存,于是上网搜索了一下,找到了一个可靠地解决方案。在my.ini配置文件中加入如下参数,如已经存在,则修改。performance_schema_max_table_instances=400table_definition_cache=400table_open_cache=256大家可以根据自己
2018-01-25 18:58:44
1410
原创 Java虚拟机学习之Java内存区域篇
一、运行时数据区域(图片来自网络)上图是Java运行时内存区域模型,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。二、程序计数器程序计数器是线程私有的,每个线程独立存储,是所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。如果线程正
2018-01-25 12:50:27
275
原创 Dubbo生产者端使用@Service注解无效的原因
在Dubbo生产者端暴露服务的方式有两种,一种是传统的xml配置标签方式,还有一种是使用@Service注解方式。在使用@Service注解的过程中,踩了很多坑,给大家分享一下。会导致@Service注解无效的原因大致有以下几点:1、@Service注解的业务逻辑对象中有@Transactional注解。因为目前dubbo版本中,被事务代理的业务逻辑对象不能通过使用@Service注解
2018-01-24 10:25:38
8780
1
原创 Dubbo传输的对象必须序列化(Serializable)
如果生产者返回给消费者的对象中有未实现Serializable接口的,都会报出如下错误:最关键的一句Serialized class com.yykj.mall.dto.ProductListItemDTO must implement java.io.Serializable但报错的时候是一大堆,还会说到尝试了三次远程调用,导致超时等,其实真正原因就是对象未序列化,只要让传输的所
2018-01-23 20:49:32
21206
2
原创 SpringMVC 406错误
前段时间在做一个前后端分离的项目,在做异步请求的路径映射时,习惯性的把每个请求的后缀写成.html,然后配置DispactherServlet拦截.html结尾的请求。结果就报出406错误。406:Not acceptable。Web 服务器检测发现它想反馈的数据不能为客户端所接受,它则反馈一个含有 406 错误代码的报头。表示请求资源的MIME类型与客户端Accpet头信息中指定的类
2018-01-23 13:01:44
835
原创 Hibernate懒加载对象在session.close()后为空
Hibernate查询的结果集对象其实是一个代理对象(可以使用getClass()验证)。在session调用close()方法前,该对象是持久化状态的,是受session管理的,当开启懒加载后,当我们要访问该查询对象的某个懒加载对象属性时,session会帮我们去查询,当我们的对象离开session的托管时,那个懒加载的对象属性就为空了。一般解决思路:使用DTO对象作为传输对象,即不把e
2018-01-23 11:17:17
729
原创 Spring声明式事务在抛出异常时不回滚(RollBack)
前段时间一直在准备考试和课程设计,终于放寒假了可以自由的学习了。现在把最近一段时间遇到的问题和解决的问题写下来。Spring声明式事务默认只在RuntimeException时Rollback(回滚),不当的try catch会导致事务不回滚。
2018-01-23 10:42:53
1509
原创 二叉树翻转的递归与非递归实现(Java)
二叉树的翻转,即以根所在垂直线为对称线,对称位置的两个节点进行交换。实现这种算法,可以有两种思路,即递归和非递归(栈)。下面给出Java代码实现。import java.util.Stack;/** * Created by Lee on 2017/11/11. *///树节点class Node { int value; Node left; Node
2017-11-11 22:19:48
1308
原创 解决Hibernate的session.save/update/delete操作无效问题(事务管理)
近期开始玩Hibernate了,因为之前开发用的都是Mybatis,刚开始用Hibernate发现了许多问题。其中一个问题就是session.save/update/delete无效的问题。导致这个问题最可能的原因是未开启事务。Hibernate的增删改操作都是要提交才能生效的,当我们执行session.save(obj)操作后,其实并没有提交。有两种解决方案一、开启事务管理
2017-10-23 17:58:18
4962
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人