自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从阻塞IO演进到netty

着急的朋友,可以直接跳到第四节、第五节从阻塞IO演进到netty一、IO模型0、前提以输入为例,来讲解5种IO模型。一个输入操作通常包含两个不同的阶段:1)等待数据准备好2)从内核向进程复制数据对于一个套接字上的输入操作,第一步通常涉及等待数据从网络到达。当所等待的分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区1、阻塞式IO阻塞式IO(blocking IO),进程在等待数据和将数据从内核复制到用户空间这两...

2020-10-26 21:31:05 764

原创 从硬件层面理解volatile(java)

从硬件层面理解volatile(java)目录从硬件层面理解volatile(java)一、volatile的作用二、为什么会有可见性问题1、缓存行2、cpu的缓存一致性3、如何保证cpu的缓存一致性4、为什么还有可见性问题5、store buffer6、invalidate queue7、cpu如何实现内存屏障三、JSR内存屏障与指令的关系参考资料一、volatile的作用 可见性:当程序执行到volatile变量的读或写时,在其前面的操作肯定

2020-09-14 19:29:11 1371 2

原创 硬件层缓存一致性协议

硬件层缓存一致性一、缓存行在讲缓存一致性之前,我们先来说一下缓存行的概念缓存是分段(line)的,一个段对应一块存储空间,称为缓存行,它是CPU缓存中可分配的最小存储单元,大小为32、64、128字节不等,与CPU的架构有关,通常为64字节。当CPU看到一条读取内存的指令时,它会把内存地址传递给一级数据缓存,一级数据缓存会检查它是否有这个内存地址对应的缓存段,如果没有就把整个缓存段从内存(或高一级的缓存)中加载进来。二、什么是缓存一致性缓存一致性(cache coherence)是一种保

2020-08-20 19:58:19 714

原创 类的加载过程

类的加载过程一、类的加载过程类的加载过程,一般分为三个比较大的阶段:加载、连接、初始化 加载阶段:主要负责查找并加载class文件 连接阶段:细分为如下三个阶段 验证:验证类文件的正确性,比如class文件的魔数、版本等等 准备:为类的静态变量分配内存,并且赋默认值(比如说 static int i = 8,在准备阶段,i的值为默认值0,而不是8) 解析:把类中的符号引用转换为直接引用 初始化阶段:为类的静态变量赋予正确地初始值(比如static int.

2020-08-17 17:31:02 664

原创 程序执行涉及的硬件

程序执行涉及的硬件一、示例程序代码#include <stdio.h>int main(){ printf("hello, world\n"); return 0;}源文件为hello.c,是文本文件。为了运行hello.c程序,每条C语句都必须被其他程序转换成一系列的低级机器语言指令。然后这些指令按照一种称为可执行文件(exe)的格式打好包,并以二进制磁盘文件的形式存放起来。在Unix操作系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:li

2020-08-12 14:55:20 1686

原创 双亲委派机制

双亲委派机制一、什么是双亲委派机制每个类加载器都有自己的一个加载路径,当某个类加载器需要加载某个.class文件时,它不是立刻从自己的加载路径中去找这个class文件,而是委派给它的父类加载器去加载。它的父类加载器又委派给父类的父类加载器去加载。Class Loader的作用是,将静态的class文件加载成Class对象,加入jvm1、Bootstrap ClassLoaderpublic static void bootstrapClassLoaderTest(){..

2020-07-29 08:30:34 1513

原创 工厂方法模式

一、定义工厂方法模式,又称为虚拟构造方法模式、多态性工厂模式。工厂方法模式,定义一个创建产品对象的工厂接口,将实际的创建工作推迟到子类中。二、结构public interface Creator{ /** * 工厂方法 */ Product factory();}public interface Product{}public ConcreteCreator1 impl...

2020-01-20 20:22:36 219

原创 简单工厂模式

一、定义简单工厂模式,又称为静态工厂方法模式。简单工厂模式,就是由一个工厂类,根据传入的参数,决定创建出哪一种产品类的实例。二、结构从上图可以看出,简单工厂模式涉及到工厂角色、抽象产品角色、具体产品角色。工厂(Creator)角色:担任这个角色的类是简单工厂模式的核心,工厂类在客户端的直接调用下创建产品对象。它往往由一个具体的java类实现抽象产品(Product)角色:担任这个角色...

2020-01-19 21:26:21 280

原创 mybatis多个plugins的执行顺序

一、前言   在mybatis官网中,有插件一说  mybatis plugins . 如果同时有多个插件,那么他们的执行顺序是怎样的? 二、准备工作、代码准备1、 项目结构2、TestDAOpublic interface TestDAO { Test selectById(Integer id); default void testDefau...

2018-11-13 22:30:56 9281 5

原创 selectById的流程

  上一篇,我们讲过DAO层接口,是怎么被mybatis自动实现的。DAO层接口,为什么能操作数据库这篇,我们继续下去,讲一讲DAO层接口中selectById的流程。 一、准备工作  和上一篇文章中,用到的代码几乎没有区别,只是Main类有所调整public class Main { public static SqlSession getSqlSession()...

2018-11-12 17:14:58 5675

原创 DAO层接口,为什么能操作数据库

public interface TestDAO { Test selectById(Integer id);}一、问题:  如上代码所示,为什么调用TestMapper的selectById方法,就能从数据库中读取数据?TestMapper不是个接口吗?接口怎么能直接调用方法呢?猜测:  接口当然是不能直接调用方法的,那么接口的实现类呢?应该是mybatis框架,自动...

2018-11-09 20:14:22 16625 3

原创 HashMap 1.8

一、HashMap的结构:数组+链表1、那么数组在哪里?有多大?我们来到HashMap的源码,可以发现它里面有个数组  transient Node&lt;K,V&gt;[] table;数组的初始大小为16,static final int DEFAULT_INITIAL_CAPACITY = 1 &lt;&lt; 4;数组最大为2^30,static final int M...

2018-11-09 16:30:55 398

原创 Bean的实例化过程

一、Spring容器的容器启动阶段和Bean实例化阶段 1.1 容器启动阶段   容器启动阶段,主要是将利用某种工具(如XmlBeanDefinitionReader),将XML配置信息,映射为BeanDefinition,并将其注册到相应的BeanDefinitionRegistry。1.2 Bean实例化阶段  本文主要探索此阶段,也就是上图Abstract...

2018-08-21 09:27:14 6581 2

原创 新手如何阅读Spring源码

一、先跟着博客一路debug下去。  期间可能会跟丢,但是请反复地debug下去(过程可能很痛苦,但是源码这关是绕不开的),能跟上博客,大致知道做了什么。要懂得利用idea编译器debug时的drop frame功能,如果用的是idea的话。推荐博客:Jintao_Ma的博客        Spring源码浅析   二、看《spring揭秘》  当跟着博客debug一段时间...

2018-08-17 21:32:55 11188

原创 BeanFactory和它的对象注册和依赖绑定的三种方式

一、Spring中的BeanFactory是什么?  BeanFactory是个基本的IoC容器,提供完整的IoC服务支持,负责对象创建的管理和依赖注入服务  如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作public interface BeanFactory { ...

2018-08-17 20:04:56 1663

原创 如何实现依赖注入

承接上一章,如何获取自定义注解标记的类 已经获取到所有自定义注解标记的类,并且把它们都放入了一个Map&lt;Class&lt;?&gt;, Object&gt;(类和各自实例的映射)中。  那么如何来实现依赖注入呢?@Controllerpublic class HelloController{ @Inject //自定义的依赖注入 注解 private Hell...

2018-07-20 09:13:50 926

原创 如何获取自定义注解标记的类

1、如何把一个包里所有自己想要的自定义注解标记的类,放入容器(一个Set&lt;Class&lt;?&gt;&gt;)中?@Controller //比如@Controller是自定义的注解public class HelloController{ //在A包下 // ....}@Controllerpublic class TestController{//在B包下 ...

2018-07-19 21:28:46 5803 3

原创 如何获取.properties文件及读取配置

引子:如图所示,此配置文件是如何读取到的呢?其里面配的值,又是如何得到的呢?1、怎么读取配置文件(比如 resources下的smart.properties)?InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); //此处file...

2018-07-19 20:50:48 760

原创 clone

  clone 分为浅层clone和深层clone。1. 浅层clone是指对象中的非对象实例,被复制过来。 修改复制对象的这些实例,并不会对原对象产生影响。比如下面例子中的salary。 但是修改复制对象中的对象实例,对原对象中的对象实例,也会产生影响,比如下面例子中的hireDay2. 深层clone就要求,修改复制对象中的对象实例,对原对象中的对象实例,不产生影响package entity...

2018-03-26 21:10:59 272

原创 Head First Java零碎

1、int[] nums = new int[7]; 这一条语句分为3个步骤:        1)声明一个int数组变量,数组变量是数组对象的遥控器        2)创建大小为7的数组        3)将数组赋值给之前声明为int[]的变量nums    同理,Dog[] dogs = new Dogs[3] 也是这几个步骤,不过它声明的是Dog数组变量    数组一定是个对象,不管所声明的元...

2018-03-24 10:19:59 196

转载 对redis中setbit命令的理解

作者:知乎用户链接:https://www.zhihu.com/question/27672245/answer/123641959来源:知乎这个是SETBIT使用方法的简单说明在redis中,存储的字符串都是以二级制的进行存在的。举例:设置一个 key-value ,键的名字叫“andy” 值为字符'a'我们知道 'a' 的ASCII码是 97。转换为二进制是:01100001。offset...

2018-03-22 10:34:52 1246 1

转载 对象引用变量

    Vehicle veh1 = new Vehicle(); veh1是对象引用变量,它不是对象的容器,而是类似于指向对象的指针,或者可以说是地址。对象只会存在垃圾回收的堆上。     Vehicle veh1 = new Vehicle(); 代表取得Vehicle对象的方法,以字节形式,放进引用变量veh1中。而对象本身没有放进变量中。不同于基本数据类型 byte x = 7; 代表数字...

2018-03-17 21:29:22 1545 2

转载 什么是面向对象

转自:一句话说明什么是面向对象--知乎把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的泛化(generation)/特化(specialization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic di

2017-10-30 08:38:14 1129

转载 mysql索引总结----mysql 索引类型以及创建

文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细。直接搬过来了关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。

2017-10-24 16:07:09 366

转载 SQL的四种连接-左外连接、右外连接、内连接、全连接

SQL的四种连接-左外连接、右外连接、内连接、全连接 今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的,导致平时的数据记录要进行一些限制性处理,其实也可以设置视图各表为右外连接并在视图上设置各列的排序和筛选条件就可以达到效果。 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定联接条件。WHERE和HAVING子句

2017-10-24 11:19:12 2266

转载 synchronized和Lock的区别

先把结论写一下:1)Lock是个接口,而synchronized是java关键字,synchronized是内置语言实现2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象的发生;而Lock在发生异常时,如果没有主动通过unlock()去释放锁,则很有可能造成死锁现象,因此使用Lock时需要在finally块中释放锁3)Lock可以让等待锁的线程相应中

2017-10-24 10:14:20 1505

转载 计算机各层网络协议

转自:计算机网络各层协议计算机各层网络协议 应用层: (典型设备:应用程序,如FTP,SMTP ,HTTP) DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,使用 UDP 协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配 IP 地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

2017-10-18 18:45:25 709

转载 在由N个正整数的集合S中,找出最大元素C,满足C=A + B

转自:在由N个正整数的集合S中....【题目】在由N个正整数的集合S中,找出最大元素C,满足C=A + B 其中A,B都是集合S中元素,请给出算法描述,代码与时间复杂度分析。【分析】1,对集合S进行排序(快排),从小到大排序2,让C指向集合最后一个元素(最大元素)3,让i指向S中第一个元素,让j指向C的前一个元素4,如果,A[i]+A[j]=

2017-10-18 18:38:51 589

原创 a += a-= a*a

int a = 3;a += a-= a*a;最终a的值是多少?这要分语言了。1)在c语言中,结果是-12。原因是先算a*a(结果为9,此时a的值没变,还是3);然后算 a-=a*a,等效于 a = a - 9;(结果为-6,因为赋值符号,此时a的值为-6,发生了改变);最后算a = a + a ,结果为-122)在JAVA中,结果为-3。好像中间的那次赋值对它没影响,

2017-10-18 17:27:26 35548 3

转载 Java单例模式

转自:Java单例模式Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。       单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;能够避免由于操作多个实例导致的逻辑错误。如果一个对象有可能贯

2017-10-14 11:27:07 360 1

转载 3个线程依次轮流打印出75个数

转自:详解使用synchronized解决三个线程依次轮流打印出75个数原帖见:http://www.iteye.com/topic/1117703问题描述:一个关于线程的经典面试题,要求用三个线程,按顺序打印1,2,3,4,5.... 71,72,73,74, 75.线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后

2017-10-14 10:02:52 2053

转载 java堆结构,以及堆中的永久代

转自:java堆的结构以及堆中的永久代java堆不是数据接口意义上的堆(一种有序的树),而是jvm的堆,也即是运行时的数据区。所有类的实例和数组都是在堆上分配内存,它在JVM启动时被创建,对象所占的内存是由自动内存管理系统也就是垃圾回收器回收。堆内存是由存活的对象以及死亡的对象组成的。存活的对象不会被垃圾回收器回收;死亡的对象是还没有被垃圾回收器回收的对象,等下一个周期回收永久代:永久

2017-10-14 08:42:07 5316 4

转载 什么是迭代器(Iterator)

转自:牛客网一、什么是迭代器(Iterator)?答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包括了可以返回迭代器实例的迭代方法。迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除二、使用Iterator的简单例子publicclass  

2017-10-13 11:01:56 51558 1

转载 为什么集合类没有实现Cloneable和Serializable接口

转自:牛客网为什么集合类没有实现Cloneable和Serializable接口?答:克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化一些解释:(1)什么是克隆?克隆是把一个对象里面的属性值,复制给另一个对象。而不是对象引用的复制(2)实现Serializabl

2017-10-13 09:44:55 15529

转载 java集合类框架的基本接口有哪些

转自:牛客网java集合类框架的基本接口有哪些?答:Collection:代表一组对象,每一个对象都是它的子元素Set:不包括重复元素的CollectionList:有顺序的Collection,并且可以包含重复元素Map:可以把键(key)映射到值(value)的对象,键不能重复下面是详细解释:转自:牛客网(一)总共有两大接口:Collecti

2017-10-13 08:57:47 22743 1

转载 如何确保N个线程可以访问N个资源同时又不导致死锁

转自:牛客网如何确保N个线程可以访问N个资源同时又不导致死锁?答:使用多线程时,一种非常简单的避免死锁的方式就是:指定锁的顺序,并强制线程按照指定的顺序获取锁。因此所有的线程都是以同样的加锁和释放锁,就不会出现死锁了下面是详细解释:预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下3种方法:1.破坏  请求和保持条件1.1)进程等所有要请求的资源都空闲

2017-10-12 19:30:22 12464 1

转载 什么是死锁

转自:牛客网死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们都将无法推进下去,陷入死循环例子:当线程1和2都已经成功获取到第一个锁时,死锁就发生了。  //线程1 Synchorized(objectA){    Synchorized(objectB){        //操作  

2017-10-12 19:05:27 658

转载 在监视器(Monitor)内部,是如何做到线程同步的

转自:牛客网在java虚拟机中,每个对象(object和class)通过某种逻辑关联监视器,每个监视器和一个对象引用相关联,为了实现监视器的互斥功能,每个对象都关联着一把锁一旦方法或者代码块被synchronized修饰,那么这个部分就放入了监视器的监视区域,确保一次只能有一个线程执行该部分的代码,线程在获取锁之前不允许执行该部分的代码

2017-10-12 18:49:29 2200

转载 同步方法和同步代码块的区别

转自:牛客网1.同步方法使用synchronized修饰方法,在调用该方法前,需要获得内置锁(java每个对象都有一个内置锁),否则就处于阻塞状态代码如: public synchronized void save(){//内容}2.同步代码块使用synchronized(object){}进行修饰,在调用该代码块时,需要获得内置锁,否则就处于阻塞状态 

2017-10-12 18:25:11 25808 2

转载 概括解释线程的几种状态

转自:牛客网1.新建(new):新创建了一个线程对象2.可运行(runnnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权3.运行(running):可运行状态(runnable)的线程获得了CPU时间片(timeslice)4.阻塞(block):阻塞状态是指线程因为某

2017-10-12 10:06:05 870

空空如也

空空如也

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

TA关注的人

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