自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浏览器中输入一个网址后全部的执行过程

过程包括:域名解析->建立TCP连接(三次握手)->发起http请求->服务器响应http请求,浏览器得到html代码->浏览器解析html代码,并请求html代码中的资源->浏览器对页面进行渲染呈现给用户域名解析浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有且没有过期,则解析到此结束如果浏览器自身的缓存中没有找到对应的条目,那么浏览器会搜索操作系统的DNS缓存,,如果找到且没有过期则停止搜索解析到此结束如果操作系统的DNS缓存也没有找到,那么

2020-08-27 23:57:54 441

原创 操作系统

1.用户态和内核态内核态:操作系统管理程序运行的状态,执行的是特权指令(特权指令是只只能由操作系统执行的指令,包括启动I/O设备、设置时钟、控制中断屏蔽位、清内存等)用户态:用户程序运行时的状态,处于第三级特权,执行的是非特权指令用户态到内核态的转换主要是通过:系统调用,异常,中断内核态到用户态的转换主要是通过:设置程序状态字(程序状态字又称PSW,主要用来控制指令执行顺序并保留和指示与程序有关的系统状态,实现程序状态的保护和恢复)2.中断中断是指CPU对系统中或系统外发生异步事件的响应,异

2020-08-27 23:02:39 648

原创 并发编程基础

1.并发编程的优缺点优点充分利用了多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到了极致(因为在一个线程中,还有等待输入等操作),性能得到提升缺点并发编程的目的就是为了提高程序的执行效率,提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到比如:内存泄漏、上下文切换、线程安全、死锁等问题2.并发编程的三要素是什么并发编程的三要素:原子性:原子性指的是要么一个或多个操作全部执行成功,要么全部执行失败,是一个不可分割的整体,具体到计算机,就是

2020-08-26 20:45:07 197

原创 浅谈ConCurrentHashMap

在JDK1.7中:ConCurrentHashMap的底层采用的是segments+HashEntry数组,segment继承了ReentrantLock,每个数组都有一个锁,叫做锁分段在JDK1.8中:ConCurrentHashMap的底层是:散列表+红黑树,与hashMap是一样的它支持高并发的访问和更新,它是线程安全的检索操作不用加锁,get方法是非阻塞的key和value都不允许为nullConcurrentHashMap的底层实现重要的成员变量private transi

2020-08-22 17:39:19 386

原创 操作系统——同步问题

1.进程中线程同步的四种常用方式临界区:一种代码段,在其中可能发生多个线程共同改变变量、读写文件等操作,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他视图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占,临界区调度原则:同一时间临界区内仅有一个线程执行,如果有若干线程请求进入空闲临界区,一次 仅允许一个线程进入进入临界区的线程必须在有限时间内退出,以保证其他线程能进入该临界区如果线程不能进入临界区,应让出CPU,避免出现忙等现象从线

2020-08-22 16:10:08 412

原创 计算机网络——什么是半连接队列

服务器第一次收到客户端的SYN之后,就会处于SYN_RCVD(同步已接收)状态,此时双方还没有完全建立连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称为半连接队列。SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户端确认包,服务器进行首次重传,等待一段时间仍未收到客户端确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。每次重传等待的时间不一定相同...

2020-08-21 19:34:48 1566

原创 AQS浅谈

AQS是抽象同步队列AbstractQueueSynchronizer的简称,AQS定义了一套多线程访问共享资源的同步框架,AQS并不实现任何同步接口,它提供了一些可以被具体实现类直接调用的一些原子操作方法,AQS同时提供了互斥模式和共享模式两种不同的同步逻辑,一般情况下,子类只需要根据需求实现其中一种模式,当然也有同时实现两种模式的同步类,许多类都依赖于它,如reentrantLock等AQS的工作机制:AQS的等待队列是基于链表实现的FIFO的等待队列,队列每个节点只关心其前驱节点的状态,线程唤醒时只

2020-08-21 18:14:06 227

原创 HTTP和HTTPS

1.HTTP和HTTPS1.1 HTTPHTTP:HTTP称为超文本传输协议,是互联网上应用最广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。HTTP协议是以明文方式发送信息的,如果截取了Web浏览器和服务器之间的传输报文,就可以直接获得其中的信息HTTP原理:客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,建立连接后,客户机发送一个请求给服务器,该请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息,包括请求修

2020-08-17 23:53:37 275

原创 计算机网络——域名系统

1.因特网有了IP地址,为什么还需要域名我们知道,在电话网上使用的一连串的电话数字号码不好记,而具体的单位名称或姓名就容易记,同样,用点分十进制的方法表示一个IP地址确实也不好记,因此设计用名字来代替点分十进制的数字会更加符合我们实际2.域名系统DNS因特网的域名系统DNS是一个分布式数据库联机系统,采用客户机/服务器应用模式,客户机可以通过域名服务程序将域名解析到特定的IP地址,域名服务程序在专设的节点上运行,常将该节点称为域名服务器(DNS)2.1域名结构TCP/IP采用层次型命名的方法,域名

2020-08-17 00:44:56 651

原创 ArrayList底层原理

ArrayList是抽象类AbstractList的子类,实现了List接口、RandomAccess(随机访问)等接口ArrayList的底层主体就是一个Object数组,对ArrayList的所有底层操作就是基于数组实现的1.ArrayList的线程安全性对ArrayList进行添加操作的时候是分两个步骤进行的,即第一步先在object[size]的位置上存放需要添加的元素,第二步就是将size的值增加1,由于这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境

2020-08-16 16:51:03 4155 1

原创 MySQL面试题——存储引擎

存储引擎其实就是一套文件系统,关于如何实现存储数据,如何为存储的数据建立索引以及支持增删改查操作可以使用show engines;命令来查看MySQL支持的存储引擎使用==show variables like ‘%storage_engine’==来查看默认的存储引擎,可以看到目前MySQL支持的默认存储引擎是InnoDB1.MyISAMMyISAM存储引擎是MySQL5.5版本之前的默认存储引擎MyISAM类型的表支持三种不同的存储结构:静态型、动态型、压缩型静态型(fixed):就是

2020-08-16 14:26:36 439

原创 Java并发编程面试题——锁

1.乐观锁和悲观锁乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里也引入了类似的思想1.1 悲观锁悲观锁是指对数据被外界修改持保守态度,认为数据很容易被其他线程修改,所以在数据被处理前进行加锁,并在整个数据处理过程中,使数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制,即在数据库中,在对数据记录操作前给记录加排它锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁1.2 乐观锁乐观锁是相对于悲观锁来说的,它认为数据在一般情况下不会造成冲突,所以在访问记录前

2020-08-15 23:41:20 335

原创 Java并发编程面试题——synchronized的底层实现

synchronized实现原理synchronized代码块:首先我们先建立一个synchronized同步语句块:public class SynchronizedTest { public void method() { synchronized(this) { System.out.println("synchronized");然后对其进行反编译:monitorenter每个对象有一个监视器锁(monitor),当monitor被占用时就会处于锁定状态,线程执行moni

2020-08-15 17:42:19 163

转载 HTTPS加密过程

为什么需要加密因为htpp的内容都是明文传输的,明文数据会经过中间代理服务器、路由器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,所以我们需要对信息进行加密使用对称加密首先来了解一下对称加密:对称加密就是发送方和接收方都使用同一个密钥,那么我们可以使用对称加密技术对我们传输的信息进行加密吗如果通信双方都各自持有同一密钥,且没有人知道,这两方的通信安全当然是可以被保证的,然而最大的问题就是这个密钥怎么让传输的双方知道,且同时不被别人知道,直接传输公钥是不现实的,因为在传输公钥也是

2020-08-15 11:40:36 259

转载 代理模式

1.代理模式代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另外一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。通俗来说,就是为一个对象提供一个代理以控制对这个对象的访问代理模式的类图如下:1.1 静态代理如果目标类中所有的方法,我们已经知道,而我们需要对目标类中的某些方法进行增强,可以使用静态代理,实现静态代理方式有继承法和聚合方法继承法:代理类直接继承被代理类,实现其原有方法,并添加一些额外的功能聚合方法:代理类实

2020-08-14 16:11:59 131

原创 TCP协议

TCP和UDP的区别TCP是面向连接的,UDP是面向非连接的,即在发送数据前不需要建立通信TCP提供可靠服务,UDP无法保证TCP面向字节流,UDP面向报文TCP只支持一对一通信,UDP支持一对多和一对一通信TCP数据传输慢,UDP数据传输快,UDP适用于短距离传输TCP和UDP的应用场景TCP:适用于邮件,远程登陆,文件传输等对准确性要求较高的地方UDP:及时通信,比如QQ,网络电话等报文和字节流的区别字节流:发送次数和接受次数可以不相同,比如向水池中倒入了20盆水,但是开水

2020-08-12 17:46:15 227

原创 LinkedList源码分析

LinkeList是List接口的另一种实现,它的底层是基于双向链表实现的,因此它具有插入删除快而修改慢的特点LinkedList的主体是Node<E>,Node节点内部具有三个属性:LinkedList中有三个比较重要的字段:size:表示数组中元素的个数first:头节点引用last:尾节点引用LinkedList重载了两个构造函数:一个是无参构造函数,一个是传入外部集合的构造器,与ArrayList不同的是:LinkedList没有指定初始大小的构造器添加元素

2020-08-11 19:47:15 122

转载 HashSet源码分析

HashSet是Set接口的实现类,它的内部主体实际上就是一个HashMap,在HashSet中,元素都存到HashMao键值对的Key上面,而Value是有一个统一的值:private static final Object PRESENT可以看到,HashSet的无参构造函数就是直接new一个HashMap,并使用默认初始容量为16和负载因子为0.75f更加详细的源码解读...

2020-08-11 15:06:32 100

原创 单例模式

单例模式的定义:确保一个类只有一个实例,该类负责创建自己的对象,同时确保只有单个对象被创建并且提供一个全局的访问点,外部通过这个访问点来访问该类的唯一实例,这里的全局实际上指的就是静态字段那么我们为什么要用单例模式呢?在我们系统中,有一些对象其实我们只需要一个,比如说:线程池、缓存、对话框等,事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常、资源使用过量、或者不一致的结果,单例模式是为了避免重复生成同一实例对象而产生的一种模式为什么不适用全局

2020-08-11 14:40:14 144

原创 HashTable底层实现

HashTable是继承与Dictionary类,实现了Map接口,HashTable的主体还是Entry数组HashTable的默认容量大小为11,负载因子为0.75HashTable的主要方法的源码实现逻辑,与HashMap中非常相似,有一点重大区别就是所有的操作都是通过synchronized锁保护实现的,只有获得了对应的锁,才能进行后续的读写操作put()方法我们可以看到,HashTable的put方法使用synchronized修饰,也就是说当使用put方法时,必须要获取HashTab

2020-08-10 02:12:49 4951 2

原创 MySQL面试题——数据库优化问题

1.SQL优化1.1如何定位及优化SQL语句的性能问题对于低性能的SQL语句的定位,最重要也是最有效的办法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划执行计划一般包含下面几个字段的信息:id:表示一个查询中各个子查询的执行顺序,id相同则执行顺序由上至下,id不同,id值越大优先级越高,越先被执行,id为null时表示一个结果集,不需要使用它查询,常出现在union等查询语句中select_type:每个子查询的查询类型,一些常见的查询类型为:table:查询的

2020-08-10 00:26:18 415

原创 索引失效问题

没有查询条件,或者查询条件没有建立索引对索引列进行运算导致索引失效,即对索引列进行运算包括(+,-,*,/,!等)like时百分号(%)在前面对于联合索引,没有遵循最左匹配原则字符型字段为数字时where条件里不添加引号...

2020-08-09 23:22:13 140

原创 MySQL面试题——常用的SQL语句

1.SQL语句主要分为哪几类1.数据库定义语言DDL,包括CREATE,DROP,ALTER,即对逻辑结构有操作的,其中包括表结构,视图和索引2. 数据库查询语言DQL,以select为关键字,各种简单查询,连接查询等都属于DQL3. 数据操纵语言DML,包括INSERT,UPDATE,DELETE4. 数据控制功能DCL,主要对数据库安全性,完整性等有操作,可以简单的理解为权限控制等2.SQL约束有哪几种NOT NULL:用于控制字段的内容一定不能为空UNIQUE:控制字段内容不能重复,一

2020-08-09 17:59:46 2116 1

原创 Java并发编程面试题——volatile关键字

1.volatile关键字介绍1.1内存模型的相关概念计算机在执行程序时,每条指令都是在CPU中执行,而在执行指令过程中,就会涉及到数据的读取和写入的问题,由于程序运行过程中的临时数据是存放在主存中的,这时就存在一个问题,由于CPU执行速度很快,而从内存中读取数据和向内存中写入数据的过程跟CPU指令执行的速度比起来要慢得多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度,因此在CPU里面就有了高速缓存也就是当程序在运行过程中,会将运算所需要的数据从主存复制一份到CPU

2020-08-09 17:22:09 328 1

原创 MySQL面试题——锁机制

1.MySQL的锁机制当数据库有并发事务的时候,可能会产生数据不一致,这时候就需要一些机制来保证访问的次序,锁机制就是这样的一个机制2.隔离级别与锁的关系在未提交读级别下,读取数据不需要加共享锁在提交读级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁在重复读级别下, 读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁在可串行化下,该级别锁定整个范围的键,并一直持有锁,直到事务完成3.按照锁的粒度分数据库锁有哪些在关系型数据库中,可以

2020-08-08 17:16:45 1847

原创 HashMap浅谈

HashMap主体HashMap中的主体就是一个数组,其中数组中的每一个元素就是一个链表:hashCode()方法HashMap中的hashcode()方法:对于Objects.hashCode(key)这个调用,得解释一下,它实际上就是调用key的hashCode方法,Objects类就是一个工具类,Objects中的hashCode源码如下:要注意区分:Key自带的hashCode()函数和HashMap中的hashCode()函数(即上面这段代码),前者是产生Key对象的hashcod

2020-08-06 17:57:29 144

原创 MySQL面试题——事务的ACID四大特性

原子性原子性是指一个事务是一个不可分割的工作状态,其中的操作要么都做,要么都不做一致性一致性是指事务执行前后,数据处于一种合法的状态隔离性隔离性是指多个事务并发执行的时候,事务内部的操作是与其他事务是隔离的,并发执行的各个事务之间不能互相干扰持久性持久性是指事务一旦提交,它对数据库的改变就应该是永久性的MySQL怎么保证一致性这个问题分为两个层面来说:从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID这四大特性之中,一致性是目的,原子性、隔离性、持久性是手段,

2020-08-06 14:13:39 642

原创 MySQL面试题——聚簇索引和非聚簇索引

1.聚簇索引和非聚簇索引的概念1.1聚簇索引将数据存储与索引放到了一块,找到了索引也就找到了数据,当表有聚簇索引时,它的数据实际上存放在索引的叶子页上,也就是B+树的叶子节点上,因为数据行不能存在两个地方,所以一个表只能有一个聚簇索引,在InnoDB中通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引1.2非聚簇索引将数据存储与索引分开,索引结构的叶子节点指向了数据的对应行,在非聚簇索引中,索引中的逻辑顺序并

2020-08-05 22:33:16 3133 1

原创 sleep()和wait()有什么区别

两者都可以使线程进入阻塞态区别:所属类不同:sleep属于Thread类,wait属于Object类是否释放锁:sleep不释放线程所拥有的监视器资源,而wait会把监视器资源释放用法不同:wait()方法通常用于线程间的交互和通信,sleep通常用于暂停执行用途不同:wait()方法被调用后,如果没有设置等待时间,线程不会自动苏醒,需要别的线程调用共享变量的notify()或notifyAll()方法。sleep()方法在等待时间到了之后,会自动苏醒...

2020-08-05 20:48:41 164

原创 2020-08-05

1.Java中用到的线程调度算法在运行池中,会有多个处于就绪状态的线程在等待CPU,Java虚拟机的一项任务就是负责线程的调度,线程调度是指按照特定机制为多个线程分配CPU的使用权有两种调度模型:分时调度模型和抢占式调度模型分时调度模型:让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片抢占式调度模型:Java虚拟机采用抢占式调度模型,抢占式调度模型是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的优先级相同,那么随机选择一个线程,使其占用CPU2.线程调度策

2020-08-05 17:36:30 164

原创 Java并发编程面试题——阻塞态有哪几种

阻塞的情况分为三种:等待阻塞:运行状态中的线程**wait()**方法,JVM会把该线程放入到等待队列中,使本线程进入到等待阻塞状态同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),则JVM会把该线程放入锁池中,线程处于同步阻塞状态其他阻塞:通过调用线程的sleep()或join()或发出I/O请求时,线程会进入到阻塞状态...

2020-08-05 17:02:57 1935

原创 SpringMVC——DispatcherServlet源码分析

首先启动项目,进行初始化操作:initStrategies()函数主要对DispatcherServlet类中的几个属性进行初始化操作,其中的几个属性为:MultipartResolver:解析多部分请求,以支持HTML表单上传文件HandlerMapping:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用Controller注解HandlerAdapter:帮助DispatcherServlet处理映射处理程序的适配器,而不用考虑实际调用的是哪个处理程序ViewR

2020-08-04 20:50:32 191

原创 MySQL面试题——数据库为什么使用B+树而不是B树

数据库为什么使用B+树而不是B树判断一种数据结构作为索引的优劣主要是看在查询过程中的磁盘IO渐进复杂度,一个好的索引应该是尽量减少磁盘IO操作次数B树只适合随机检索,而B+树同时支持随机检索和顺序检索B+树空间利用率更高。因为内部节点不存储数据,只存储索引值,因为相比较B树来说,B+树一个节点可以存储更多的索引值,从而使整颗B+树变得更矮,减少了I/O次数,磁盘读写代价更低,I/O读写次数是影响索引检索效率的最大因素B+树的查询效率更加稳定。B树搜索有可能会在非叶子节点阶数,约靠近根节点的记录查找

2020-08-04 15:30:37 2388

原创 MySQL面试题——使用B-Tree和B+Tree各自的好处

使用B-Tree的好处B树可以再内部节点存储键值和相关记录数据,因此把频繁访问的数据放在靠近根节点的位置将大大提高热点数据的查询效率。B树一般在特定数据重复多次查询的场景中更加高效使用B+Tree的好处B+树内部节点不存储数据,只存储键值,这样,每个节点就能存储更多的键值,一次性也就能将更多的键值读入内存,减少了对磁盘的IO操作次数,且B+树的叶节点有一条链相连,所以对于区间内查询数据比较高效...

2020-08-04 12:15:02 772

转载 MySQL面试题——最左匹配原则

参考链接:Mysql最左匹配原则

2020-08-04 12:08:58 1189

原创 MySQL面试题——前缀索引

前缀索引当索引的字符串列很大时,创建的索引也就变得很大,为了减小索引体积,提高索引的扫描速度,就使用索引的前部分字符串索引,这样索引占用的空间就会减少,这样的索引称为前缀索引创建前缀索引,首先要先去比较重复率,比较待选择的前缀和原先列的重复率,选择最接近原先列的重复率的前缀,然后再考虑占用空间前缀索引的优缺点:MySQL前缀索引能够有效减少索引文件的大小,提高索引的速度,但是前缀索引不能用于ORDER BY和GROUP BY...

2020-08-04 11:01:01 220

原创 MySQL面试题——创建索引时需要注意什么

非空字段:应该指定列为NOT NULL,因为含有空值的列很难进行查询优化,因为他们使得索引、索引的统计信息以及比较运算更加复杂取值离散大的字段索引字段越小越好:数据库的数据存储以页为单位,一页存储的数据越多,一次IO操作获取的数据越大,效率越高...

2020-08-03 17:06:29 832

原创 MySQL面试题——创建索引的三种方式

在执行CREATE TABLE时创建索引CREATE TABLE user_name{ id INT auto_intrement PRIMARY KEY,//创建主键索引 //more KEY name(column_name1,column_name2),//创建普通索引 FULLTEXT KEY(column_name3),//创建全文索引 UNIQUE KEY(column_name4),//创建唯一索引 使用ALTER TABLE命令去增加索引创建主键索引:ALTER TAB

2020-08-03 16:44:44 1110

原创 MySQL面试题——索引设计和创建的原则

MYSQL索引设计和创建原则对于经常查询的字段,建议创建索引索引不是越多越好,一个表如果有大量的索引,不仅占用磁盘空间,而且对于写操作会造成性能底下避免对经常更新的表进行创建过多的索引,因为当表中有数据更改时,索引也会进行调整和更新,十分消耗系统资源数量小的表建议不要创建索引,数据量小时索引不仅起不到明显的优化效果,对于索引结构的维护反而消耗资源不要在区分度地的字段建立索引,比如性别字段,只有男女,建立索引完全起不到优化效果定义有外键的数据列一定要建立索引,因为如果外键列上缺少索引会带来两个问

2020-08-03 16:25:25 429

原创 MySQL面试题——索引算法

1.BTree算法Btree算法是最常用的MySQL数据库索引算法,它可以用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量2.Hash算法Hash索引只能用于对等比较,由于是一次定位数据,不想Btree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于Btree索引,Hash索引具有如下缺点:hash索引存储的是索引列的哈希码值和对应行的指针,所以不能通过读取

2020-08-03 15:05:40 129

空空如也

空空如也

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

TA关注的人

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