剑指Offer
嗯哼唉、
后端、云计算、大数据
展开
-
剑指Offer(网络)——TCP和UDP的区别
前两篇文章讲解了TCP协议。接下来来介绍一下UDP,从UDP协议的报文结构开始说起相对于TCP,UDP报文结构简单了很多:源端口、目标端口、数据包长度和奇偶校验值和用户数据组成。结构简单,少了很多TCP具有的功能,其中有:不支持错误重传;不支持滑动窗口。UDP特点:面向无连接;不维护连接状态,支持同时向多个客户端传输相同的信息;数据包报头只有8个字节,额外的开销比较小;吞...原创 2020-02-05 20:31:47 · 227 阅读 · 0 评论 -
剑指Offer(网络)——TCP四次挥手
挥手指的就是终止连接,TCP四次挥手流程图如下:客户端或者服务端触发close,假设客户端触发close数据传输完毕之后,双方才可以释放连接;最开始客户端和服务端都处于Established状态,假设客户端主动关闭;首先客户端发送连接释放报文并停止发送数据,该数据报报头中携带的flag为FIN=1,seq=u,u指的是刚才连接状态下传送过来的最后一条信息的最后一个序号加上1,此时客户端...原创 2020-02-05 18:48:40 · 273 阅读 · 0 评论 -
剑指Offer(网络)——TCP三次握手
简单来介绍一下传输控制协议TCP:TCP协议是面向连接的、可靠的、基于字节流的传输层通信协议;当数据传输的时候,应用层向TCP发送数据流,然后TCP会将应用层的数据流分割成报文段并发送给目标节点的TCP层;TCP为了保证不丢包就给每一个包一个序号(Sequence Number),同时序号也保证对方接受数据的时候顺序是一定的;当对方收到数据的时候回复一个ACK去确认,如果在合理的时延之内...原创 2020-02-05 12:38:12 · 318 阅读 · 0 评论 -
剑指Offer(Spring)——AOP
AOP——面向切面编程软件有一个重要的概念:关注点分离:不同的问题交给不同的部分去解决。AOP是一种关注点分离的技术,写Web时需要写缓存、业务逻辑、日志、出错处理等等东西都要放在一起,为了将业务各个功能分离开切面就出现了,当业务功能代码和切面代码分开之后架构就会变得高内聚低耦合。如果模块化之后虽然模块本身的成本降低了,但是接口的开发的成本又升高了我们为了保证业务的完整性就需要使用切面将业务...原创 2020-02-04 13:27:00 · 334 阅读 · 0 评论 -
剑指Offer(Spring)——IOC容器
容器内部的运行的原理:Spring启动的时候读取应用程度提供的bean配置并在Spring容器中生成一份相应的bean配置注册表,然后根据这张注册宝去是实例化bean,装配好bean之间的依赖关系后为上层提供准备就绪的运行环境,Spring提供一个配置文件描述bean和bean之间的依赖关系,利于Java的反射功能实例化bean,并在建立bean之间的依赖关系。Spring IOC支持的功能...原创 2020-02-03 23:55:27 · 337 阅读 · 0 评论 -
剑指Offer(Spring)——IOC原理
IOC(Inversion of Control):控制反转,是Spring最核心部分也是任意组件的基本,是一种思想,可以使你从繁琐的对象嵌套中解锁出来更进一步突出面向对象,在这之前先来了解一下依赖注入(Dependency Inversion)。举个依赖注入的例子:设计行李箱:可以发现这四个是互相依赖的关系,他们是逐步依赖的关系,如果底层修改全局都得修改,通过代码来直观的观察一下:如果...原创 2020-02-03 21:16:27 · 400 阅读 · 0 评论 -
剑指Offer(类库)——Java的IO机制
本文主要介绍一下BIO、NIO、AIOBlock-IO:基于字节流的InputStream和OutputStream,基于字符流的Reader和Writer,同时也包括Socket那些java.net包下的类等。BIO的属性是同步阻塞的,优点就是写起来简单缺点是效率太低。NonBlock-IO:在JDK4中引入了NIO,它是一种构建多路复用的,同步非阻塞的IO操作提供了Selector、C...原创 2020-02-02 01:03:01 · 210 阅读 · 0 评论 -
剑指Offer(类库)——JUC包的知识梳理
ToolsCollections原创 2020-02-02 00:03:07 · 338 阅读 · 0 评论 -
剑指Offer(类库)——HashMap、HashTable、ConcurrentHashMap(下)
HashTableHashTable是线程安全的,那么HashTable做了什么操作才实现了HashMap没做到的线程安全呢???写个简单的demo:进入synchronizedMap内部看一下:声明了一个mutex修饰对象的成员,使用互斥锁包围起来保证了内容互斥,串行化访问以此来保证线程安全。HashTable也是一样的和HashMap实现逻辑没有什么区别,是用同样的去加锁而已:...原创 2020-02-01 22:27:39 · 163 阅读 · 0 评论 -
剑指Offer(类库)——HashMap、HashTable、ConcurrentHashMap(上)
Map是由一对对的key-value组成的,key要求是唯一的,value不要求。通过看源码可以得出:key自带去重功能是Set类型的,value是Collection接口可存放任意集合。来看一下Map的实现类:HashMap、HashTable、ConcurrentHashMap之间的区别?HashMapJDK8之前HashMap是由数组+链表组成的,数组查找快增删慢,链表增删快查...原创 2020-02-01 21:12:27 · 266 阅读 · 0 评论 -
剑指Offer(类库)——Java集合框架
学习编程数据结构和算法是必备的知识,C语言尤其能够体现这些数据结构所附带的特点,Java比C在使用起来更加简单,是因为已经将其封装到了集合框架中。数据结构考点如下:数组和链表的区别链表的反转、链表环路检测,双向链表、循环链表队列、栈的应用二叉树的遍历红黑树的旋转算法的考点:内部排序(递归、冒泡、快排、选择、插入)外部排序(应该掌握如何利用有限的内存配合海量的外部存储来处理...原创 2020-01-31 22:35:11 · 191 阅读 · 0 评论 -
剑指Offer(类库)——Java异常体系
Java异常处理机制中主要回答了三个问题:What:异常类型回答了什么被抛出;Where:异常堆栈跟踪回答了在哪抛出;Why:异常信息回答了为什么被抛出。下面来说一下经常会被问到的问题:Exception和Error的区别Java异常体系结构如下:Error:一般是指JVM相关的问题,比如说系统崩溃,就是说程序无法处理的系统错误如堆栈溢出、内存泄漏,编译器无法检测到。Error是...原创 2020-01-31 20:16:46 · 212 阅读 · 0 评论 -
剑指Offer(锁)——Java线程池
在Web开发中服务器需要接受并处理请求,因此会为一个请求分配一个线程去处理,如果并发的请求数量很大但是请求的时间很短,那么就会频繁的创建和销毁线程,造成CPU的隐患,这样会降低系统的效率。为了解决上述问题,可以利用Executors创建不同的线程池满足不同场景的需求目前提供了五种创建线程池的方法:newFixedThreadPool(int nThreads):指定工作线程数量的线程池;n...原创 2020-01-31 14:00:52 · 239 阅读 · 0 评论 -
剑指Offer(锁)——CAS
CAS是一种高效实现线程安全性的方法:支持原子性的更新操作,适用于计数器,序列发生器等场景;属于乐观锁机制,号称lock-free(无锁),但是实际上还是存在底层锁的;CAS操作失败时候由开发者决定是继续尝试还是执行别的操作。CAS操作思想:包含三个操作数——内存位置(V)、预期原值(A)、新值(B)比较时候由内存位置和预期原值去进行对比,如果是相同的就会将内存位置的值更新为新值否...原创 2020-01-31 12:29:00 · 244 阅读 · 0 评论 -
剑指Offer(锁)——JMM的内存模型
Java内存模型(Java Memory Model, 简称JMM)本身是一种抽象的概念并不是真实存在的,描述的是一种规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。简单说明一下:线程内的变量都是存储在栈中的,这些变量被称作线程的私有变量,是存在线程的工作内存中;JMM要求所有变量的信息,需要放进主内存,线程之间是通过主内存区进行通信...原创 2020-01-31 00:56:37 · 279 阅读 · 0 评论 -
剑指Offer(锁)——synchronized和ReentrantLock
参考之前专栏的文章:https://blog.csdn.net/weixin_44240370/article/details/96646295原创 2020-01-30 22:48:14 · 181 阅读 · 0 评论 -
剑指Offer(锁)——synchronized底层实现原理
文章目录1、对象头2、Mark Work3、Monitor4、自旋锁和自适应锁自旋锁5、自适应锁6、锁消除7、锁粗化8、synchronized的四种状态偏斜锁轻量级锁实现synchronized的基础:Java对象头MonitorHotspot虚拟机中对象在内存中的布局:对象头、实例数据、对齐填充1、对象头主要来说一下对象头,下图是对象头的结构2、Mark Work3、M...原创 2020-01-30 22:13:45 · 429 阅读 · 1 评论 -
剑指Offer(锁)——synchronized基本使用方法
说到并发那么就要说一下Synchronized和ReentrantLock等等方面相关的知识。针对互斥锁先来介绍一些引起线程安全问题的主要原因是什么?存在共享数据(也称临界资源);存在多条线程共同操作共享数据。解决上面的问题的方法时:同一个时刻有且只有一个线程在操作共享数据时候其他线程必须等到该线程处理完数据后再对共享数据进行操作。因此引入了互斥锁,其有以下几个特性:互斥性同...原创 2020-01-30 12:52:32 · 257 阅读 · 0 评论 -
剑指Offer(线程)——如何中断线程
之前我们通常会使用stop来停止线程但是这种方法是不安全的,这是因为一个线程会影响另外一个线程,使线程本应该满足的原子性存在无法满足的可能了。假设线程A调用stop停止了线程B,一般情况下线程是不进行通信的这样就会让线程B释放可能还有用的锁这样就会导致数据不同步的问题。。现在使用最多的是interrupt。它的用处不是中断线程而是通知线程应该去中断但是最后中断还是不中断是由线程自己去判断的,这...原创 2020-01-29 13:10:53 · 178 阅读 · 0 评论 -
剑指Offer(线程)——sleep和wait的区别以及notify和notifyAll的区别
sleep和wait在源码中可以看出基本的差别:sleep是Thread类中的一个方法,wait是Object类中的一个方法;sleep()方法可以在任何地方使用;wait()方法只能在synchronized方法或者synchronized块中使用。但是本质上的区别在于:Thread.sleep只是会让出CPU,但是不会导致锁行为的改变;Object.wait不仅是会让出CP...原创 2020-01-29 12:40:18 · 320 阅读 · 0 评论 -
剑指Offer(线程)——线程的状态
通过Thread.State就可以看到线程的状态:public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable t...原创 2020-01-29 00:16:41 · 156 阅读 · 0 评论 -
剑指Offer(线程)——如何实现处理线程的返回值
run方法是Thread内部类中一个重写的方法没有参数传入,也没有返回值。如果想在实现run方法时传参有三种方法:构造函数传参成员变量传参回调函数传参了解了如何在run方法内进行传参之后,那么要如何实现处理线程的返回值呢?实现处理线程的返回值一共有三种方法:1、主线程等待法使主线程循环等待知道目标子线程返回值为止;下面是一个简单的demo:使用主线程等待法之后就能获取到子线...原创 2020-01-28 23:49:22 · 259 阅读 · 0 评论 -
剑指Offer(线程)——Thread和Runnable的关系
从本质上看Thread是JDK的一个类,Runnable是一个接口,Thread内部实现了Runnable接口。。。写个简单的demo来看一下两者之间有什么不同:首先将线程执行的内容写出来(十次循环,打出执行任务的线程名字):创建三个线程去执行任务,结果入下:可以看出多线程情况下线程之间是保持原子性的互相不会依赖,因此不存在因为先执行一个线程或者最后执行一个线程从而影响程序的输入和输出...原创 2020-01-28 22:40:07 · 257 阅读 · 0 评论 -
剑指Offer(线程)——线程start和run方法的区别
先从一个简单的程序看起:使用start():public class ThreadTest { private static void attack(){ System.out.println("fight"); System.out.println("current thread is:" + Thread.currentThread().getNa...原创 2020-01-28 22:04:26 · 219 阅读 · 0 评论 -
剑指Offer(GC)——常见面试题
文章目录1、Object的finalize()方法是否与C++的析构函数一样2、Java中强引用、软引用、弱引用、虚引用之间的区别(1)、强引用(2)、软引用(3)、弱引用(4)、虚引用(5)、引用队列1、Object的finalize()方法是否与C++的析构函数一样答案肯定是否定的,finalize调用是确定的而析构函数调用是不确定的。一个Java方法经过第一次可达性分析时候发现没和GC...原创 2020-01-23 17:11:34 · 233 阅读 · 0 评论 -
剑指Offer(GC)——老年代垃圾收集器
垃圾收集器之间的联系,本文主要讲解一下老年代收集器。Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)是Serial GC老年代版本,也是单线程的进行垃圾收集的时候必须暂停所有的工作线程,同样是简单高效,是Client模式下老年代的默认垃圾收集器。Parallel Old收集器(-XX:+UseParallelOldGC,标记-整理算法)是在JDK6之...原创 2020-01-23 12:33:01 · 317 阅读 · 0 评论 -
剑指Offer(GC)——新生代垃圾收集器
首先先来了解一下Stop-the-World:JVM由于要执行GC而停止了应用程序的执行;任何一种GC算法中都会发生;多数GC优化通过减少Stop-the-World发生的时间来提高程序性能。如果在进行垃圾回收的时候同时产生了垃圾,那么要怎么办呢,这个时候有了Safepoint。SafePoint:可达性分析要在一个快照点进行,是因为在运行时程序一直在运行,需要一个静态层面的分析。...原创 2020-01-23 11:16:52 · 251 阅读 · 0 评论 -
剑指Offer(GC)——垃圾回收之回收算法
文章目录标记-清除算法(Mark and Sweep)2、复制算法3、标记-整理算法(Compacting)4、分代收集算法1、Minor GC2、Full GC本文主要介绍几个经典的回收算法:标记-清除算法(Mark and Sweep)就像名字所说将回收分成两个阶段:标记和清除,使用的算法是可达性分析算法。标记:从根集合进行扫描,对存活的对象进行标记。清除:对堆内存从头到尾进行线性遍...原创 2020-01-22 23:53:05 · 340 阅读 · 0 评论 -
剑指Offer(GC)——垃圾回收之标记算法
先来说明一个什么情况下Java对象被判定为垃圾?当没有被其他对象引用情况下该对象就是没有用的。判断Java对象为垃圾的算法有哪些?引用计数法可达性分析算法引用计数法通过判断对象的引用数量来决定对象是否可以被回收;每个对象实例都有一个引用计数器,被引用加一,完成引用减一;任何引用计数为0的对象实例都可以被当做垃圾收集。优点:执行效率高,只需要过滤出引用计数为0的即可并且程序执行受影...原创 2020-01-22 21:49:13 · 220 阅读 · 0 评论 -
剑指Offer(JVM)——Java内存模型常考题
1、JVM三大性能调优参数-Xms、-Xmx、-Xss含义?-Xss:规定了每个线程虚拟机栈(堆栈)的大小,256K就已足够。-Xss大小会影响并发线程数的大小;-Xmx:堆的内存在不够的时候会进行扩容,-Xmx是堆能够扩展到的最大值;-Xms:堆刚被创建出来的初始大小。但是通常将-Xms和-Xmx设置成一样的,因为堆扩容时候会发生内存抖动,影响程序性能。2、Java内存模型中堆和栈...原创 2020-01-21 21:00:45 · 328 阅读 · 0 评论 -
剑指Offer(JVM)——Java内存模型
文章目录线程角度1、程序计数器(Program Counter Register)2、Java虚拟机栈(Stack)3、本地方法栈(Native Stack)4、元空间(MetaSpace)和永久代(PermGen)区别5、堆(Heap)首先来简单介绍一下内存:程序执行过程中需不断的将逻辑地址和物理地址进行映射从而找到指令具体执行的位置。Java程序运行在虚拟机上,运行时候需要内存空间,执...原创 2020-01-21 16:56:35 · 342 阅读 · 0 评论 -
剑指Offer(JVM)——loadClass和forName区别
先来说一下类的加载方式,一个类被加载出来有两种方式,分别是显示加载和隐式加载:显示加载:loadClass和forName等隐式加载:new隐式加载是通过new一个class来获得类的实例相对于显示加载更加好的地方在于它可以直接调用有参构造。显示调用原则不是很简单当获取到class对象之后需要调用class的new Instance()方法才能获取到类的实例,调用new Instanc...原创 2020-01-21 11:38:02 · 262 阅读 · 0 评论 -
剑指Offer(JVM)——ClassLoader双亲委派机制
不同的类加载器对于类和路径的加载方式是有区别的,并且各自负责各自的部分使逻辑变得更加明确但是需要相互之间的协调工作才可以,如果没有一定的规则和方法就会造成问题,这时双亲委派机制就出现了,它能够使这些类加载器各司其职互不干扰。首选先来看一下双清委派机制原理框图:简要解释一下:类被加载的时候自底向上执行考虑之前是否被加载过,如果被加载过直接返回否则进行第二步;如果没有被加载过,交给AppC...原创 2020-01-20 22:53:16 · 199 阅读 · 0 评论 -
剑指Offer(JVM)——ClassLoader
本文主要说一下一个类从编译到执行的过程,现在有一个普通的Person类。从编译到执行这段时间内,Person执行了三个阶段:编译器将Person.java源文件编译为Person.class字节码文件;ClassLoader将字节码转换为JVM中的Class< Person >对象;JVM利用Class< Person >对象实例化为Person对象。已经了解...原创 2020-01-20 21:19:11 · 192 阅读 · 0 评论 -
剑指Offer(JVM)——反射
Java反射机制是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。接下来举一个反射的例子:创建一个实体类,包含两个有参方法,一个是public修饰一个是private修饰。public class Person { private String...原创 2020-01-20 16:48:21 · 197 阅读 · 0 评论 -
剑指Offer(Redis)——Redis集群管理
如何从海量数据中快速找到需要的数据是在开发中关注的问题。。分片:按照规则去划分数据,分散在多个节点上可以通过使用分片,降低单节点的压力。Redis Cluster采用五中心结构,节点之间使用Gossip协议发送消息,或者发现新的节点,既然Redis目的是将key分布式的放在不同的节点上,这是如何实现的呢???一般会获取到key的哈希值,根据节点数求模值,缺点是无法在一个节点上找到连续的key...原创 2020-01-18 20:39:44 · 302 阅读 · 0 评论 -
剑指Offer(Redis)——Pipeline及主从同步模式和哨兵模式
Pipeline加入使用Redis进行批量生产数据然后存入缓存,一般情况下是上一条缓存存完之后才轮到下一个存储指令的执行,这样肯定会让Redis性能降低,实际上Redis对此情况进行了一定的优化,优化方法就是Redis针对Pipeline的使用:Pipeline和Linux的管道类似;Redis基于请求/响应模型,单个请求处理需要一一应答;Pipeline批量执行指令,节省多次IO往返的...原创 2020-01-18 20:39:23 · 460 阅读 · 0 评论 -
剑指Offer(Redis)——Redis做持久化
文章目录1、RDB持久化2、AOF(Append-Only-File)持久化:保持写状态3、RDB和AOF文件共存情况下的恢复流程4、RDB和AOF优缺点5、RDB-AOF混合持久化方式Redis是一种基于内存存储的非关系型数据库,所以可以保证查询速度很快,但是因为内存数据库所以会导致如果一旦宕机就会立刻失去所有的缓存,于是有了Redis持久化策略,将缓存信息一边存一边写到硬盘上保证数据的存储是...原创 2020-01-18 17:10:56 · 241 阅读 · 0 评论 -
剑指Offer(Redis)——实现异步队列
可以使用Redis的list作为数据类型,使用RPush生产消息,LPOP消费消息,数据结构和对队列是一样的先进先出。演示如下:没有队列消息的时候,return null这种方法的缺点是:没有等待队列里有值就直接消费。对于这个缺点弥补方法就是:通过在service层引入sleep机制调用lpop去重试,不用sleep。另外一种解决方法就是使用blpop加上阻塞seconds,使用后立刻进入...原创 2020-01-18 12:11:31 · 245 阅读 · 0 评论 -
剑指Offer(Redis)——实现分布式锁
分布式锁是控制分布式系统或者不同系统之间共同访问共享资源的一种锁的实现,当不同主机共享了共享某一种资源时候往往通过互斥来除去彼此的干扰来保证一致性。什么是分布式锁?分布式锁需要解决什么问题?互斥性任意时刻只能有一个客户端获得锁安全性锁只能被持有该锁的客户端删除,不能被其他客户端删除死锁获得锁的客户端,出现意外宕机锁无法释放,资源也被永远锁住就出现了死锁容错性客户端...原创 2020-01-17 21:01:35 · 228 阅读 · 0 评论