- 博客(33)
- 收藏
- 关注
原创 spring代码类继承层次结构深度解析之BeanFactory
上面是我截图自IDEA,主要是DefaultListableBeanFactory的继承结构。为啥选DefaultListableBeanFactory呢?熟悉spring源码的人一般都知道,这个类已经是BeanFactory组件的最底层的实现了。虽然他下面还有个XmlBeanFactory,但是已经是过时的了。所以我们最底层选择的是他,就能看到整个BeanFactory的功能的扩展体系。还请注意,ApplicationContext不在本次的讨论之内。这个图大致可分为3部分吧。红色框的部分;Ser..
2021-02-20 15:15:03
1262
4
原创 spring中的代码编写技巧大全第一期
1.多个重载方法,底层实现是某个doXXX的方法.如下图所示,红框中3个方法均实现自BeanFactory中的getBean方法,是重载了3个getBean。具体实现则调用了自己的doGetBean方法。因为:虽然是3个重载的getBean方法,参数不一样,但是作用都是获取Bean。所以他们内部的逻辑几乎是一样的,所以抽取到doGetBean中。而不同的参数差异,例如requiredType , rags typeCheckOnly则体现在doGetBean中的一些if分支中。...
2021-02-20 14:34:48
204
转载 java中的CAS
本篇的思路是先阐明无锁执行者CAS的核心算法原理然后分析Java执行CAS的实践者Unsafe类,该类中的方法都是native修饰的,因此我们会以说明方法作用为主介绍Unsafe类,最后再介绍并发包中的Atomic系统使用CAS原理实现的并发类。无锁的概念在谈论无锁概念时,总会关联起乐观派与悲观派,对于乐观派而言,他们认为事情总会往好的方向发展,总是认为坏的情况发生的概率特别小...
2019-05-05 17:09:30
409
原创 java并发编程小案例(十一)
public class Test11 { volatile int count = 0; void f(){ for(int i = 0 ; i < 10000 ; i ++ ){ count ++ ; } } public static void main(String[] args) { ...
2019-04-18 21:56:17
256
原创 java并发编程小案例(十)
```public class Test10 { boolean running = true; void f(){ System.out.println("f start "); while(running){ } System.out.println("f end"); } public ...
2019-04-08 21:58:59
1093
原创 java并发编程小案例(九)
```public class Test9 { int count = 0; synchronized void f(){ System.out.println(Thread.currentThread().getName() + " start"); while(true){ count ++ ; ...
2019-04-08 21:23:28
171
原创 java并发编程小案例(八)
```public class Test8 { synchronized void f(){ System.out.println("f start "); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { ...
2019-04-08 21:13:07
208
原创 java并发编程小案例(七)
```public class Test7 { synchronized void f1(){ System.out.println("f1 start "); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { ...
2019-04-08 21:09:13
149
原创 java并发编程小案例(六)
public class Test6 { private double account; private String name; public synchronized void set(double account , String name){ this.name = name; try { Thread.sl...
2019-03-29 21:37:08
144
原创 java并发编程小案例(五)
public class Test5 { public synchronized void f1(){ System.out.println(Thread.currentThread().getName() + " f1 start"); try { Thread.sleep(10000); } catch (Int...
2019-03-29 21:15:31
163
原创 java并发编程小案例(四)
public class Test4 implements Runnable { private int count = 10; @Override public /*synchronized*/ void run() { count -- ; System.out.println(Thread.currentThread().getNa...
2019-03-29 21:06:11
172
原创 java并发编程小案例(三)
public class Test1 { private static int count = 10; public synchronized static void f(){ count--; System.out.println(count); }}如果是静态方法的话,锁定的是当前的class对象:T.class对象。等同于如下写...
2019-03-29 20:43:47
164
原创 java并发编程小案例(二)
public class Test1 { private int count = 10; public void f(){ synchronized (this){ count--; System.out.println(count); } }}简单的写法,直接将Test1的对象作为锁对...
2019-03-29 20:31:47
194
原创 java并发编程小案例(一)
public class Test1 { private int count = 10; private Object o = new Object(); public void f(){ synchronized (o){ count--; System.out.println(count); ...
2019-03-29 20:29:31
344
转载 数据库并发的问题、隔离级别、并发控制。
摘要: 事务是最小的逻辑执行单元,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务具有四个重要特性,即原子性(Atomicity)、一致性(Consistency)、隔离性 (Isolation)和持久性 (Durability)。本文首先叙述了数据库中事务的本质及其四大特性(ACID)的内涵,然后重点介绍了事务隔离性的动机和内涵,并介绍了数据...
2019-01-31 15:07:12
919
转载 SpringBoot 启动流程
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图keepRunning方法)。 本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。总览: ...
2018-12-06 15:53:54
211
转载 微服务小知识
01—什么是微服务 微服务的概念源于Martin Fowler所写的一篇文章“Microservices”。 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行...
2018-11-23 14:55:52
252
1
转载 redis
考虑到绝大部分写业务的程序员,在实际开发中使用Redis的时候,只会Set Value和Get Value两个操作,对Redis整体缺乏一个认知。所以我斗胆以Redis为题材,对Redis常见问题做一个总结,希望能够弥补大家的知识盲点。本文围绕以下几点进行阐述:为什么使用Redis使用Redis有什么缺点单线程的Redis为什么这么快Redis的数据类型,以及每种数据类型的使用场景Redis的过期...
2018-06-19 17:50:56
260
转载 spring context源码解析之@Async
背景大家项目中用到异步、多线程的场景很多,使用最多的场景还是主动对象模式,就是主线程开启一个线程池去任务分发,任务执行完成之后,关闭线程池,但是有的场景则需要部分代码异步执行的效果,简单的说就是有一个可以复用的线程池可以复用,直接new Thread当然也可以,不推荐,没有线程池的可靠性好,如果这个时候再创建一个线程池用完再关闭代码是不是有点重,维护性也不好,@Async这个注解就是为了解决这个问...
2018-05-28 11:58:32
1352
转载 Redis数据库底层源码剖析
按照Redis源码剖析–源码结构解析一文中给自己规定的六个阶段来学习Redis。目前前三个阶段的学习以及完成了,这些都是和系统的耦合性比较小的部分,所以看起来也比较轻松。从这篇博客开始,就进入到第四阶段的源码剖析了。Redis的各个功能的实现将会顺着我们的逐步深入而变得清晰明了,如果读者跟着我的步伐一起学习,到了这一刻,想必也是兴奋的。废话也不多说了,前面所有的数据结构都是为后面的功能实现做铺垫。...
2018-02-09 12:01:57
381
转载 Redis发布与订阅源码剖析
在分析Notify通知功能的时候讲到,Notify是用过订阅和发布功能来发送通知的。本来按计划是要分析持久化的代码的,可是对这个pubsub实在是有点感兴趣,所以先分析这方面的代码。订阅和发布,顾名思义,就是客户端可以订阅某个频道,也可以向某个频道发布消息,有点像收音机的功能一样。Pubsub概述Redis的发布和订阅功能由PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令组成,要想理...
2018-02-09 11:56:06
313
转载 Java 基于红黑树的TreeMap,TreeSet实现原理
TreeSet and TreeMap总体介绍之所以把TreeSet和TreeMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)**。因此本文将重点分析TreeMap。Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大
2018-02-06 16:22:57
1196
1
转载 java类加载机制
1、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被“首次主动使
2018-02-05 18:43:46
159
原创 java线程的状态
线程的状态新建 MyThreadInfo 类,打印线程对象属性,代码如下:public class MyThreadInfo extends Thread { @Override // 可以省略 public void run() { System.out.println("MyThreadInfo 的线程实例正在执行任务");//
2018-02-01 15:46:22
242
转载 Golang Reflect反射
Go是静态类型语言。每个变量都拥有一个静态类型,这意味着每个变量的类型在编译时都是确定的:int,float32, *AutoType, []byte, chan []int 诸如此类。动静类型 编译时就知道变量类型的是静态类型;运行时才知道一个变量类型的叫做动态类型。 1. 静态类型 静态类型就是变量声明时的赋予的类型
2018-01-29 17:49:35
13529
3
转载 Golang channel用法
一、Golang并发基础理论Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论。但就像John Graham-Cumming所说的那样,多数Golang程序员或爱好者仅仅停留在“知道”这一层次,理解CSP理论的并不多,毕竟多数程序员是搞工程 的。不过要想系统学习CSP的人可以从这里下载到CSP论
2018-01-29 17:48:19
600
转载 Atomic包
简介Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。 在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原
2018-01-29 17:40:41
198
转载 Atomic包的使用
简介Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。 <br style="margin-top:0px">在Atomic包里一共有12
2018-01-29 17:37:49
390
原创 事务的回滚
事务回滚有两种:1. throw new RuntimeException2.TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();下面我来说一下这两个有啥区别。第一种, 抛出一个异常,这种方法很简单粗暴,但是有一个很隐蔽的问题:如果不小心抛出去得异常又被自己catch住了,就不能进行回
2018-01-29 17:29:29
586
原创 finally中的return语句
finally中的return会影响到本方法中抛出得异常,请看下面代码:public class Test { public static void main(String[] args) { try { doMyTest(); }catch (Exception e){ System.out.println(
2018-01-29 17:16:04
484
原创 京东面试题
1.这里B类中可以插入哪个方法?只看方法名字和参数,这些方法名都是 a a() 视为重写父类的方法, a(别的参数) ,视为与父类的方法重载 如果 是a() 则 是重写父类的方法,则返回值必须与父类一致,但是权限可以不一致,只能大于等于父类的权限。 所以 protected void a() public
2017-04-19 19:13:27
365
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人