配色: 字号:
Java整体知识架构详解之基础知识
2020-11-30 | 阅:  转:  |  分享 
  
Java整体知识架构详解-之基础知识演讲人2020-11-2901锁锁P6P5偏向锁P4可重入锁P3自旋锁P2乐观锁P1悲观锁死锁锁ABCD
E轻量级锁重量级锁分段锁cas分布式锁锁死锁多线程会遇到的问题,两个线程同时争抢同一把锁造成死循环锁悲观锁悲观锁认为同一个数据并发
操作一定会发生修改,所以要对一个数据的并发操作加锁,悲观锁是比较重量级的锁乐观锁乐观锁认为同一个数据的并发操作是不会发生修改的,可
以通过版本机制,当更新数据的时候会进行不断尝试修改锁自旋锁自旋锁是指尝试获取锁的线程不会立即阻塞,二是会采用循环的方式不断尝试获取
锁;好处就是减少了线程上下文的切换,缺点是消耗CPU,实际使用还是要根据实际情况锁可重入锁可重入锁指在同一个线程外层方法获取锁后,
内层方法加同一个锁会自动获取锁锁偏向锁偏向锁指的锁的一种状态,当一段同步代码一直被同一个线程所访问的时候,那么线程会自动获取锁,减
少获取锁的消耗锁轻量级锁当偏向锁被另一个线程所访问时,偏向锁会升级为轻量级锁,也就是自旋锁的方式,不断尝试获取,期待另一个线程马上
释放锁锁重量级锁当轻量级锁一直自旋下去到一定时候还没有获取到锁,锁会升级为重量级锁,进入阻塞状态锁分段锁这是ConcurrentH
ashMap在jdk7中用到机制,将数组划分更细颗粒度进行锁控制锁cascas有三个字母分别表示v:想要更新的值,e:预期值,n:
新值,只有当v=e的时候,才会更新值为n锁分布式锁这属于分布式架构的讨论,移步分布式架构->分布式架构解决方案->分布
式锁02Java虚拟机Java虚拟机什么是Java虚拟机内存结构垃圾收集器GCABC垃圾收集算法内存屏障DEJava虚拟机什么是J
ava虚拟机一个可以执行Java字节码文件的虚拟机进程Java虚拟机内存结构0102堆栈030405方法区本地方法栈程序计数器堆存
放java对象的地方,线程公有栈存放临时的局部变量,为线程私有方法区存放静态变量,类的加载信息等,线程公有本地方法栈存放本地方法的
相关信息程序计数器存放程序运行位置记录Java虚拟机垃圾收集器GC概述相关概念0102收集器类型gc类型0304概述负责清除没有引
用的失效对象的java后台线程相关概念并发(Concurrent)指用户线程与垃圾收集线程根据cpu轮询机制交替运行,使得看上去
像同时运行并行(Parallel)充分利用CPU资源,多个任务在多个CPU上各自运行,一个任务会占用一个CPU资源新生代收集器1
2Serial收集器ParNew收集器串行收集器,采用单线程模式,复制算法,进行垃圾收集时会停止其他工作线程(StopTheW
orld)Serial收集器多线程版,和Serial有相同问题3ParallelScavenge收集器并行收集器,通过控制吞吐量
减少停顿时间老年代收集器SerialOld收集器ParallelOld收集器CMS收集器G1收集器老年代收集器SerialO
ld收集器单线程收集器,使用标记整理算法,存在停顿时间长问题老年代收集器ParallelOld收集器多线程模式,使用标记整理算法
老年代收集器CMS收集器概述工作过程优点缺点老年代收集器G1收集器特点内存划分gc类型MinorGC年轻代满是触发,具体值Ed
en代满FullGC当老年代满时触发,会回收年轻代和老年代Java虚拟机垃圾收集算法0102引用计数法标记清除法030405标
记整理法复制算法分代算法引用计数法概念用来表示对象存在一个引用,计数器加1,到计数器为0时表示对象没有引用则可以回收问题该算法
存在循环引用的问题,比如A引用B,B引用C,C引用D,D引用B,当A不在引用B时,其实BCD对象都没存在必要了,但他们循环引用导致
引用计数器不会清零,这部分对象就清理不掉,所以现在基本不用该算法了标记清除法概述对GCRoots可达的对象进行标记,再统一清理
没被标记的对象缺点CMS垃圾收集器就采用了该算法,缺点是会产生大量的内存碎片,会导致后续大对象存储更容易失败标记整理法概述和标记
清除类似,但它对内存碎片进行了整理,将存活对象都移动到内存一端,G1垃圾收集器就使用了该算法复制算法概述复制算法在新生代有广泛应用
,复制算法需要两块相同大小的内存AB,当A内存中存活对象标记完毕,会统一把存活对象复制到B内存块,然后清空整个A内存,如此往复;新
生代survivor的to和from就是代表分代算法这是一个笼统的概称,它将内存根据生命周期划分成年轻代老年代,然后不同的区域使用
不同的回收算法进行垃圾回收Java虚拟机内存屏障概述作用概述每个CPU都有自己的缓存,在多线程环境下工作内存和主内存不能实时进行信
息交换,为了防止指令的乱序和数据错误,有了内存屏障,不同平台实现手段不同,JVM屏蔽了这些差异,统一由JVM来生成内存屏障指令作用
0102防止屏障两侧的指令重排序强制把工作内存中的数据写会主内存,使得信息保持一致03算法和基础概念拜占庭将军问题概述在假设通信不
会被中断且消息可靠的前提下,需要找到一种分布式协议,协调多支军队选择共同进攻还是撤退两军问题由拜占庭将军引申出来的问题,通信兵A和
通信兵B互相通信问题,A发消息通知B后,B回复消息收到了,此时B要确认A收到了我的回复消息,所以A要再发个消息给B表示我收到了你的
回复;但此时A又不确定B是否真的收到了,B还得发确认消息给A,这样会导致消息的不可靠性由拜占庭将军引申出来的问题,通信兵A和通信兵
B互相通信问题,A发消息通知B后,B回复消息收到了,此时B要确认A收到了我的回复消息,所以A要再发个消息给B表示我收到了你的回复;
但此时A又不确定B是否真的收到了,B还得发确认消息给A,这样会导致消息的不可靠性拜占庭将军问题TCP协议由上述两军问题可以看出,
TCP协议就是为了解决这种消息不可靠性产生的;用白话对应就是A发送随机数x给B,B收到后把x+1,在生产随机数y,把两数都发给A,
A收到后确认了B收到了消息,在把y+1返回给B,这样B也确认A收到了消息,这就是TCP协议重点。但它任然不能绝对保证消息可靠性,因
为传输途中不能保证是否被拦截修改内容由TCP协议引申出来还有三次握手和四次挥手gossip协议概述缺点优点gossip协议概述由子
节点发起状态更新,随机朝周围子节点散播消息,收到消息的子节点也会重复该过程,直到所有节点都收到消息;这过程会有一定时间延迟,理论上
节点越多延迟越高,这是一个最终一致性协议gossip协议优点扩展性好,允许网络任意增加减少节点容错性好,网络中任何节点的宕机和重启
不会影响gossip消息传播去中心化,避免了把压力都堆积到中心节点一致性收敛,消息传播速度快,消息是以指数形式传播,以一传十十传百
这样,传播速度达到logN协议实现较为简单,复杂性低gossip协议缺点消息有一定延迟,不使用在实时性要求极高的场合消息冗余,根据
gossip协议,一个节点向周围传播消息可能会使一个节点收到多个节点的消息传播Raft算法概述共识算法,对拜占庭将军问题简化,假设
没有叛军,但信息可能传递不到,有Follower,Candidate,Leader三个角色,通过一个随机时间倒计时的选举模式进行选
主,获得票数过半选举成功04Java基本数据类型Java基本数据类型P6P5floatP4intP3charP2shortP1bo
oleanbyteJava基本数据类型longdoubleJava基本数据类型byte1字节Java基本数据类型boolean1字
节Java基本数据类型short2字节Java基本数据类型char2字节Java基本数据类型int4字节Java基本数据类型flo
at4字节Java基本数据类型long8字节Java基本数据类型double8字节05常用Set常用SetHashSet不要以为是
新的数据结构,该方法的内部实现原理实际用到的是HashMap06常用List常用ListArrayList数组实现,擅长查询Lin
kedList链表实现,擅长增删改CopyOnWriteArrayList并发情况下,读场景远远大于写场景的时候使用,它的写场景会
复制一份相同的数组去这备份数组去写,读写互不干扰,所以读更快,且会更耗内存07常用MapHashMap线程不安全的,在不用考虑线程
安全的情况下推荐使用结构为什么数组长度总为2的n次方扩容hashtransferHashMap结构数组加链表的结构HashMap扩
容参数中有个默认的负载因子0.75,表示数组占用超过这个比值就会进行扩容变为原来2倍HashMaphashhashmap的key值
存放在数组的位置是根据key的hash值的高16位和低16位进行异或运算HashMaptransfer重哈希,在数组扩容后数据重新
hash计算进行数据复制移动的过程HashMap为什么数组长度总为2的n次方优化取模速度,当长度为2的n次方时,h&(le
ngth-1)等于h对length取模,而与运算会比直接取模块不同的hash值发生碰撞的概率会比较小,尽量使数据在table中均匀
分布常用MapConcurrentHashMap线程安全且高效的,jdk1.7使用segment分段锁机制,jdk1.8时改用ca
s无锁机制,锁的颗粒度更细了常用MapHashTable线程安全但效率不高,基本没人用的,全程sychronized同步锁08Ja
va多态Java多态Overload重载同一个类中方法名相同,参数列表不同,体现了一个类中方法的多态Override重写子类可
以重写父类的方法并进行覆盖,体现了对象实现方式的多态09源码分析源码分析常用设计模式设计原则源码分析常用设计模式Proxy代理模式
Factory工厂模式Singleton单例模式Delegate委派模式原型模式策略模式源码分析常用设计模式模板模式适配器模式01
02装饰器模式观察者模式0304Proxy代理模式静态代理将对象A作为对象B的私有引用对象,由对象B代理细化对象A的实现,比如你
要相亲(动作),你妈代理了这个动作,帮你找媒婆,打听情况等等(前置动作),再把你推出去相亲(你执行动作),相完亲你妈还要各方打听你
们两合不合适,对方父母怎么看等等(后置动作)动态代理运行时代理,aop实现的核心,jdk动态代理需要对象有接口存在,原理是通过反
射;cglib动态代理是通过类的继承创建子类来代理实现Factory工厂模式简单工厂模式一个工厂创建多种实例,耦合度高,每加一种
实例需要修改原方法抽象工厂模式需要对工厂进行更高维度的抽象,也就是创建工厂的工厂,比如生产球的工厂接口,继承接口有生产篮球厂接口
,生产排球厂接口等等,各自工厂实现生产不同球这个过程;当要新增一个乒乓球工厂的时候,只需要继承生产球工厂的接口,实现对应生产方法就
行Singleton单例模式饿汉式登记式程序启动,立即加载,线程安全的非正式的称呼,取对象的时候初始化,并放入map容器中,第二次
直接从map中获取3124懒汉式枚举式需要用到时才加载,可能导致线程不安全,需要注意改造基于枚举可以实现单例,因为枚举可以保证只有
一个常用设计模式Delegate委派模式核心就是Leader干的事情,实际不是Leader在干,类内部有其它类实现了相同接口,Le
ader委派给员工类去实现对应的功能,但表面看起来像是Leader在干原型模式浅拷贝深拷贝实现方法基本数据类型直接赋值,引用数据类
型进行引用传递,也就是内存地址的传递基本数据类型复制过来,引用数据类型对象也进行复制对象实现Cloneable接口,若对象内成员变
量有对象也要拷贝,也需要实现Cloneable接口通过序列化也可以实现拷贝常用设计模式策略模式抽象策略接口,通过不同的实现类实现不
同层面的相同功能,例如支付可以抽象一个支付方法的接口,其实现可以是支付宝、微信、网银等等,这就是不同的策略常用设计模式模板模式父类
实现抽象方法,延迟到子类实现,或者直接传入接口,由其实现类或实现方法去具体实现;比如JdbcTemplate中就用到了模板模式适配
器模式对象适配器类适配器接口适配器通过继承适配类进行实现通过引用需要适配的类,进行组合实现通过抽象类来进行适配常用设计模式装饰器模
式通过继承或引用对原有对象进行添加附加责任常用设计模式观察者模式常用于监听模式,一个对象发生变化会使多个对象得到通知源码分析设计原
则030201里氏替换原则(LSP)开闭原则(OCP)单一职责原则(SRP)060504迪米特原则(最少知道原则)依赖倒置原则(D
IP)接口隔离原则(ISP)源码分析设计原则合成/聚合复用(CARP)设计原则030201里氏替换原则(LSP)开闭原则(OCP)
单一职责原则(SRP)060504迪米特原则(最少知道原则)依赖倒置原则(DIP)接口隔离原则(ISP)设计原则合成/聚合复用(C
ARP)设计原则单一职责原则(SRP)定义一个类,应该只有一个引起它变化的原因,该原因就是职责设计原则开闭原则(OCP)对扩展开放
,对修改封闭设计原则里氏替换原则(LSP)任何基类可以出现的地方,其子类一定可以出现设计原则接口隔离原则(ISP)使用多个隔离的接
口,比使用单个接口好,可以降低类间的耦合性设计原则依赖倒置原则(DIP)要求调用者和被调用者都是依赖抽象,两者没有直接的关联和接触
,一方变动不会影响另一方,强调了抽象的重要性。一句话就是依赖于抽象而不依赖于具体设计原则迪米特原则(最少知道原则)一个实体类尽量少
的和其它实体产生依赖,使模块功能独立设计原则合成/聚合复用(CARP)类的继承导致的耦合性也会比较高,比如父类接口增加一个方法,会
导致所有子类编译出错;但如果只是通过组合聚合,引用类的方法,就可以降低风险,同时实现复用10volatilevolatile概述当
一个变量被volatile修饰时,它会保证修改的值立即被更新到主内存,保证其它线程课件性质可见性,见概述不能保证原子性0103
有序性02防止指令重排序11JMM(Java内存模型)JMM(Java内存模型)主内存工作内存Happens-before存放静态
字段、实例字段、数组元素等(线程公有)存放局部变量和方法参数(线程私有)JMM模型规定了指令执行顺序,避免一些操作在工作内存改变变
量后不能及时刷新到主内存,使其它线程不可见12SpringSpringIOC依赖注入,本质是通过Spring帮你实例化对象并存储在
容器中帮你管理Bean,当需要使用的时候进行对象注入SpringAOP使用JDK动态代理或CGlib动态代理对需要进行切面处理的对
象进行代理SpringApplicationContext是BeanFactory的子类,提供更多功能,比如AOP特性,载入多个上
下文;容器启动时立即加载所有BeanSpringBeanFactory负责Bean配置文档的读取,bean加载,实例化,维护Bea
n之间的依赖关系;采用延迟加载SpringSpringBean初始化过程1.实例化BeanFactoryPostProcesso
r实现类3.实例化BeanPostProcessor实现类5.执行Bean的构造器2.执行BeanFactoryPostPr
ocessor的postProcessBeanFactory方法4.实例化InstantiationAwareBeanPostP
rocessor的postProcessBeforeInstantiation方法6.执行InstantiationAwareB
eanPostProcessor的postProcessPropertyValues方法SpringSpringBean初始化过程
7.为Bean注入属性8.调用BeanNameAware的setBeanName方法9.调用BeanFactoryAware
的setBeanFactory方法10.执行BeanPostProcessor的postProcessBeforeInitial
ization方法11.调用InitializatingBean的afterPropertiesSet12.调用bean中in
it-method指定的初始化方法SpringSpringBean初始化过程CAB13.执行BeanPostProcessor的
postProcessAfterInitialization方法14.结束后,调用DiposibleBean的destory方法
15.调用bean的destory-method指定的方法SpringBean的作用域12singletonprototype
单例,无论多少请求Bean实例只有一个,由BeanFactory维护与单例相反,每个请求提供一个实例,是多例的34requestS
ession每一个客户端请求创建一个实例,请求完成后失效回收每一个会话有效期内保存一个实例,会话过期后失效,通常情况是用户登录开始
算,到期后session失效需重新登录13Java8StreamJava8Stream对一串数据流Stream的各方面处理mapfiltersortedforeachCollectorsJava8StreamFlatMapReduceParallelJava8Streammap转换Java8Streamfilter过滤Java8Streamsorted排序Java8Streamforeach遍历Java8StreamCollectors02summarizingInt统计数量,最大,最小,平均,总和01averagingInt计算平均值Java8StreamFlatMap对象的多级处理,对象包含对象无线包含,流式处理Java8StreamReduce将多个元素组合起来得到一个元素,多元素的复杂操作14MySQLMySQL15TCP和UDPTCP和UDP16关于String关于String17JDK常用工具JDK常用工具18网络七层协议OSI网络七层协议OSI19JVM类加载机制JVM类加载机制20类加载器类加载器21httphttp感谢聆听
献花(0)
+1
(本文系职场细细品原创)