牛码社
2024-10-05 14:51:48 0 举报
AI智能生成
牛码社
作者其他创作
大纲/内容
稳定性的衡量标准:服务年度可用时间,我们定义自己4个9,达到具有故障自动恢复能力的可用性
稳定性标准
造成稳定性出问题的因素: 1. 服务本身 2. 宿主环境机器集群和机房等3. 上游输入异常 4. 下游服务或资源异常
影响因素
1.用户接口/后台接口2.经常变化/稳定不变3.核心的/非核心非主流程4.CPU密集/存储密集
架构隔离梳理
目的:做好架构隔离、为异常处理和监控告警做准备
setnx的问题:如果客户端A加锁成功,但还没同步到从库,主库挂掉了,主从切换,客户端B从从库加锁也成功了。
分布式锁2个指标:1.安全性,加锁能成功;2.活性,锁可以失败,但是不能不可预期;
redlock:同时给多个实例加锁,超过一半算加锁成功。都是在客户端实现,在服务端想保证比较难。
分布式锁
技术链路:1. 分布式锁做分布式互斥-;2. 库存redis执行decr 3. 如果> 0 -> mysql乐观锁扣减库存4. ->插入任务(uid_configid唯一键)5. ->失败重试
绑定/领取
MySQL兜底数据
redis查询任务列表
不同业务线限流,保障顺风车首页,比如保险业务要限流
查询
架构中的engine部分,MQ->规则模块->数据更新与双删->action下发
任务流转
核心链路梳理
服务梳理、分级
场景1:体检:容量管理和性能管理
场景2:急诊:定位问题告警和性能分析
好的监控系统:关注于整体应用的 SLA、关联指标聚合。 把有关联的系统及其指标聚合展示。主要是三层系统数据:基础层、平台中间件层和应用层;快速故障定位。 对于现有的系统来说,故障总是会发生的,而且还会频繁发
一些无法察觉的变化,比如发券引起的呼叫量激增,通过增加复合曲线来解决
优化
cpu.idle 全局空闲占比,10秒采集一次, top -b -d 10|grep Cpucpu.loadavg.5 5分钟平均活动进程数 cat /proc/loadavg
CPU
cat /proc/meminfomem.total 所有可用RAM大小mem.cached 高速缓存占用RAM大小mem.free 可用RAM大小mem.used 已使用RAM大小
MEM
cat /proc/net/sockestatnet.sockets.used 已使用所有协议的socket数量net.tcp.timewait 等待关闭的tcp连接数
NET
disk.capacity 所有分区容量大小 syscall.Statfs()disk.inodes.used.percent 某个分区的inode使用率io.await 某块磁盘单词读写操作平均耗时
DISK
基础指标
端口监控
nginx 访问、错误php-fpm 错误RPC调用日志业务处理日志
日志监控
请求量、平响、成功率、失败率
API监控
mysql:写入、读取、主从延迟redis:访问耗时、访问次数mq:积压、消费错误率
资源监控
活动数据:绑定、流入、完成、发放、以及失败复合数据:活动与交易大盘复合数据
数据监控
指标与报警
监控、告警
机房故障,切流
降级后能减低多少负载,15%
非主要数据不获取,在api侧组装数据时,停掉这些数据的获取
好友、附近车主的任务奖励排名降级掉,不再展示
批量则不允许跳过
比如反作弊服务,手动领取如果一直超时或者失败率过高则自动熔断,911可配置
DOS系统不可用,限定里程的订单任务不可用
券系统熔断,如果券系统故障或者超时严重,不再展示券信息
熔断
业务降级
需要扣减等,直接限流到MySQL的流量限制600qps,目前业务最大qps也能满足
绑定
缓存超时,各个地方的超时累计会增加100ms左右,防止都打到db,也需要限流增加fusion数据源,牺牲一些一致性保证整体稳定
redis降级
任务领取限流(配合秒杀来讲)
限流
publiclog降级:暂停写
磁盘告警
漏桶、令牌捅:https://gocn.vip/topics/11108
令牌捅、漏桶对比:https://xie.infoq.cn/article/4a0acdd12a0f6dd4a53e0472c漏桶的本质是总量控制,令牌桶的本质是速率控制。至于这个控制,你可以用来保护自己,也可以用来保护别人。如果在秒杀、抢购、整点打卡签到、微博热点事件这些业务场景用令牌桶的话,会出现大量用户访问出错,因为请求被直接丢弃了;而用漏桶的话,处理可能只是会慢一些,用户体验会更好一些,所以我认为漏桶更适合“突发流量”。
令牌桶支持突发流量和漏桶不支持:令牌桶的前提是你能承受突发流量但是要人为限流。漏桶是你无法承受突发流量所以无奈只能强制限流。比如网络中使用令牌桶,光纤网络可以承受 10Gbps 的速度,但是因为你宽带套餐只给了 100Mbps,所以用令牌来限制你长期使用网络的速度。如果只是临时传个文件,就可以短期突破限制。如果是长期占用,就限制住。又比如,如果网络是根烂网线,只能承受 100Mbps,然后你又选了 100Mbps 的套餐,那就得用漏桶来限制输入速度,否则输入太快会被网卡丢弃掉。如果你要互相类比的话,令牌桶是允许爆发流出,而漏桶是允许爆发流入。
突发流量
对于数据方面的降级,需要前端程序的配合。一般来说,前端的程序可以根据后端传来的数据来决定展示哪些界面模块。比如,当前端收不到商品评论时,就不展示。为了区分本来就没有数据,还是因为降级了没有数据的两种情况,在协议头中也应该加上降级的标签。
降级
外网访问不到
预发布
外网可以访问
小流量
小流量与预发布
预案
级别:接口->服务级别->机器级别->集群级别->机房级别
放火
redis,对key特殊处理,加shadow后缀,过期时间短,防止容量暴涨影响线上业务mysql用shadow表压测流量日志全写入单独日志;外部服务mock账号
数据隔离
哨兵压测->子系统压测->全链路压测
压测
演练
1.网络层2.应用层3.数据层4.中间件
系统分层
1.本机房调用,不要跨机房调来调去的2.单元化,数据分片和一致性问题3.数据同步
挑战
1.同城容灾2.日常分流、演练、防火、小流量
目的
只有核心业务双活
1.节点挂机器,新增ip列表2.依赖服务部署3.依赖模块部署4.存储服务白名单5.路由配置与nginx配置变更6.小流量与全量
用cityid,没带的默认走ys在router上配置city_id分流
router/inrouter分流和切流
双活改造计划
机房故障:DSI流量切流
机房级别:同城双活
技术评审、CR等
预防新问题引入
增量问题
分级监控报警机制,及时、准确、自动发现异常,及时止损,快速恢复
存量问题
技术侧稳定性
配置类全部Apollo收敛等
系统容量-自身容量预估
系统容量-上下游容量预估
运营活动尽量扩容,配合限流
限流预案
降级预案
业务侧稳定性:事前
值班、盯盘
业务侧稳定性:事中
复盘,经验沉淀
业务侧稳定性:事后
专项应对:大促稳定性整体思路
7 电商稳定性专题
封装、面向接口编程、同时也符合OCP原则
原则
借助Spring的bean管理注册
采用工厂提取获取策略
对策略key进行二次封装定义
一个策略接口定义、有若干个策略实现,一个使用类、接口多个实现的类,引用一个策略的实例
实现
利用此模式解决了不同策略隔离和封装,调用执行与算法策略细节逻辑解耦,多态在执行过程动态选择
优点
服务内需要暴露所有的细节给使用方感知
缺点
com.orangecy.strategy.StrategyFactory
对应猎豹代码位置
JUC包中compare()方法
web中 servlet httpservlet使用了
使用场景
策略模式
封装变化
一个状态接口,定义所有可能引起状态变化的方法,多个具体状态实现状态接口,目标类会持有所有状态的对象,目标类会记录当前的状态,方法会调用当前状态的方法,状态改变可以在目标类,也可以在状态类
与策略模式非常类似,但是其目的不同,策略模式在于对策略算法的选择,一般只持有某一个策略,对于客户端来说不知道选哪个,而状态模式在于状态切换,包含了所有的状态
对于状态流转的系统,状态模式将不同的状态的不同行为隔离开,并且封装起来,提高了系统的弹性,对于新增状态可控
系统结构和实现复杂
OCP原则支持不够好,在新增状态时需修改负责状态转换的代码
com.orangecy.state.ElectricLightContext
涉及到状态流的业务可使用
Context 上下文状态 重置可使用
状态模式
他的每一个processor只能对本processor操作对象范围生效、无法指定其他的processor
定义
和策略模式区别
com.orangecy.processor.ItemPublishService
processor模式
一个请求 由一系列节点处理 满足条件的节点有责任,负责处理请求,对client不需要care一些detail
核心区别,责任链的node模式 他的处理器node只能对这次的请求做出处理 或者 不处理(交给下一个处理器对象) 。。。 foreach node
和processor区别
责任链模式
通道执行模式
满足OCP定义,class/method/object 对外扩展开放,对修改关闭
定义抽象公共接口,每一个具体的类拥共享对象的实例
可以在你不想改变原有的class/method的前提下,扩展类的能力,OCP,实现多个不同的功效
这样的叠加功效 很难一眼看清楚整个的关系结构
一般来说,比原有的继承方式的 相对来说符合OCP 更不易暴露
com.orangecy.decorator.AbstractLbDecorator
对应猎豹代码的位置
装饰者模式
为交互对象间的松耦合设计代码
一个被观察者接口,若干被观察者实现,可以新增,删除,通知观察者,若干观察者实现,每个实现持有一个被观察者实例
观察者和被观察者之间松耦合,彼此不侵犯对方的逻辑
当有较多观察者时,通知很麻烦
被观察者可能出现循环依赖
观察者不知道被观察者如何变化
观察者模式
依赖抽象,不要依赖具体 DIP
开闭原则
一个抽象的工厂类,创建一个抽象的类,子类继承抽象工厂类,实现具体的创建对象逻辑
使用类时,直接使用具体的工厂类创建即可使用,同时,没有依赖具体的类,创建时可以没有具体的类
每增加一个具体产品就需要给该产品提供一个具体工厂类,当产品较多时类个数成对增加
工厂方法模式
依赖倒置
一个产品集工厂抽象类,用于生产每个小的产品抽象类,每个小的产品通常是一个工厂方法,多个小的产品,利用组合造出最终产品
可以快速扩展不同生产产品集的工厂
只能作用其中子实现不会变得场景,当子集经常变化时,抽象工厂就必须改变每个工厂的实现
抽象工厂模式
最少知识原则,不和内部交谈
一个目标接口一个适配器实现目标接口,同时组合进一个源接口,将源接口行为转换为目标接口的样子
实现
使原本不兼容的接口可以兼容,又不改变原有的类
无法使用多重继承实现类适配器
不太容易置换掉待适配类的方法
适配器模式
好莱坞原则,别调用我们,我们会调用你,上层接口调用下层接口
一个算法抽象类定义算法框架,定义几个需要子类实现的抽象方法,子类实现抽象方法
算法的实现有一个统一收口,算法更改时更简单
变化的部分放到子类,提高扩展性
每个具体实现都要一个类,子类的个数可能较多
com.orangecy.template.AbstractCooking
模板模式
让命令发送者和命令接收者完全解耦
子主题 1
降低了耦合度
如果说新增命令不会影响之前的已经存在的发送者和接受者以及命令之间的协同
你会发现,如果关系比较简单的话 其实会增加很多冗余的类,毕竟多了一层命令的概念,可能需要定义大量的命令类
com.orangecy.command.TransmitTeaCommand
命令模式
类应该只有一个改变的理由
一个迭代器接口,定义了是否遍历完,取下一个元素的方法,为一个集合提供迭代器实现,需要遍历元素时,获取迭代器即可,不需要知道集合具体实现
遍历时无需知道集合集合具体实现,封装了内部实现。将类的其他控制与类的遍历分开,保持类的srp 单一职责原则
增加新的聚合类就需要增加对应的迭代器,一定程度增加了系统复杂度
com.orangecy.iterator.LbFensIterator
迭代器模式
将类和它的聚合类实现同一个接口,接口中分别包含两个类的方法,客户端看起来一致。展示树形结构,叶子节点和非叶子节点用同一个接口表示
简化了客户端的复杂度,在客户端看来是一致的接口
组合中,有些方法对于某些节点是无效的,可能造成不易理解,有时候需要折衷考虑是维持透明度还是牺牲透明度增加可理解性
com.orangecy.composite.MenuComponent
组合模式
每个class/method/service/pod只负责一个职责
com.orangecy.principle.srp.LbAction
单一职责SRP
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
com.orangecy.principle.isp.BoyLbFens
接口隔离ISP
一个class/module对另一个class/module的依赖应该建立在最小的接口上,依赖倒置,高层模块不应依赖低层模块,细节不应该依赖抽象
子类应该做到替换父类,以及子类尽量减少重写父类的方法
六边形架构
com.orangecy.principle.lsp.FensDiscount
里氏替换LSP
最少知道原则,简单理解就是一个对象对其他对象最少知道,可以理解城府比较深
com.orangecy.principle.lod.LowerCoder
迪米特法则LOD
一个类使用另一个类的代码、方法,尽量使用合成、而不是继承
com.orangecy.principle.crp.DbDriverEngine
合成复用CRP
封装,修改
com.orangecy.principle.ocp.LbFens
开闭原则OCP
设计模式原则
6 设计模式总结
RIP
OSPF
路由选择
UDP协议
三次握手
四次挥手
time_wait状态是什么
TCP协议
常见的code码含义:500 502 400 404 200 301
http请求包括哪几部分,比如header
http总共有哪几种协议版本,1.0和1.1的区别
post请求的body体有数据大小限制吗
GET,POST,PUT,DELETE,OPTION,PATCH中哪几种是幂等
HTTP协议
IP地址与物理地址如何相互转化?路由表?为什么不直接使用物理地址来标识一台计算机呢
IP协议
ARP & RARP协议
DNS实现原理
CRC
差错校验算法
计算机网络
进程调度算法
进程间通信
生产者消费者问题
死锁
内存
缓存
常见的linux命令:ls top jps jstack jmap tcpdump
复杂参数命令的提问:shell、awk等
Linux基础操作
文件系统
描述下线程和进程的区别
操作系统
一个打印“Hello World”的程序,从磁盘到最终结果输出,经历了哪些过程。
考察递归程序编写
设计一个防止内存泄漏的方案
手写一个字符串相关的(strcopy)系统函数
C语言
C++语言
值传递特性
基本数据类型--有符号
String的不可变特性原因
qa的返回值为什么不能做为签名的一部分,举个例子说明
方法签名
Java多态是如何实现的
Object类中的基本方法
Java集合框架
抽象类和接口的对比
泛型
注解
异常框架
线程&线程池
JVM基础知识
Java语言
正则表达式
脚本语言
编程语言特性
描述第一范式、第二范式、第三范式内容
事务隔离
分布式事务
事务
索引哪些数据结构
B+树 B树 区别
B+树 和 hash索引的优劣
索引
分页
子查询
join
统计
sql编写能力
sql调优经验
基本类型(如int)表示的范围,基础类型int对应java中的类型
分层结构、mvcc等概念
数据库
排序算法 快排/冒泡/归并/堆排
树 二叉树/B树/B+树/红黑树
队列/栈/堆
kmp
动态规划
贪心算法
图论
双指针、滑动窗口
一致性hash
位图
进阶
数据结构&算法
集合框架的接口层次图描述或画一下
ArrayList和LinkedList区别描述一下
多线程对ArrayList和LinkedList做增删改查,程序里可能会有什么后果
HashMap底层怎么实现的
HashMap初始默认值是什么
rehash过程中,如果多个线程来操作hashmap可能会有哪些后果
HashMap被多线程操作出现死循环时,服务器CPU有什么现象
HashMap的rehash过程描述一下
什么是红黑树,有什么优点和缺点
JDK1.8后 HashMap什么时候会转成红黑树
JDK1.8后 HashMap有什么改进
JDK1.8后 HashMap什么时候变为链表
Map接口的实现中,哪些实现key可以放null,哪些实现value可以放null
集合
双亲委派有什么好处,为什么是双亲而不是单亲
你见过不遵循双亲委派模型的类加载实现吗
双亲委派模型是如何工作的
一个class文件被不同的classloader加载到内存实例化,它们是同一个对象吗
类加载
为什么要分代,分代有什么好处
描述下JDK1.8前后的堆分代模型
一个对象如何在堆中流转
描述下几种GC的几种回收算法
young区会有STW吗?为什么
stw对应用什么有什么不好的影响
你的java应用中,一般怎么选择GC搜集器
描述下CMS和G1的区别
GC
线上OOM怎么解决
线上服务不可用怎么处理
线上CPU100%呢
java中,一般哪些地方容易出现内存泄露
线上问题处理经验
描述下java线程状态机
sleep()会使线程进入什么状态
实现线程的方式有哪几种
常用线程池有哪些,有什么异同
描述一下syncronized的工作原理,为什么是可重入的
描述下reentrantlock工作原理
线程
volatile有什么作用
volatile如何实现内存可见性
Java
IOC作用
IOC底层使用什么数据结构实现的
IOC
AOP作用
AOP和面向对象区别和联系
AOP如何实现的
描述一下动态代理和静态代理的区别
动态代理有哪些实现方式
JDK代理和Cglib动态代理有啥特点,应用场景区别
JDK和Cglib具体如何实现
AOP
Spring的bean有哪些scope
如果能,需要怎么做
如果不能,为什吗
生命周期短的bean能被生命周期长的bean引用吗
Bean的scope
Spring
一个电商购物系统,访问量每天呈指数级增长,你可以做哪些事情来满足这种流量快速增长的业务。
一个web系统,一直正常服务,突然有一天这个系统变得不可访问,你觉得可能是什么问题导致的。
有两个系统A和B,A系统会产生交易数据,每秒钟会生成1万条交易数据,B系统负责处理A系统的交易数据,每秒钟能接收5千条交易数据。那么如何设计才能让A系统与B系统配合顺利完成任务。
你怎样重新改进和设计一个ATM银行自动取款机?
设计一个高效的分布式爬虫系统来抓取互联网上关于汽车相关的内容
"喜欢这个的人也喜欢...",如何在一个电子商务商店里实现这种功能?
如何在一个不可靠的协议之上构建一个可靠的通信协议?
如果解决分片数据库热点倾斜问题?
设计类
代码中的注释有什么用?
什么情况下缓存是没用的,甚至是危险的?
横向扩展(scale out) vs 纵向扩展(scale up): 有什么区别?分别在什么场景下使用?
什么场景下你会在两个系统中采用异步通信机制?
什么是好的代码?
解答类
开放式题
Redis
MQ
dubbo
apollo diamond
hbase
ES
加分题
5 应届校招必考范围
v : lyfinal
8 加入社区
让生活更精彩
答
1 学习编程的目的?
系统培训
掌握学习体系
2 学习编程最快的办法?
全站工程师
3 职业规划?
能灵活运用
能随时想起
能随问随答
4 一个技术点怎样才算学会?
跨平台
5 Java有什么核心优势让其流行?
SE
ME
EE
6 Java的三个版本?
SUN
7 Java是哪个公司发明的?
客户端安装虚拟机
一次编译生成的class字节码文件,不同系统安装的Java虚拟机都能运行
8 Java的跨平台是通过什么实现的?
编译型
Java源代码文件需要通过编译器编译成Class文件才能被虚拟机执行
9 Java语言是解释型还是编译型?还是两者都是?
Java开发工具包
发展
Develement
配套元件
Kit
单词解释
Java Devlement Kit
JDK
Java运行环境
运行时间
Runtime
环境
Environment
Java Runtime Environment
JRE
Java虚拟机
虚拟
Virtual
机器
Machine
Java Virtual Machine
JVM
10 JDK、JRE、JVM的全称是?
对
安装了JDK的目录下有jre运行环境文件夹
11 JDK包含JRE对吗?
Tab键
12 DOS下,自动补齐的命令按键?
显示当前目录
DIR
进入目录
CD [当前目录下的文件夹名称]
比如
CD
13 DOS下,DIR命令含义?CD含义?
如果重新更换了JDK版本,则只需要修改JAVA_HOME的值为新的JDK地址就可以
14 为什么采用JAVA_HOME的方式配置环境变量比较好?
是
一个Java源文件中有且只有一个被public关键字修饰的class
15 public class 的类名必须跟文件名保持一致吗?
可以写多个class
编译后会生成对应个数的class字节码文件
需要注意的是源文件中只能有一个类被public关键字声明,并且这个类的名称必须和Java源文件名称一致
当一个Java源文件中有多个class类的时候,所有导包操作必须写在源文件开头
16 一个Java源文件可以写多个Class吗?编译后是否会生成多个Class字节码?
方便自己和他人缕清思路
更方便修改
这是程序员最基本的素养
当别人接收我们的项目的时候才不会两眼一抹黑,什么都看不懂
注释不会影响程序的编译和执行
17 编程为什么需要注释?
单行注释
多行注释
文档注释
分为三种
18 Java中的注释类型?
不可以
19 多行注释能嵌套执行吗?
理论题
第一章 初识Java
0-9
十进制
0-8
八进制
0-1
二进制
0-9 A-F
十六进制
1 常用的进制?
将要转换的10进制数除以2得到余数,直到余数为0,将得到的所有余数倒序排列即为二进制数
2 将10进制转换成2进制
计算机中最小的计数单位
位
一个字节为8位
字节
一个英文字符占2个字节
一个中文字符占4个字节
字节的组合
字符
3 位、字节、字符的概念及其计数范围?
1 类
2 对象
3 方法
4 变量
5 接口
6 自定义数据类型
给左侧数据类型命名
4 标识符的作用?
不合法
变量名称中包含特殊字符@
变量命名只支持大小写英文字母、阿拉伯数字、下划线、美元符
理由
5 这个标识符合法吗?:int aaa@bbb = 33;
不能
变量不能使用汉字
6 标识符能用汉字开头吗?为什么?
没有goto语句
但是JVM虚拟机并不对该关键字进行开放使用
仅仅作为保留的关键字
有goto关键字
7 Java中有没有goto语句?有没有goto关键字?
1
byte
2
short
4
int
8
long
8 byte,short,int,long类型,分别占用的字节数?
9 整型常数默认的类型?
float
double
10 float,double分别占用的字节数?
314 * 10^-2
11 科学计数法表示3.14?
byte b = 30;
错误
byte占用一个字节
byte c = 500;
long d = 2343223;
float f = 3.14;
12 左侧哪些写法是不对的?
计算机对浮点数值不能准确表示,有误差
13 浮点数能用于比较吗?
d1 == d2
图片【2017-04-07_113844】
14 左侧图片输出哪句话?
15 字符型占用字节数?
不对
incompatible types
类型转换错误
编译错误
16 这种写法对吗?: char c = 'd';
1位
布尔型只存储0或1
原因
17 布尔型变量占用空间是一位还是一个字节?
不好
不需要==true
当b为整数类型
当b为布尔类型
以上两种情况写==true都不会有问题,但多此一举
18 这种写法好吗?:if(b == true)
不可改变
final
final int A = 10;
final float PI = 3.1415926F;
常量使用大写
19 声明常量的关键字?
全部大写
20 常量命名规范?
变量名称开头大写,余下部分首字母大写
int AppleNumber = 150;
String FactoryAddress = '西三旗';
21 什么是驼峰原则?
要
Java默认导入java.lang.*;
Java不默认导入java.util.*;
22 使用Scanner接收键盘输入,一定要加 import java.util.*; ?
驼峰原则
所有单词首字母都大写
23 类名的命名规则?
不一致
开头小写,余下全部单词首字母大写
方法名
全部小写
变量名
24 方法名、变量名的命名规则一致吗?
使用final关键字修饰
25 常量的命名规则?
4个字节
引用类型指的是保存在栈中地址的值
知识普及
26 引用类型占用的字节数?
参考【http://www.blogjava.net/hyperjava/articles/241839.html】
27 什么是算术运算符的类型提升?
Object c = a + b;
System.out.println(c.getClass());
测试代码
28 a+b返回什么类型?:int a = 3; long b = 3;
没有任何区别
单独作为一条语句的时候
先自增后运算
i++
先运算后自增
++i
用在算术运算中时
分两种情况
29 i++和++i的相同和不同之处?
Java不支持这种运算
30 关系运算符中,能这样写吗?:'1<a<3'
逻辑或
中文
true
System.out.println(true & true);
System.out.println(true & false);
System.out.println(false & true);
false
System.out.println(false & false);
当左右两边的操作数有一个为真,则结果为真,否则结果为假
规则
|
逻辑与
当左右两边的操作数都为真时结果为真,否则为假
&
逻辑非
System.out.println( ! true);
System.out.println( ! false);
取反操作(单目运算)
!
逻辑异或
只要两个操作数(逻辑值)不相同,则结果为真,否则为假
^
31 逻辑运算符|、&、!、^的含义和运算规则?
都是比较运算符,返回的结果是一样的
相同
两边都要比较一次
如果左边的为true,则继续比较右边的,然后返回比较结果
相比 | 要效率高
如果左边的为false,则直接返回false
||
不同
32 运算符||和|的异同?
5<<2
33 5*4最快的运算方式?
b34
((1<3)?'a':'b') + 3 + 4;
-1
x = -2; x>0?1:(x==0?0:-1);
34 左侧两个表达式分别返回什么结果?
12
System.out.println('1' + 2);
System.out.println(1 + '2');
当加号两边其中一边出现字符串的时候就成了字符串连接符
35 什么情况下加号会变成字符串连接符?
4&5;
5
4|5;
36 左侧的两个结果分别是多少?
&&为短路与运算符,要求两边的值必须为逻辑值
37 4&&5 的操作对吗?为什么?
当一定条件下能
int 的值范围不能大于byte的取值范围
int转换成byte
int的值范围不能大于short的取值范围
int转换成short
int的值范围不能大于ASCII码表的最大值
int的值不能是负数
int转换成char
能的条件
需要强制转换
long不可以自动转换成int
long不能自动转换成float
39 long能自动转换成int吗?long能自动转换成float吗?
指的是自动类型转换时两边操作数的取值范围
40 自动类型转换中,容量小和容量大指的是?
会发生数据丢失
41 强制类型转换中,可能发生数据丢失吗?
提前转换成容量大的类型,可以避免数据溢出
好
70L * 60 * 24 * 365 * 70 * 20;
70 * 60 * 24 * 365 * 70 * 20L;
42 左侧两种写法中你感觉哪种比较好?
第二章 数据类型和运算符
顺序
条件
循环
1 三种控制结构分别是?
好的习惯是写上{},不论语句有多少
2 如果if语句后面不写{},if的控制范围是否只限于第一句?
Math.random()是获取0-1之间的随机浮点数(小数)
(int)(Math.random()*15 + 5)
3 Math.random()是什么意思?如果想获得15-20之间的随机整数该怎么写?
可以
switch比if else if书写简单
switch比if else if效率高
4 Switch语句的功能是否完全可以使用if else if else 多选择结构来代替?如果可以,为什么还需要switch呢?
char
switch中支持的表达式的类型
返回的结果为与之匹配的等值类型
5 switch中的表达式的结果需要什么类型?
当遇到break语句的时候
6 switch语句中,一个case开始执行后,什么时候结束执行这个case的语句?
不是必须写的,习惯上写上
7 switch语句中,default是否必须写?
图片【2017-04-07_144707】
两个case语句后面使用的是分号不是冒号
case 'y';没有break
8 代码有什么错误?
需要重复执行次数的事
9 循环结构模拟了现实世界中的什么逻辑?
for
先判断后执行
while
先执行一次后判断
需要注意的是while(); 后面要有分号
do-while
还有一种不知道了
10 循环结构的四种内部结构是什么?
先判断条件是否满足,满足就执行
先执行一遍再进行判断条件是否满足,如果满足就继续执行,直到条件不满足则退出
11 while和do while有什么区别?
当循环条件一直满足的时候
while(true){......};
例子
12 什么情况下会出现死循环?写出个例子
for循环可以指定需要循环的次数
13 for循环相比while循环有什么优势?
图片【2017-04-07_145356】
while()后面没有分号
14 代码都有什么问题?
图片【2017-04-07_145541】
最后输出的 i 找不到,因为 i 存在于for代码块中,出了for就不存在了
15 该代码有错误吗?请指出错误
break作用是跳出当前break所处的最近的循环语句
continue是跳出本次循环
16 循环中,break的作用是?continue的作用是?
语句块可以使用外部变量
语句块中定义的变量通常情况下不可以被外部使用
17 语句块能否使用外部的变量?语句块中定义的变量,外部能否使用?
不是必须要返回值类型
可以使用void关键字声明空的返回值类型
18 方法的定义中,是否必须要有返回值类型?如果确实不需要返回值,使用哪个关键字声明?
return为必须要的,而且返回值类型需要和方法定义的返回值类型一致
当方法有返回值的时候
return不是必须的,但是默认会有return,表示结束当前的方法
当方法没有返回值的时候
结束当前方法
作用
19 方法的定义中,return是否必须?它有什么作用?
传递栈中的值
使用值传递
如果是基本数据类型
传递栈中的引用值(地址)
使用引用传递
如果是引用数据类型
20 Java中,参数的传递使用值传递还是引用传递?
形参只有在被调用时才会被Java虚拟机分配内存空间,形参只有在方法内部有效。方法调用结束返回主调用方法后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
区别
21 方法定义中,形式参数和实际参数有什么区别?用自己的话描述
方法定义的时候使用形参
22 方法定义时,使用实参还是形参?
23 定义形参时,必须要写变量类型吗?
必须匹配
24 实参类型是否必须和形参类型匹配?
同一个类中
重载的前提条件
方法名相同
public void print(int a){}
public void print(String a){}
形参类型不同
形参个数不同
形参类型且顺序不同
25 什么是方法的重载?
同一个类中,返回值不同不构成重载
26 返回值不同构成重载吗?
当方法名称相同、形参类型和形参个数相同的条件下,形参名称不同不构成重载
27 形参名称不同构成重载吗?
什么时候不调用自己
递归头
什么时候调用自己
递归体
28 递归算法中,递归头和递归体分别指什么?
思路和代码简单
占用内存多,效率低下
29 递归算法的优点是什么?缺点是什么?
一个问题可以分为若干个简单的子问题
子问题的解决方案和上层问题的解方案一致
外层问题的解决依赖于子问题的解决
30 递归的适用场合?
第三章 控制语句
1 数组的类型可以是任意类型吗?
必须相同
元素有序
下标确定数组元素的位置
2 数组中的元素的类型必须是相同的吗?数组中的元素是有序的吗?
不可变
3 数组的长度可变吗?
length
4 获取数组的长度使用哪个属性?
零到数组长度减一
5 数组元素下标(索引)的范围是?
6 数组也是引用类型吗?
7 数组也是对象吗?
8 数组中的元素就像对象中的成员变量一样,初始化方式也一样,这句话对吗?
图片【2017-04-07_151312】
9 数组的静态初始化代码,该代码有没有不合理的地方?
int a[3][3] = new int[][];
int a[][] = new int[3][3];
int []a[] = new int[3][3];
int[][] a = new int[3][3];
10 左侧的数组定义,哪些是正确的?
int[][] a2 = new int[2][];
int [][] arr2 = new int [][4];
int arr3[][4] = new int [3][4];
11 请在左侧数组定义中找出正确的
1 循环数组长度
2 当前数和后一个数比较
3 如果前一个数大于后一个数,则交换
12 描述冒泡排序的基本思路
13 可变参数的作用和用法是什么?
java Test arg1 arg2 ...
在控制台中输入
14 如何给main方法传递实参?
可以开发Java
开发C++需要继承CDT插件
15 Eclipse可以开发Java,可以开发C++吗?
可以看到程序运行的步骤
可以查看变量变化的值
16 Eclipse中的debug模式有什么好处?
创建一个项目
创建一个包
创建一个类
在类中写代码
运行这个类
17 Eclipse中运行一个Java程序,如何操作?
不用安装Eclipse,直接解压使用
有的版本默认集成JDK,但是集成的JDK版本比较低
一般建议安装JDK
18 Eclipse需要安装吗?使用Eclipse需要安装JDK吗?
第四章 数组
第五章 面向对象
捕获
处理
1 Java中,处理异常的两大步是?
子类在前面,父类在后面
2 如果catch两个异常,一个是父类,一个是子类。这两个异常的catch顺序如何确定?
存放异常发生后必须要进行执行的操作
复制文件的时候,IO流出现异常则必须要进行关闭
3 finally里面一般放置什么代码?
都是异常
联系
严重的错误,导致无法运行或者编译失败
Error
可以在程序运行过程中捕获和处理
程序可以继续运行
程序运行中产生的异常
Exception
4 Error和Exception的区别和联系分别是什么?
是一个类
5 Throwable是一个类还是接口?
使用输出语句进行调试,查看程序运行到哪里了
查看我们定义的变量是否是正确赋值
使用try-catch对语句进行捕获
处理方式
6 如果碰到NullPointException,我们一般应该如何差错?如何做处理?
7 方法重写时,子类声明异常能否超出父类的范围?
第六章 异常机制
基本类型之间不好转换
需要包装类的理由
方便基本类型之间的转换
简化程序员的代码工作量
包装类的作用
1 为什么需要包装类?包装类的作用是什么?
int num = Integer.parsInt('123');
第一种
略
其他方式
2 将字符串“123”转化成基本类型数字的方式有哪些?
3 自动装箱和自动拆箱指的是什么?举例说明
String类型的值存放在常量池中,如果一个String变量需要进行添加方法,那么JVM虚拟机执行的时候是先将第一个值复制一份并添加第二份新的字符串,然后将组合之后的字符串重新开辟一块空间,然后再将引用赋值给当前的String类型变量,但是一开始的String类型变量的值依然存在于常量池中,只是还没有被垃圾回收期回收而已
4 为什么String类被称为不可变字符序列?从String类的源代码分析,给出解释
去除首部空格
去除尾部空格
默认
去除收尾空格
3
trim()方法中支持参数
补充知识
5 String类的trim()方法是什么作用?
urge
6 左侧代码的返回结果是什么?
百度
什么是StringBuilder
什么是StringBuffer
都是对字符串操作的类
StringBuilder是对StringBuffer的简单增强
StringBuffer比StringBuffer先有
StringBuffer是线程不安全的
StringBuilder是线程安全的
7 StringBuffer和StringBuilder的联系是什么?区别是什么?
Sub Topic 1
8 计算机中的时间是如何表示的?
获取从1700年到现在的毫秒数
System.currentTimeMillis();
9 左侧代码表示的是什么意思?
不是
只是定义了一个时间对象而已
10 Date d = new Date()表示的是当前时间吗?
11 File类能代表一个目录吗?
在C盘的Java目录下创建一个新的文件夹
那么这个C盘下的Java目录必须存在
目录必须存在
mkdir
那么这个C盘下的Java目录可以不存在,创建的时候会一并创建Java文件夹
目录可以不存在
mkdirs
12 File类的方法mkdir跟mkdirs,有什么区别?
enumeration
英文名称
JDK 1.5中引入的特性
位于java.lang包中
详情参考博客【http://www.cnblogs.com/hyl8218/p/5088287.html】
枚举
13 什么时候使用枚举?枚举的定义是?
1 String类的equals方法跟Object的equals方法什么关系?详细分析它的内部流程
图片【2017-04-07_170341】
2 分析该代码的结果,并画出内存结构图,针对每个打印的结果给出文字解释
3 练习String类的常用方法
图片【2017-04-07_170626】
4 该代码会造成什么后果?运行期间会产生多少个对象?使用StringBuilder修改这段代码
5 我们使用SimpleDateFormat类来实现时间跟字符串的转化。常用的是哪两个方法?写出代码进行说明
6 将1990年3月3日通过Calendar来表示,并得到这天是该年的第一天?将该日期增加35天,是哪一天?用代码说明
7 写代码测试Date/SimpleDateFormat/Calendar的用法
8 制作可视化的一个日历程序
9 使用File类模拟实现DOS的dir和dir/s命令
10 使用递归算法,完整展示一个目录树
11 手动定义一个枚举,表示十二个月的英文月份
12 switch语句中的表达式可以是枚举吗?写一个例子进行说明
上机题
第七章 常用类
1 容器指的是“可以容纳其他对象的对象”,这种说法对吗?
删除和添加的效率很高
优势
随机访问元素时效率比ArrayList低
链表结构
LinkedList
线性结构
ArrayList
Stack
Vector
List
HashSet
TreeSet
Set
Collection
Hashtable
HashMap
WeakHashMap
Map
ListIterator
Iterator
结构
容器
2 Collection/Set/List的联系跟区别?
3 Set和List的特点跟区别?
4 使用哪个方法获取容器中元素的交集?
Collection c = null; System.out.println(c.isEmpty());
5 说明isEmpty的作用,左侧的代码有问题吗?
get(int index);
6 List接口中增加了一些与顺序相关的操作方法,左侧两个方法的作用是什么?
7 ArrayList底层使用什么来实现的?LinkedList是用什么实现的?
8 说出ArrayList、LinkedList、Vector的区别
9 有一些数据,需要频繁的查询,插入和删除操作非常少,并且没有线程之间的共享,使用List下面的哪个实现类好一些?
10 定义Computer类,使用价格排序。(使用Comparable接口)
11 如果equals返回true,hashcode一定相等吗?
12 HashSet和TreeSet的区别
13 使用HashSet存储自定义对象,为什么需要重写hashCode()和equals()?
14 使用TreeSet存储多个学生数据,如何实现按照不同属性值进行排序?
15 Map中,key能否重复?如果重复,会有什么现象?
16 Set和Map的集合类名称相似,有没有内在的联系?
17 使用泛型有什么好处?
18 采用增强for循环遍历List或者Set,如果List或者Set没有加泛型,能遍历吗?
19 如果我想在遍历时删除元素,采用哪种遍历方式最好?
20 Iterator是一个接口还是类?
21 Collection和Collections有什么区别?
22 资源文件有什么作用?
23 描述Vector和ArrayList的区别和联系?
24 描述Hashtable和HashMap的区别和联系?
25 Java主要容器的选择依据和应用场合?
1 练习Collection接口中常用的方法
3 定义一个数组,该数组既可以放:Dog对象、也可以放Cat对象、还可以放Integer对象,怎么定义?写出测试代码
4 针对List中新增的有关顺序的方法,每个都进行测试。并且使用debug来帮助我们理解程序运行
姓名:张三 年龄:18 体重:90 地址:北京
姓名:李四 年龄:28 体重:50 地址:上海
注意:不能使用JavaBean封装
5 综合使用List,Map容器存放左侧数据,并从map中取出'李四'
6 使用JavaBean封装上述题目
7 写出List、Set、Map中使用泛型的例子
8 用代码写出遍历List的四种方式
9 用代码写出遍历Set的两种方式
10 用代码写出遍历Map的方式
11 在src下建立一个资源文件(不包含中文),尝试使用Property类读取里面的属性
12 使用entrySet方法遍历Map
第八章 容器
1 IO是什么意思?data source是什么意思?
2 字节流和字符流有什么区别?输入流和输出流有什么区别?
3 节点流和处理流有什么区别?
4 word文档能使用字符流操作吗?为什么?
图片【2017-04-07_183924】
5 解释该代码的含义
6 流对象使用完后,一般要调用close方法关闭,释放资源,为什么呢?
7 InputStream和OutputStream的基本特点是什么?
8 Reader和Writer的基本特点是什么?
9 FileInputStream和OutputStream的基本作用是什么?
10 FileReader和FileWriter的作用是?
11 BufferInputStream和BufferedOutputStream的特点是什么?
12 InputStreamReader和OutputStreamWriter的作用是什么?
13 PrintStream打印流经常用于什么情况?System.out是不是打印流?
14 DataInputStram和DataOutputStream的特点是?
15 中文乱码是怎么造成的?
16 Unicode字符集是几个字节表示一个字符?为什么需要utf-8?
17 序列化和反序列化指的是什么?
18 想序列化某个类的对象,该类必须实现Serializable接口吗?
19 说说Serializable接口的特点?
20 transient的作用是什么?
第九章 IO流技术
1 程序、进程、线程的区别是什么?举例说明
2 Thread类有没有实现Runnable接口?
3 当调用一个线程对象的start方法后,线程马上进入运行状态吗?
4 该代码中,实际上有几个线程在运行?
5 sleep、yield、join方法的区别是什么?
6 为什么不推荐使用stop和destory方法来结束线程的运行?
7 A线程的优先级是10,B线程的优先级是1,那么当CPU进行调度的时候一定会先调用A吗?
8 synchronized修饰在方法前是什么意思?
9 synchronized修饰的语句块,是表示该代码块运行时必须获得account对象的锁,如果没有获得,会有什么情况发生?
10 死锁是怎么造成的?
11 wait方法被调用时,所在线程是否会释放锁持有的锁资源?sleep方法呢?
12 wait、notify、notifyAll是在Object类中定义的方法吗?作用分别是什么?
13 notify是唤醒所在对象wait pool中的第一个线程吗?
第十章 多线程
1 什么是计算机网络?网络的主要类型有哪些?
2 常见的网络分层模型有哪两个?哪个更流行?为什么?
3 TCP的全称是?
4 UDP的全称是?
5 请说出TCP和UDP的联系和区别?
6 通过类比打电话,详细描述三次握手机制
7 IP的全称是?IP的作用?
8 IPV4为什么会发生资源枯竭的问题?
9 为什么需要端口?端口真是存在还是虚拟的概念?
10 Java中,端口使用两个字节表示,可以表示多少个端口?UDP和TCP端口是各自独立的吗?
11 InetAddress和InetSocketAddress都封装了哪些信息?他们两的区别是?
12 URL类有什么作用?
13 查资料了解,SNS是什么?
14 如何理解Socket的含义?
15 基于TCP的Socket网络编程的主要步骤是什么?
16 基于UDP的Socket网络编程的主要步骤是什么?
第十一章 网络编程
1 方法内部能不能定义类?
2 说明定义内部类的方式,并说明适用于什么情况
3 普通成员内部类能不能直接访问外部类的普通成员?
4 静态成员内部类能不能直接访问外部类的普通成员?能不能访问外部类的静态成员?
5 什么时候会使用匿名内部类?
1 内部类
1 什么是线程池?
2 线程池的好处有哪些?
3 如何创建一个线程池?常用输入参数的含义?
4 分析线程池的主要工作流程?
5 如何监控线程池?
1 完成一个简单的自定义的线程池,对线程池底层原理更加熟悉
2 写一个线程池的调用代码
2 线程池
1 什么是设计模式?
2 设计模式的优点?
3 23种经典的设计模式有哪些?如何分类呢?
4 面向对象的设计原则有哪些?
5 开闭原则的含义和实现?
6 依赖导致原则的含义和实现?
7 结合JavaIO流体系说明装饰模式
8 结合InputStreamReader类说明适配器模式
9 选择一个你熟悉的设计模式进行介绍?
3 设计模式
第十二章 其他部分
1 什么情况下需要使用反射?
2 Class类的作用及其主要功能?
3 如何使用反射创建一个对象?
4 如何使用反射操作属性?
5 如何使用反射执行方法?
6 反射的优点和缺点分别是什么?
第十三章 反射技术
1 正则表达式是用来做什么的?用自己的话进行描述
\\d
\\w
\\s
[1234]
[^a-f]
{}
?
+
*
\\b
2 说出左侧规则的含义
^ab
ab$
3 分别说出在单行模式和多行模式中左侧代码的含义
4 贪婪模式和非贪婪模式的区别?
5 如何使用贪婪模式?
6 如何使用非贪婪模式?
\\D
7 左侧代码分别表示什么意思?
8 说明反向引用是什么意思?
9 说明预搜索的含义?用自己的话进行描述
10 说出group(),group(1),group(2)的区别?
第十四章 正则表达式
1 JavaSE技术总结
1 HTTP全称是什么?
2 HTTP有什么作用?
3 HTTP协议是无状态的协议,这句话什么意思?
4 HTTP1.1支持连续连接(长连接)吗?怎么连接持续连接?
5 HTTP watcher、 firebug软件的作用是什么?
6 HTTP请求的基本格式是什么?响应的基本格式是什么?举例子说明
7 HTTP请求头中:Connection、refer、content-type、content-length代表什么含义?
8 理解HTTP协议内容,说明get和post方式的区别?
200
404
500
9 说出左侧状态码的含义?
10 B/S和C/S架构各自的优势和劣势是什么?
11 Tomcat下载后,解压就可以使用,如果环境变量没有JAVA_HOME可以吗?
12 WEB项目建立后,会有目录:WEBROOT/WEB-INF,它的核心作用是什么?
13 在src目录下面写的Java程序编译后的class文件会被放到项目什么地方?
bin
lib
conf
webapps
work
15 解释下左侧目录在Tomcat中分别有什么作用?
16 如何手工发布一个web项目到Tomcat服务器上?
17 如何启动Tomcat服务器?如何终止?
17 Servlet只是一个普通的Java类,它继承了什么类就变成了Servlet?
18 Servlet运行在哪里?脱离服务器可以独立运行吗?
19 Servlet类在服务器上通过元素配置后,为什么还需要?
20 一个Servlet可以对应多个URL吗?反过来,一个URL可以对应多个Servlet?
21 客户端发送请求到服务器,服务器再根据web.xml的配置调用相应的Servlet程序,这句话对吗?
22 Servlet程序通过HttpServletResponse对象直接将信息发送到客户端。这句话对吗?为什么呢?
23 一个web.xml可以配置多个Servlet吗?
24 HttpServletRequest对象里面包含了什么信息?该对象是由谁生成的?
25 HttpServletResponse对象里面包含了什么信息?该对象是由谁生成的?
/111
/999
/oneoneone
/ttt/*
*.do
/sss/*.cc
26 左侧的url-pattern配置模式中哪些不对?
27 在Servlet容器中,一个Servlet类只会new一个Servlet对象,这种说法对吗?为什么?
1 如果使用,则Servlet会在启动时加载
2 如果没有使用,则Servlet会在第一次被访问的时候加载
28 关于Servlet加载和初始化的时机问题,左侧的说法对吗?
1 service
2 doGet
3 doPost
29 请说明左侧三个方法的调用顺序
405 http method post is not supported by this url
30 左侧405错误是如何出现的?怎么解决?
31 当服务器收到一个请求时,会new一个新线程来处理该请求,这句话对吗?
32 Servlet中可以随意定义成员变量和随意使用它,对吗?为什么?
33 Tomcat配置文件web.xml中,DefaultServlet的作用是什么?JspServlet的作用是什么?
34 Tomcat服务器启动后,在项目下有一个a.jsp文件,然后客户端访问:a.jsp,那么,客户端是直接访问a.jsp文件还是执行JspServlet?为什么呢?
35 welcome-file-list元素有什么作用?
36 如何清除掉浏览器端的缓存?
37 服务端遇到了修改代码不起作用,如何彻底干净的解决这个问题?
38 HttpServletRequest是一个类还是接口?它的作用是什么?
40 HttpServletRequest中,获取客户端IP的API是?
41 通过getParameter方法可以获得get方式请求的参数?那么能不能获取post方式请求的参数?
42 多个同名不同值得参数(比如:复选框)传递给服务器,服务器端哪个API处理?
43 HttpServletResponse是一个接口还是类?它的作用是什么?
44 左侧代码有什么问题?
45 Request作为作用域属于同一个请求的Servlet之间共享,它的内部机制是什么?
46 request方法中,setAttribute,getAttribute,removeAttribute实质上是内部有一个Map对象来维持映射关系,这句话对吗?
47 “/”的问题,在浏览器发送请求时它代表什么含义?服务器内部跳转时代表什么含义?
48 一次会话指的是什么?
49 会话创建后,立马就创建session对象吗?
50 request.getSession(),调用两次后,返回的Session对象,是同一个对象还是不同的两个对象,为什么?
52 服务器中会有很多个session对象,那么是通过什么确定客户端跟session对象对应的关系的?说明原因
53 调用什么方法可以让session对象使用完之后立马失效?
54 Cookie技术是一种在客户端保存HTTP状态的技术吗?
55 如果没有设置Cookie的Max Age属性,那么这个Cookie会不会写到客户端硬盘上?浏览器重启后,这个Cookie还能不能读取到?
56 读取Cookie,实际上就是直接读取客户端机器上的文本文件,对吗?给出你的理由
57 如何在Servlet中获取相应的ServletConfig对象?
58 获取到ServletConfig对象后,通过该对象只能读取对应的Servlet的配置信息吗?
59 ServletConfig对象中,通过哪个方法获取参数信息?
60 ServletContext如何加载参数?它能不能读取到某个Servlet下面的参数?
1 request
2 session
3 servletContext
61 说出左侧三个作用域的生命周期和作用范围
14 Servlet技术
3 jQuery中的元素选择器有哪些?
1 jQuery与JavaScript有什么联系?jQuery技术有什么特点?
2 jQuery中的美元符有什么用?
5 使用jQuery操作元素的属性 attr()方法和val()方法有什么区别?
6 文字说明HTML()方法和test()方法的区别
6 文字说明css()方法和addClass()方法的区别
7 列出jQuery操作文档结构的方法
8 jQuery中bind和unbind方法分别有什么作用?
9 jQuery中的one()方法有什么特点?
10 jQuery中的ready()方法和body中的onload方法有什么区别?
13 JQuery技术
1 Java跟JavaScript有什么联系?
2 JavaScript是解释型语言还是编译型语言?
3 JavaScript语言是否可以开发服务器程序?
4 node.js是什么?
5 jQuery是什么?
6 标签可以直接执行JS语句和定义JS函数,对吗?
7 标签可以位于文档的任意部分,但是一般都置于中,对吗?
分支主题
8 JS是一种基于对象和事件驱动的语言,请用文字描述左侧代码的执行过程
测试引入外部的JS文件
9 左侧代码中,void(0)起到什么作用?
10 JavaScript的注释跟Java一样吗?
变量没有类型,数据有类型
11 说说你对左侧这句话的理解
12 变量命名声明必须以什么开头?
图片【2017-04-08_133805】
13 该图的变量哪些是局部变量哪些是全局变量?以及有哪些错误?
var d = '';
14 JS中字符串可以使用单引号也可以使用双引号,请将左侧代码使用双引号和单引号的技巧做处理
15 左侧代码有什么问题?如何解决?
图片【2017-04-08_134305】
16 该图代码会执行alert语句吗?为什么?
17 “===”和'=='有什么区别?
18 JS中数组的长度是否随时可变?
19 写出JS中数组定义的两种常见方式?
1 join
2 shift
3 pop
4 push
20 说说数组中左侧方法分别是什么作用?
图片【2017-04-08_135116】
21 该代码有错吗?
图片【2017-04-08_135335】
22 本图中调用ee函数,最终执行的结果是什么?
1 isNaN
2 escape
3 unescape
3 eval
4 parseInt
5 parseFloat
23 说说左侧内置函数都有什么作用?
1 onload
2 onunload
3 onblue
4 onchange
5 onfocus
6 onkeypress
7 onkeydown
8 onkeyup
9 onmouseover
10 onmousemove
11 oncopy
12 onbeforecopy
24 说出左侧事件的作用
25 某个元素的id是aa,那么JavaScript中通过什么方法可以获得该元素对应的对象?
26 Date中getTime方法是什么意思?返回的数字表示什么意思?
var a = 'aaaabbb';
27 左侧代码中a能使用String对象的方法吗?
1 history
2 navigator
3 location
28 说出左侧对象的作用
29 DOM的全称是什么?
30 浏览器是否根据加载的源代码最后生成DOM对象?
31 写出直接获取元素节点的三种方式?
32 如何获取某个元素的父节点?
33 如何获取某个元素的所有子节点?
图片【2017-04-08_141814】
34 分析该图代码,会不会有问题?
35 操作文本域时,defaultValue和value有什么区别?
36 如果已经获得文本域对象,如何获得所在的表单对象?
12 JavaScript技术
1 CSS的全称和作用?
2 样式的就近原则?
3 中的样式一定比外部引入文件的优先级高吗?
4 继承原则中,CSS所有的样式都可以被继承吗?
5 盒子模型中的三个主要属性是什么?含义是什么?
6 CSS3里面的透明属性是什么?怎么控制的?
7 CSS3里面响应式布局是如何使用定义的?
9 CSS语言
1 互联网的三大基石分别是?都有什么作用?
2 HTML元素之间的关系有哪两种?举个例子?
3 HTML中,属性值用双引号、单引号、不加引号都可以,这句话对吗?
4 使用文本编辑器编辑完HTML后,扩展名需要使用哪些?
5 SEO是什么?title/description/keywords属性跟SEO是什么关系?
6 中的内容会在页面上显示吗?说说为什么?
7 标记中alt属性和title属性有什么区别?
8 超链接标签的使用中,可否使用图片作为超链接的子元素?
9 对于超链接标签的使用,如何点击图片跳转到一个链接?
10 什么是锚点?作用是什么?一般什么时候使用?
11 表单的作用是什么?
12 什么是表单?
13 表单的提交方式常用的有哪两种?有什么区别?
14 一个表单域如果没有设定name属性,它的值会不会被提交?
15 一个表单域标签没有什么属性,它的值会不会被提交?
16 单选按钮是分组的,如果name属性不相同,会出现什么情况?
17 做“多选一”可以使用哪些表单域?“多选多”呢?
18 默认选中某个复选框是使用checked还是selected属性?
8 HTML语言
1 JDBC的全称?
2 详细说明JDBC技术主要用于处理什么问题?好处是什么?
Class.forName('oracle.jdbc.driver.OracleDriver');
3 左侧的代码作用是什么,详细解释其底层原理?
1 execute
2 executeQuery
3 executeUpdate
4 JDBC中执行DML语句时,一般使用左侧哪个方法比较好?说说这几个方法的区别?
5 请说明JDBC中执行DML语句时的三种方法,并分别简述该方法的使用场景
6 解释左侧三个代码返回值的含义
图片【2017-04-08_103405】
7 用文字说明ResultSet处理的典型代码各行的作用
8 详细描述JDBC中编程的4大步骤?
9 说说大对象的作用?
10 简述数据库中大对象的类型及其作用?并说明JDBC访问大对象的流程是什么?
1 SQL注入攻击是怎么回事?使用代码进行说明解释?
2 完成对Oracle数据库的查询操作,将emp表中所有的数据列出
3 完成对Oracle数据库的删除操作,将sal小于1500的记录删除
4 PreparedStatement(预编译SQL语句)有什么优势?
5 写出一段测试PreparedStatement的代码
6 使用代码说明JDBC中事务的管理方式?
7 通过资源文件的方式,将相关数据库信息放入资源文件中,并写出该测试代码?
8 写出JDBC的一段测试批处理的代码
9 写出一段JDBC控制访问存储过程的代码
1 熟练使用JDBC
2 使用DAO模式实现JDBC常用的CRUD操作
3 使用DRM思想封装JDBC常用的CRUD操作,提取BaseDao
练习目标
1 自学apache commons中的JDBCUtils组件
扩展要求
员工信息管理系统
实战项目
7 JDBC技术
2 JavaWeb了解技术
1 什么是容器,我们学过了哪些容器,Spring与我们之前学习的容器有什么异同点?
2 Spring是什么?为什么使用Spring?
3 Spring有哪些特性?
4 Spring的重要特征有哪些?
5 Spring常用的Jar包有哪些?
6 Spring的IOC(控制反转),主要作用是什么?程序中如何体现Spring的控制反转?
7 说说静态工厂方法和动态工厂方法不异同
8 applicationContext.xml中bean标签的各属性分别有何意义?
9 bean的作用域有哪些?各有什么不同?
10 bean的生命周期?
11 Spring两大核心思想是什么?
12 什么是依赖注入?
13 IOC/DI,控制反转/依赖注入,指的都是同一个内容,为什么叫法不一样呢?
14 属性注入方式有哪三种?
15 怎样注入集合,list、set、map分别怎样注入?
16 Spring中什么是自动装配?
17 Spring中怎样实现自动扫描?
18 Spring中基于注解对象,使用哪几个注解?每个注解都有什么作用?
19 @AutoWired默认按照何种方式匹配注入?存在什么问题?
20 @Qualifier有何作用?按照何种方式匹配注入?
21 @Resource按照匹配方式注入?
22 静态代理模式有哪些角色?分别是什么?
23 什么是动态代理?有哪几种方式?
24 静态代理和动态代理的关系是什么?
25 AOP指的是什么?他跟动态代理有什么关系?
26 AOP的好处是什么?
27 什么是横切性关注点?
1 横切性关注点
2 切面
3 连接点
4 切入点
5 通知
6 目标对象
7 织入
8 引入
28 解释下右侧的名词
29 什么是切入点表达式?
30 通知有哪几种类型?运行顺序是什么?
31 解释AOP的运行流程
32 为什么需要事务?
33 使用事务来解决什么问题?使用事务与不使用事务,数据在程序中和数据中分别是什么状态?
34 JavaEE中事务隔离级分为哪些?分别是什么?代表什么含义?
35 Spring事务管理有哪几个核心组件?
36 OpenSessionInView有什么作用?
37 ThreadLocal模式如何理解?有什么作用?
38 BeanFactory和ApplicationContext有什么区别?
39 如何用基于XML与注解配置的方式配置Spring?
40 Spring Bean的作用域之间有什么区别?
41 解释Spring框架中bean的生命周期?
42 Spring框架的事务管理有哪些优点?
43 在SpringAOP中concern和cross-cutting concern的区别是什么?
44 有几种不同类型的自动代理?
45 BeanFactory和ApplicationContext有什么区别?
46 如何用基于Java配置的方式配置Spring?
47 Spring框架中有哪些不同类型的事件?
48 FileSystemResource和ClassPathResource有什么区别?
49 Spring框架中都用到了哪些设计模式?
20 Spring 框架
1 Spring MVC/Struts2框架的异同?
2 举例说明Spring MVC框架和Struts2框架应用的场景?
3 说说Spring MVC和Struts1,Struts2的比较优势?
4 描述Spring MVC的工作流程?
5 画图展示Spring MVC的工作流程,描述从客户端发送请求到服务器响应给客户端的整个过程
6 如何配置Spring MVC的核心控制器?
7 Spring MVC的核心控制器的作用是?
8 默认情况下Spring MVC的核心控制器从哪里获取配置文件?
9 如何指定自定义的配置文件?
10 什么是Spring MVC映射器?有哪几种?
11 什么是Spring MVC适配器?有什么作用?
12 Spring MVC有没有默认的映射器?在哪里定义的?
13 Spring MVC的Handler有几种实现方式?
14 Spring MVC的控制器中获取数据的方式有哪些?
15 @RequestParam的作用是?
16 Spring MVC将数据携带到前台的方式有哪些?
17 Spring MVC如何将数据从控制台携带到前台页面?
18 如何使用Handler进行请求转发,代码如何实现Handler进行重定向?
19 Handler方法中编程如何实现如何绑定自定义日期类型参数业务?
20 如何解决Spring MVC的乱码问题?
21 在Spring MVC中406错误有可能引起的问题是?
22 Spring MVC与AJAX交互的注解有哪几个?
23 Spring MVC实现文件上传有哪些步骤?
24 Spring MVC上传文件解析器是什么?
25 Spring MVC上传文件解析器的id名称是否可以更改?为什么?
26 Spring MVC上传文件解析器的常见参数是什么?
27 Spring MVC的拦截器有什么作用?
28 Spring MVC的拦截器有几种配置方式?
29 Spring MVC的拦截器与Struts2拦截器有什么区别?
30 Spring MVC拦截器的实现方式有哪些?
31 拦截器实现中有哪些方法?
32 拦截器实现中3个方法分别处理哪些内容?
33 Spring MVC怎样自定义拦截器?
34 Spring MVC中的拦截器与Struts2的拦截器有什么不同?
35 Spring、Spring MVC怎样集成?
36 我们知道用户请求URL可以用注解的方式来把URL与控制器controller映射起来,但怎么把控制器controller与业务模型映射起来是url通过controller找到对应的业务模型?也就是说控制器与业务模型怎么样建立关系?
37 Spring MVC的核心入口类是什么?Struts2的是什么?
38 Spring MVC的控制器是不是单例模式,如果是,有什么问题?怎么解决?
39 Spring MVC中的控制器的注解一般用哪个?有没有别的注解可以代替?
40 @RequestMapping注解用在类上面有什么作用?
41 怎样把某个请求映射到特定的方法上面?
42 如果在拦截请求中,我们想拦截get方式提交的方法,怎么配置?
43 如果在拦截请求中,我们想拦截提交参数中包含'type=test'字符串,怎么配置?
44 我们想在拦截的方法里面得到从前台传入的参数,怎么得到?
45 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎样快速得到这个对象?
46 怎样在方法里面得到Request或者Session?
47 Spring MVC中函数的返回值是什么?
48 Spring MVC怎么处理返回值的?
49 Spring MVC怎么样设定重定向和转发的?
50 Spring MVC用什么对象从后台向前台传递数据的?
51 Spring MVC中有个类把视图和数据都合并在一起的叫什么?
52 怎么样吧ModelMap里面的数据放入Session里面?
53 Spring MVC怎么和AJAX相互调用的?
54 当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理?
21 Spring MVC框架
1 MyBatis的核心原理?使用MyBatis与其他ORM框架对比有哪些优点和缺点?
2 MyBatis与Hibernate有什么异同?
3 MyBatis中有哪些常用的查询方法?
4 什么是MyBatis命名空间?
5 MyBatis中如何进行Mapper的动态代理?
6 MyBatis输入参数#{}中与${}有什么不同?分别代表什么含义?
7 MyBatis中如何定义别名查询?
8 MyBatis怎样定义结果集resultMap?
9 MyBatis的结果集resultMap可以定义哪些类型?
10 MyBatis怎样进行分页查询?
11 MyBatis中什么是逻辑分页?什么是物理分页?分别有什么优缺点?
12 MyBatis怎样进行动态查询?
13 MyBatis中动态查询常用的有哪些标签?
14 MyBatis怎样进行CRUD操作
15 MyBatis怎样进行事务管理?
16 比较MyBatis和Hibernate事务管理的区别
17 MyBatis框架有哪些注释?
18 如何使用MyBatis的注解实现动态SQL语句查询?
19 MyBatis怎样进行“多对一”关联查询?
20 如何实现MyBatis一对多的join查询?
21 如何实现MyBatis一对多的n+1次查询?
22 MyBatis如何进行关联关系(一对一,一对多,多对多),以及双向关联关系查询?
23 MyBatis有几种缓存?获取Sqlsession后,查询数据的顺序?MyBatis中与Hibernate中获取session,查询数据的顺序有什么区别?
24 MyBatis怎样处理延迟加载?
25 MyBatis动态SQL语句怎样生成?
26 集成Spring MVC + Spring + MyBatis有哪些步骤?
27 MyBatis比IBatis比较大的改进是什么?
28 什么是MyBatis的接口绑定?有什么好处?
29 接口绑定的几种实现方式?分别是怎么实现的?
30 什么情况下用注解绑定?什么情况下用XML绑定?
31 MyBatis实现一对一有几种方式?具体是怎么操作的?
32 MyBatis实现一对多有几种方式?具体是怎么操作的?
33 MyBatis里面的动态SQL是怎么设定的?用什么语法?
34 IBatis和MyBatis在核心处理类分别教师什么?
35 IBatis和MyBatis在细节上的不同有哪些?
36 讲讲MyBatis的缓存
37 MyBatis(IBatis)的好处是什么?
1 select
2 insert
3 update
4 delete
38 XML映射文件中,除了右侧常见的标签之外还有哪些标签?
39 最佳实践中,通常一个XML映射文件,都会写一个Dao接口与之对应,请问这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
40 MyBatis是如何进行分页的?分页插件的原理是什么?
41 简单描述下MyBatis的插件运行原理,以及如何编写一个插件?
42 MyBatis执行批量插入,能返回数据库主键列表吗?
43 MyBatis动态SQL是做什么的?都有哪些动态SQL?简述一下动态SQL的执行原理?
44 MyBatis是如何将SQL执行结果封装为目标对象并返回的?都有哪些映射形式?
45 MyBatis能执行一对一、一对多的关联查询吗?都有哪些实现方式?以及它们有什么区别?
46 MyBatis是否支持延迟加载?如果支持,它的实现原理是什么?
47 MyBatis的XML映射文件中,不同的XML映射文件,ID是否可以重复?
48 MyBatis中如何执行批处理?
49 MyBatis都有哪些Executor执行器?它们之间的区别是什么?
50 MyBatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面?还是说必须定义在A标签的前面?
51 简述MyBatis的XML映射文件和MyBatis内部数据结构之间的映射关系?
52 为什么说MyBatis是半自动ORM映射工具?它与全自动的区别在哪里?
53 MyBatis如何设置底层JDBC使用PreparedStatement执行SQL语句?
54 MyBatis如何与LOG4J结合打印日志?
55 MyBatis如何执行存储过程?
56 MyBatis数据管理方式有几种?
57 MyBatis引入XXX.mapper映射文件有几种方式?
58 MyBatis事务管理有几种方式?分别是什么?
59 MyBatis如何给类型设置别名?设置别名的方式有几种?分别是什么?
60 谈谈在MyBatis中auto-mapping是什么?
61 MyBatis中驱动是否会一直等待数据库响应?如何设置数据库最大响应时间?
62 MyBatis每次从数据库抓取结果行数是多少?是否可以自定义设置?
63 MyBatis如何判断需要执行的数据库类型?是否可以给SQL命令明确指定在什么数据库中执行?
64 MyBatis是否可以在mapper中指定自定义主键策略?
65 MyBatis中如何实现SQL复用?
66 MyBatis中在接口定义的方法是否可以有多个参数??如何进行多参数传递?
67 MyBatis中调用如何传递参数?
68 MyBatis中调用如何进行多参数传递?
69 持久层框架是什么意思?你用过的持久层框架有哪些?
70 什么样的需求使用MyBatis框架更好?什么样的去求使用Hibernate框架更好?
71 MyBatis是否有反向工程?你所熟悉的反向工程有哪些?各有什么优缺点?
72 谈谈MyBatis和Hibernate在执行效率上的对比?
73 谈谈MyBatis和Hibernate在开发效率上的对比?
74 解释下DefaultSqlSessionFactory的作用?
75 解释下SqlSessionFactoryBuilder的作用?
76 说说MyBatis缓存和Hibernate缓存的区别?
77 在你的项目中为什么使用MyBatis框架?
78 MyBatis中SQL语句执行类型有几种方式?(ExecutorType)
79 MyBatis中防止n+1次查询的方式有哪几种?
80 MyBatis中ObjectFactory是什么?
81 MyBatis中TypeHandler是什么?
22 MyBatis 框架
1 什么是权限管理?
2 什么是用户身份认证?
1 主体(Subject)
2 身份信息(Principal)
3 凭证信息(Credential)
3 解释右侧名词的意思
4 什么是授权?
2 资源(Resource)
3 权限/许可(Permission)
5 解释右侧名词
6 如何创建权限管理的数据库表?
7 什么是权限分配?
8 什么是权限控制?
9 什么是基于角色的访问控制(PBAC)?有什么缺点?
10 什么是基于资源的访问控制?有什么优点?
11 什么是粗颗粒度和细颗粒度?
12 简述如何实现粗颗粒度和细颗粒度?
13 阐述基于URL拦截的原理
24 RBAC 技术
1 什么是shiro?为什么使用shiro?
2 shiro的组成部分和RABC中关键对象进行对比?
1 Subject
2 SecurityManager
3 Authenticator
4 Authorizer
5 Realm
6 SessionManager
7 SessionDao
8 CacheManager
9 Cryptography
3 解释右侧术语
4 解释认证的基本概念:principals、credentials
5 shiro认证流程是什么?
6 shiro认证中有哪些常见异常?分别表示什么意思?
7 什么是Realm?如何自定义Realm?
8 什么是散列算法?
9 什么是授权?
1 主题
2 资源
3 权限
4 角色
10 解释右侧授权的关键概念
11 shiro授权有哪三种方式?
12 如何自定义Realm实现授权?
13 在web项目中如何配置shiro的过滤器?
14 shiro如何与web项目进行整合?
15 shiro如何控制菜单的权限控制与按钮权限控制?
16 shiro怎样控制controller权限?
17 shiro常用的标签与注解有哪些?
18 什么是shiro缓存?为什么要使用缓存?
19 shiro缓存怎样实现?
25 shiro 安全框架
1 redis是什么?
2 redis相比memcached有哪些优势?
3 redis单机如何安装?
4 redis有哪五种数据类型?
5 redis怎样后台运行?
6 redis怎样绑定请求IP地址?
7 redis如何设置DB数量?
8 redis持久化配置方式是什么?
9 set命令与setnx命令有什么区别?
10 redis操作String类型,怎样指定有效期?
11 redis操作String,怎样设置指定key的value值得子字符串?
12 redis操作String,怎样一次性设置多个key的使用?
13 redis操作String,怎样获取key对应的String值?
14 redis操作String,怎样设置key的值,并返回key的旧值?
15 redis操作String,怎样获取指定的key的value值的子字符串?
16 redis操作怎样获取多个key对应的值?
17 redis怎样对key的值做加加操作?
18 redis怎样对key的值做减减操作?
19 redis操作String,怎样实现追加操作?
20 redis操作String,怎样获取指定key的value值得长度?
21 redis操作hash,怎样设置hash field为指定值?
22 redis操作hash,怎样设置多个hash field为指定值?
23 redis操作hash,怎样获取指定的hash field?
24 redis操作hash,怎样获取全部指定的hash field?
25 redis操作hash,怎样获取hash中元素个数?
26 redis操作hash,怎样删除hash中指定field元素?
27 redis操作list,怎样在key对应的list的头部添加字符串元素?
28 redis操作list,怎样在key对应的list的尾部添加字符串元素?
29 redis操作list,怎样设置list中指定下标的元素值(下标从0开始)?
30 redis操作set,怎样向set中添加元素?
31 redis操作set,怎样删除名称为key的set中的元素member?
32 redis操作sorted set,怎样向名称为key的zset中添加元素member?
33 redis操作sorted set,怎样删除名称为key的zset中的元素member?
34 什么是redis集群?redis集群原理是什么?
35 redis集群为什么至少六台?
36 redis有哪些特性?
37 redis集群中slot是什么?有什么作用?
38 redis集群中选举、容错机制是什么?
39 redis集群如何进行安装?
40 redis集群如何添加、删除节点?
41 什么是Jedis,如何使用Jedis操作redis数据库?
31 Redis缓存技术
1 什么是MyBatis你逆向工程?有什么好处?
2 逆向工程的原理是什么?
3 逆向工程怎样指定数据库表?
4 逆向工程如何自定义Java对象名称?
5 如何搭建逆向工程?
6 逆向工程生成的代码怎样实现CRUD操作?
7 什么是分页插件?有什么好处?
8 分页插件如何调用?
28 逆向工程、分页插件
1 什么是nginx?
2 nginx与apache对比?
3 nginx安装依赖有哪些?
4 nginx安装怎样指定安装路径?
5 nginx怎样启动?
6 怎样检查nginx配置文件的准确性?
7 怎样从新加载nginx配置文件?
8 nginx怎样指定运行用户?
9 nginx怎样指定启动进程数量?
10 nginx定义服务器的默认网站根目录位置?
11 什么是nginx反向代理?如何实现反向代理Tomcat?
29 Nginx 服务器
1 maven是什么?
2 Ant和maven的区别?
3 什么是maven坐标?
4 什么是依赖管理?
5 什么是远程仓库?
6 maven怎样安装?
7 maven怎样创建Java项目?
8 maven怎样创建parent项目?
9 maven如何创建Java Web项目?
10 什么是maven module?
11 maven module与project有什么区别?
12 maven怎样添加依赖?
13 maven如何编译源代码?
14 maven如何测试项目?
15 maven如何产生site?
16 maven怎样打包?
17 maven怎样安装到本地仓库?
18 maven如何消除编译后的文件及项目?
19 maven编译时如何跳过测试代码?
20 maven怎样生成Eclipse项目?
21 maven通过Tomcat插件,如何运行Java Web项目?
22 maven怎样发布到Tomcat?
26 Maven技术
1 Linux系统有哪些部分组成?
2 新建一个文本文件有哪些命令可以实现?
3 Linux关机与重启命令?
4 Linux切换工作目录命令?
5 Linux显示工作目录命令?
6 Linux查看目录中文件命令?
7 Linux显示文件和目录由根目录开始的树形结构命令?
8 Linux创建目录命令?
9 Linux删除文件命令?
10 Linux删除目录命令?
11 Linux重命名/移动命令?
12 Linux复制文件命令?
13 Linux创建链接命令?
14 Linux文件搜索命令?
15 Linux创建用户组命令?
16 Linux删除用户组命令?
17 Linux重命名用户组命令?
18 Linux创建用户命令?
19 Linux删除用户命令?
20 Linux修改用户属性命令?
21 Linux修改密码命令?
22 Linux设置权限命令?
23 Linux改变文件用户组命令?
24 Linux解压缩命令有哪些?
25 Linux软件包升级以及安装命令?
26 Linux查看文件命令有哪些?
27 Linux怎样查看进程?
28 Linux怎样修改环境变量?
29 Linux(centos)怎样修改防火墙?
27 Linux技术
1 什么是集群?
2 zookeeper是什么?
3 为什么使用zookeeper?能做哪些事情?
4 zookeeper三种角色leader、follower、observer作用?
5 zookeeper选举leader过程?
6 zookeeper配置文件管理原理?
7 什么solr集群?为什么使用solr集群?
8 solr集群的结构是怎样的?
33 Zookeeper分布式
3 简历项目涉及框架
1、查询缓存
2、解析器生成解析树
3、预处理再次生成解析树
4、查询优化器
5、查询执行计划
6、查询执行引擎
7、查询数据返回结果
执行流程
1、每一列只能有一个值
2、每一行可以被唯一的区分
3、不包含其他表的已包含的非关键信息
1、冗余数据的处理(可以提高系统的整体查询性能<三范式>)
1、一般不会设计属性过多的表
2、一般不会超过500到1000万数据的表
3、有大数据的列单独拆为小表
2、大表拆小表
3、根据需求展示更加合理的表结构
4、常用属性分离为小表
表结构对性能的影响
1、类型
2、方法
1,较频繁的作为查询条件的字段应该创建索引;
4,不会出现在WHERE 子句中的字段不该创建索引;
3、创建
1,Explain:可以让我们查看MYSQL执行一条SQL所选择的执行计划;
2,Profiling:可以用来准确定位一条SQL的性能瓶颈;
4、执行计划与执行明细
JOIN的原理
1、选择需要优化的SQL
1、任何SQL的优化,都从Explain语句开始;Explain语句能够得到数据库执行该SQL选择的执行计划;
2、首先明确需要的执行计划,再使用Explain检查;
3、使用profile明确SQL的问题和优化的结果;
2、Explain和Profile入手
3、永远用小结果集驱动大的结果集
4、在索引中完成排序
5、使用最小Columns
6、使用最有效的过滤条件
7、避免复杂的JOIN和子查询
sql优化原则
1、共享锁<s lock>允许事务读取一行数据
2、排他锁<x lock>允许事务更新或者是删除一条数据
3、意向共享锁<is lock>事务想要获得一张表某几行的共享锁
4、意向排他锁<ix lock>事务想要获得一张表的某几行的排他锁
2、latch<轻量级锁,锁的时间非常短,用来操作临界资源>
3、一致性的非锁定读
4、一致性锁定读
5、死锁
锁
1、原子性<数据库事务不可分割的单位,要么都做,要么都不做>
3、隔离性<事务是相互不可见的>
4、持久性<事务一旦提交,即使宕机也是能恢复的>
2、一致性<事务的操作不会改变数据库的状态,比方说唯一约束>
1、特性
1、扁平事务<使用最频繁的事务,要么都成功提交,要么都失败回滚>
2、带有扁平点的扁平事务<允许事务回滚到同一个事务中比较早的一个状态>
3、链事务<回滚到最近的一个保存点,在所有的事务都提交之后才会释放锁,并且下一个事务的开始需要上一个事务来进行通知>
4、嵌套事务<树结构,只有当父级事务提交之后子级事务才会提交,任意一个父级事务的回滚都会导致下面的子级事务回滚>
5、分布式事务<操作两个不同的数据库,使其实现数据的同步,例如将中国银行的钱转到工商银行,这个不同银行的不同数据库,为分布式事务>
2、分类
1、read uncommittted<脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据>
2、read committed<不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。>
3、repeatable read<幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。>
4、serializable<锁表,不会出现意外情况>
3、隔离级别
MySQL总结笔记
对现有的类结构没有影响
轻量级,非侵入式
可以提供众多服务,如事务管理,WS等
AOP的很好支持,方便面向切面编程,使得业务逻辑和系统服务分开
使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
Spring DI机制降低了业务对象替换的复杂性。
Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部
Spring优点
缺少一个公用控制器
没有SpringBoot好用
Spring像一个胶水,将框架黏在一起,后面拆分的话就不容易拆分了
Spring缺点
基本概念
主要通过Proxy.newProxyInstance()和InvocationHandler这两个类和方法实现
调用被代理类方法时默认调用此方法
创建代理类proxy实现Invocation接口,重写invoke()方法
将被代理类作为构造函数的参数传入代理类proxy
$Proxy0 extends Proxy implements Person
类型为$Proxy0
生成的代理类
代理对象会实现用户提供的这组接口,因此可以将这个代理对象强制类型转化为这组接口中的任意一个
通过反射生成对象
总结: 代理类调用自己方法时,通过自身持有的中介类对象来调用中介类对象的invoke方法,从而达到代理执行被代理对象的方法。
实现过程
jdk动态代理
生成对象类型为Enhancer
实现原理类似于 jdk 动态代理,只是他在运行期间生成的代理对象是针对目标类扩展的子类
cglib
如果要代理一个接口的多个实现的话需要定义不同的代理类
代理类 和 被代理类 必须实现同样的接口,万一接口有变动,代理、被代理类都得修改
在编译的时候就直接生成代理类
静态代理
1.6和1.7的时候,CGLib更快
1.8的时候,jdk更快
CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高
CGLib在创建对象的时候所花费的时间却比JDK动态代理多
singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则适合用JDK动态代理
JDK动态代理是面向接口的,CGLib动态代理是通过字节码底层继承代理类来实现(如果被代理类被final关键字所修饰,那么会失败)
JDK生成的代理类类型是Proxy(因为继承的是Proxy),CGLIB生成的代理类类型是Enhancer类型
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);如果要被代理的对象不是实现类,那么Spring会强制使用CGLib来实现动态代理。
JDK动态代理和cglib的对比
实现原理
XML方式
注解方式
@Configuration 作用于类上,相当于一个xml配置文件;
@Bean 作用于方法上,相当于xml配置中的<bean>;
通过 @Configuration 和 @Bean 这两个注解实现的
基于Java类配置
配置方式
核心业务功能和切面功能分别独立进行开发 ,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP
让关注点代码与业务代码分离
面向切面编程就是指: 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态植入“切面类代码”。
应用场景:日志,事务管理,权限控制
如果需要某一组操作具有原子性,就用注解的方式开启事务,按照给定的事务规则来执行提交或者回滚操作
事务管理一般在Service层
Conn.setAutoCommite(false); // 设置手动控制事务
粒度较细,比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚
用户通过代码的形式手动控制事务
编程式事务控制
Spring提供对事务的控制管理
声明式事务控制
事务控制
如果当前方法有事务了,当前方法事务会挂起,在为加入的方法开启一个新的事务,直到新的事务执行完、当前方法的事务才开始
required_new
如果当前方法已经有事务了,加入当前方法事务
required(默认方法)
其余五种方式(拓展学习)
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时候事务如何传播。
事务传播行为
TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
数据库隔离级别
指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。
事务超时属性
对事物资源是否执行只读操作
事务只读属性
定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚,也可以用用户自己定义
回滚规则
事务属性
(平台)事务管理器
Spring并不直接管理事务,而是提供了多种事务管理器,通过PlatformTransactionManager这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。
PlatformTransactionManager
事务定义属性(事务隔离级别、传播行为、超时、只读、回滚规则)
TransactionDefinition
事务运行状态
TransactionStatus
Spring事务管理接口
如果在dao层,回滚的时候只能回滚到当前方法,但一般我们的service层的方法都是由很多dao层的方法组成的
如果在dao层,commit的次数会过多
事务管理
byName
优先byType
@Autowired
优先byName
byType
@Resource
自动扫描(component-scan)
实现方式
装配规则
基于注解的自动装配
基于XML配置的显式装配
能够在编译时就发现错误
基于Java配置的显式装配
装配方式(依赖注入的具体行为)
<bean id="text" class="com.maven.Text" /><bean id="hello" class="com.maven.Hello"><constructor-arg ref="text" /></bean>
构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
构造器方式注入
例如:<bean id="hello" class="com.maven.Hello"><property name="text" ref="text" /></bean>
之所以叫setter方法注入,因为这是通过找到类的对应的setter方法,再进行相应的注入
Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
setter方法注入
最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。
依赖注入的方式
构造器方式无法解决,只能抛出异常
因为Spring容器不缓存"prototype"作用域的bean,因此无法提前暴露一个创建中的bean。
多例方式无法解决,只能抛出异常
通过提前暴露一个单例工厂方法,从而使其他bean能够引用到该bean/提前暴露一个正在创建中的bean
单例模式可以解决
循环依赖
依赖注入
1.)Resource定位;指对BeanDefinition的资源定位过程。通俗地讲,就是找到定义Javabean信息的XML文件,并将其封装成Resource对象。
2.)BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition。
3.)向IoC容器注册这些BeanDefinition。
容器的初始化过程
1.实例化Bean
2.设置Bean的属性
BeanNameAware
BeanFactoryAware
ApplicationContextAware
3.检查Aware相关接口并设置相关依赖
4.检查BeanPostProcessor接口并进行前置处理
由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
5.检查Bean在Spring配置文件中配置的init-method属性并自动调用其配置的初始化方法。
6.检查BeanPostProcessor接口并进行后置处理
7.当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
8. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
bean的生命周期
Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。
singleton是Bean的默认作用域
默认情况下是容器初始化的时候创建,但也可设定运行时再初始化bean
DefaultSingletonBeanRegistry类里的singletonObjects哈希表保存了单例对象。
singleton
Spring容器可以管理singleton作用域下bean的生命周期,在此作用域下,Spring能够精确地知道bean何时被创建,何时初始化完成,以及何时被销毁
每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态
对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。
prototype
在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。
request
在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
session
在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet \tcontext时有效。
global Session
bean的作用域
1.进入getBean()方法
2.判断当前bean的作用域是否是单例,如果是,则去对应缓存中查找,没有查找到的话则新建实例并保存。如果不是单例,则直接新建实例(createBeanInstance)
创建bean
找到@Autowired的对象
创建注入对象,并赋值
3.新建实例后再将注入属性(populateBean),并处理回调
bean的创建
bean知识
1.首先根据配置文件找到对应的包,读取包中的类,,找到所有含有@bean,@service等注解的类,利用反射解析它们,包括解析构造器,方法,属性等等,然后封装成各种信息类放到container(其实是一个map)里(ioc容器初始化)
2.获取类时,首先从container中查找是否有这个类,如果没有,则报错,如果有,则通过构造器信息将这个类new出来
3.如果这个类含有其他需要注入的属性,则进行依赖注入,如果有则还是从container找对应的解析类,new出对象,并通过之前解析出来的信息类找到setter方法(setter方法注入),然后用该方法注入对象(这就是依赖注入)。如果其中有一个类container里没找到,则抛出异常
4.如果有嵌套bean的情况,则通过递归解析
5.如果bean的scope是singleton,则会重用这个bean不再重新创建,将这个bean放到一个map里,每次用都先从这个map里面找。如果scope是session,则该bean会放到session里面。
大致流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
1.加载和实例化
2.初始化
3.请求处理
4.服务终止
servlet生命周期
SpringMVC
FileSystemXmlApplicationContext
ClassPathXmlApplicationContext
WebXmlApplicationContext
ApplicationContext
Spring类
Spring总结笔记
简介:Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
消息系统术语:消息归纳topic,发布消息producers,消费消息consumer,集群服务broker。
总结:两个作用,1.降低系统组网复杂度。2.降低编程复杂度。
介绍
1.同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
2.可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。
3.分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
4.消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
5.支持online和offline的场景。
Kafka独特设计在什么地方?
超链接
producer,broker,consumer关系图
Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。
Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。
broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。
架构
Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。
Partition
特指Kafka处理的消息源(feeds of messages)的不同分类。
Topic
消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。
Message
消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。
Producers
消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。
Consumers
缓存代理,Kafa集群中的一台或多台服务器统称为broker。
Broker
部件
kafka架构
一个topic是对一组消息的归纳。对每个topic,Kafka 对它的日志进行了分区
Topics 和Logs
实际上每个consumer唯一需要维护的数据是消息在日志中的位置,也就是offset.这个offset有consumer来维护:一般情况下随着consumer不断的读取消息,这offset的值不断增加,但其实consumer可以以任意的顺序读取消息,比如它可以将offset设置成为一个旧的值来重读之前的消息。
通常简单的由负载均衡机制随机选择分区,但也可以通过特定的分区函数选择分区。使用的更多的是第二种。
队列模式中,consumers可以同时从服务端读取消息,每个消息只被其中一个consumer读到。
发布-订阅模式中消息被广播到所有的consumer中。
队列模式和发布-订阅模式
如果所有的consumer都在一个组中,这就成为了传统的队列模式,在各consumer中实现负载均衡。
如果所有的consumer都不在不同的组中,这就成为了发布-订阅模式,所有的消息都被分发到所有的consumer中。
Consumers可以加入一个consumer 组,共同竞争一个topic,topic中的消息将被分发到组中的一个成员中。
集群关系图
相比传统的消息系统,Kafka可以很好的保证有序性。
Kafka可以在多个consumer组并发的情况下提供较好的负载均衡。
Kafka如何搭建及创建topic、发送消息、消费消息?
https://www.apache.org/dyn/closer.cgi?path=/kafka//kafka_.tgz
tar -xzf kafka_2.9.2-0.8.1.1.tgz
cd kafka_2.9.2-0.8.1.1
下载解压
Kafka用到了Zookeeper,所有首先启动Zookper。
bin/zookeeper-server-start.sh config/zookeeper.properties
启动服务
bin/kafka-server-start.sh config/server.properties
启动kafka
环境搭建
创建一个叫做“test”的topic,它只有一个分区,一个副本。
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
创建topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
通过list命令查看创建的topic
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
发送消息
Kafka也有一个命令行consumer可以读取消息并输出到标准输出:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
启动consumer
测试
http://www.aboutyun.com/thread-12882-1-1.html
http://blog.jobbole.com/75328/
http://www.cnblogs.com/likehua/p/3999538.html
学习总结来源
kafka总结笔记
虚拟机的历史
未来的Java技术一览
程序计数器
栈
堆
方法区
1.6
1.7
1.8
各个版本内存区域的变化
运行时常量池
各个区域的作用
直接内存
运行时数据区域
站在线程角度来看堆和栈
深入辨析堆和栈
栈桢
栈上分配
方法的出入栈
分配过程
内存布局
对象的访问定位
虚拟机中的对象
Java堆溢出
新生代配置
方法区和运行时常量池溢出
虚拟机栈和本地方法栈溢出
本机直接内存溢出
堆参数设置和内存溢出实战
1、Java内存区域
GC概述
判断对象的存活
辨析强、弱等各种引用
标记-清除算法
复制算法
标记-整理算法
GC算法
分代收集
Stop The World现象
GC日志解读
内存分配与回收策略
内存泄漏和内存溢出辨析
JDK为我们提供的工具
了解MAT
垃圾回收器概览
垃圾回收器工作详解
G1详解
未来的垃圾回收
垃圾回收器
2、垃圾回收器和内存分配策略
Class类文件本质
格式详解
Class文件格式
字节码指令
加载过程详解
自定义类加载对类进行加密和解密
系统的类加载器
双亲委派模型
类加载器
Tomcat类加载机制
类加载机制
栈桢详解
方法调用详解
基于栈的指令集与基于寄存器的指令集
分析代码在虚拟机中的执行情况
基于栈的字节码解释执行引擎
3、JVM的执行子系统
构造器参数太多怎么办?
不需要实例化的类应该构造器私有
不要创建不必要的对象
避免使用终结方法
使类和成员的可访问性最小化
使可变性最小化
优先使用复合
接口优于抽象类
可变参数要谨慎使用
返回零长度的数组或集合,不要返回null
优先使用标准的异常
用枚举代替int常量
将局部变量的作用域最小化
精确计算,避免使用float和double
当心字符串连接的性能
4、编写高效优雅Java程序
响应时间
并发数
吞吐量
相互之间的关系
常用的性能评价/测试指标
总原则
前端优化手段
应用服务性能优化
存储性能优化
常用的性能优化手段
缓存的基本原理和本质
合理使用缓冲的准则
分布式缓存与一致性哈希
集群
同步和异步,阻塞和非阻塞
常见异步的手段
异步
代码级别
并发编程
资源的复用
与JIT编译器相关的优化
GC调优
JVM调优实战
应用相关
详细了解应用服务性能优化
5、深入了解性能优化
JVM性能优化总结笔记
Java采用
内存共享
消息传递
线程通信机制
为了程序的性能,处理器、编译器都会对程序进行重排序处理
在单线程环境下不能改变程序运行的结果
存在数据依赖关系的不允许重排序
重排序在多线程环境下可能会导致数据不安全
问题
重排序
多线程环境下的理论参考模型
为程序提供了极强的内存可见性保证
一个线程中的所有操作必须按照程序的顺序来执行
所有线程都只能看到一个单一的操作执行顺序,不管程序是否同步
每个操作都必须原子执行且立刻对所有线程可见
特性
顺序一致性
JMM中最核心的理论,保证内存可见性
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。
如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前
两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法
理论
happens-before
所有的操作均可以为了优化而被重排序,但是你必须要保证重排序后执行的结果不能被改变
as-if-serial
内存模型
同步、重量级锁
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性
原理
普通同步方法,锁是当前实例对象
静态同步方法,锁是当前类的class对象
同步方法块,锁是括号里面的对象
锁对象
synchronized的锁就是保存在Java对象头中的
Mark Word被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据,它会根据对象的状态复用自己的存储空间
哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳
包括
Mark Word(标记字段)
Klass Pointer(类型指针)
包括两部分数据
Java对象头
初始时为NULL表示当前没有任何线程拥有该monitor record,当线程成功拥有该锁后保存线程唯一标识,当锁被释放时又设置为NULL
Owner
monitor
实现机制
该线程等待一段时间,不会被立即挂起,看持有锁的线程是否会很快释放锁(循环方式)
自旋字数较难控制(-XX:preBlockSpin)
存在理论:线程的频繁挂起、唤醒负担较重,可以认为每个线程占有锁的时间很短,线程挂起再唤醒得不偿失
自旋次数无法确定
自旋锁
自旋的次数不再是固定的,它是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定
自旋成功,则可以增加自旋次数,如果获取锁经常失败,那么自旋次数会减少
适应性自旋锁
若不存在数据竞争的情况,JVM会消除锁机制
变量逃逸
判断依据
锁消除
将多个连续的加锁、解锁操作连接在一起,扩展成一个范围更大的锁。例如for循环内部获取锁
锁粗化
在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗
通过CAS来获取锁和释放锁
对于绝大部分的锁,在整个生命周期内都是不会存在竞争的
性能依据
在多线程环境下,其运行效率比重量级锁还会慢
轻量级锁
为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径
主要尽可能避免不必须要的CAS操作,如果竞争锁失败,则升级为轻量级锁
偏向锁
锁优化
synchronized
volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写
volatile原子性:volatile对单个读/写具有原子性(32位Long、Double),但是复合操作除外,例如i++;
内存屏障
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新到主内存中
当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量
内存语义
主存、高速缓存(线程私有)缓存一致?
通过在总线加LOCK#锁的方式
通过缓存一致性协议(MESI协议)
解决方案
操作系统语义
volatile
单例模式
happens-beofre
DCL
禁止重排序
volatile方案
利用classloder的机制来保证初始化instance时只有一个线程。JVM在类初始化阶段会获取一个锁,这个锁可以同步多个线程对同一个类的初始化
基于类初始化的解决方案
Java内存模型(JMM)
AbstractQueuedSynchronizer,同步器,实现JUC核心基础组件
解决了子类实现同步器时涉及的大量细节问题,例如获取同步状态、FIFO同步队列
采用模板方法模式,AQS实现大量通用方法,子类通过继承方式实现其抽象方法来管理同步状态
FIFO双向队列,AQS依赖它来解决同步状态的管理问题
首节点唤醒,等待队列加入到CLH同步队列的尾部
CLH同步队列
获取同步状态:acquire
响应中断:acquireInterruptibly
超时获取:tryAcquireNanos
获取锁
release
释放锁
独占式
acquireShared
releaseShared
共享式
同步状态获取与释放
当有线程获取锁了,其他再次获取时需要阻塞,当线程释放锁后,AQS负责唤醒线程
是用来创建锁和其他同步类的基本线程阻塞原语
每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在进程中使用,则调用park()将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark 使其可用
park()、unpark()
LockSupport
线程阻塞和唤醒
AQS
Compare And Swap,整个JUC体系最核心、最基础理论
内存值V、旧的预期值A、要更新的值B,当且仅当内存值V的值等于旧的预期值A时才会将内存值V的值修改为B,否则什么都不干
native中存在四个参数
循环时间太长
只能保证一个共享变量原子操作
版本号
AtomicStampedReference
ABA问题
缺陷
CAS
并发基础
可重入锁,是一种递归无阻塞的同步机制
比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率
分为公平锁、非公平锁
底层采用AQS实现,通过内部Sync继承AQS
ReentrantLock
读写锁,两把锁:共享锁:读锁、排他锁:写锁
支持公平性、非公平性,可重入和锁降级
锁降级:遵循获取写锁、获取读锁在释放写锁的次序,写锁能够降级成为读锁
ReentrantReadWriteLock
Lock 提供条件Condition,对线程的等待、唤醒操作更加详细和灵活
内部维护一个Condition队列。当前线程调用await()方法,将会以当前线程构造成一个节点(Node),并将节点加入到该队列的尾部
Condition
它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
通俗讲:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活
底层采用ReentrantLock + Condition实现
多线程结果合并的操作,用于多线程计算数据,最后合并计算结果的应用场景
应用场景
CyclicBarrier
在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待
CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier
与CyclicBarrier区别
内部采用共享锁来实现
CountDownLatch
一个控制访问多个共享资源的计数器
信号量
从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动
信号量Semaphore是一个非负整数(>=1)。当一个线程想要访问某个共享资源时,它必须要先获取Semaphore,当Semaphore >0时,获取该资源并使Semaphore – 1。如果Semaphore值 = 0,则表示全部的共享资源已经被其他线程全部占用,线程必须要等待其他线程释放资源。当线程释放资源时,Semaphore则+1
通常用于限制可以访问某些资源(物理或逻辑的)的线程数目
内部采用共享锁实现
Semaphore
可以在对中对元素进行配对和交换的线程的同步点
允许在并发任务之间交换数据。具体来说,Exchanger类允许在两个线程之间定义同步点。当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中
Exchanger
并发工具类
一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关。其思路是为每一个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所对应的副本
ThreadLocal 不是用于解决共享变量的问题的,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制
get():返回此线程局部变量的当前线程副本中的值
initialValue():返回此线程局部变量的当前线程的“初始值”
remove():移除此线程局部变量当前线程的值
set(T value):将此线程局部变量的当前线程副本中的值设置为指定值
四个方法
实现线程隔离机制的关键
每个Thread内部都有一个ThreadLocal.ThreadLocalMap类型的成员变量,该成员变量用来存储实际的ThreadLocal变量副本。
提供了一种用键值对方式存储每一个线程的变量副本的方法,key为当前ThreadLocal对象,value则是对应线程的变量副本
ThreadLocalMap
ThreadLocal实例本身是不存储值,它只是提供了一个在当前线程中找到副本值得key
是ThreadLocal包含在Thread中,而不是Thread包含在ThreadLocal中
注意点
key 弱引用 value 强引用,无法回收
显示调用remove()
内存泄漏问题
ThreadLocal
一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架
“分治”
fork分解任务,join收集数据
核心思想
某个线程从其他队列里窃取任务来执行
执行块的线程帮助执行慢的线程执行任务,提升整个任务效率
队列要采用双向队列
工作窃取
执行任务的线程池
ForkJoinPool
表示任务,用于ForkJoinPool的任务抽象
ForkJoinTask
执行任务的工作线程
ForkJoinWorkerThread
核心类
Fork/Join
其他
CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构
key-value键值对
Node
红黑树节点
TreeNode
就相当于一颗红黑树,其构造方法其实就是构造红黑树的过程
TreeBin
辅助节点,用于ConcurrentHashMap扩容操作
控制标识符,用来控制table初始化和扩容操作的
负数代表正在进行初始化或扩容操作
-1代表正在初始化
-N 表示有N-1个线程正在进行扩容操作
正数或0代表hash表还没有被初始化,这个数值表示初始化或下一次进行扩容的大小
含义
sizeCtl
ForwardingNode
重要内部类
ConcurrentHashMap初始化方法
只能有一个线程参与初始化过程,其他线程必须挂起
构造函数不做初始化过程,初始化真正是在put操作触发
sizeCtl < 0 表示正在进行初始化,线程挂起
初始化步骤完成后,设置sizeCtl = 0.75 * n(下一次扩容阈值),表示下一次扩容的大小
步骤
initTable
根据hash值计算节点插入在table的位置,如果该位置为空,则直接插入,否则插入到链表或者树中
真实情况较为复杂
table为null,线程进入初始化步骤,如果有其他线程正在初始化,该线程挂起
如果插入的当前 i 位置 为null,说明该位置是第一次插入,利用CAS插入节点即可,插入成功,则调用addCount判断是否需要扩容。若插入失败,则继续匹配(自旋)
若该节点的hash ==MOVED(-1),表示有线程正在进行扩容,则进入扩容进程中
其余情况就是按照链表或者红黑树结构插入节点,但是这个过程需要加锁(synchronized)
put
table ==null ;return null
从链表/红黑树节点获取
get
多线程扩容
构建一个nextTable,其大小为原来大小的两倍,这个步骤是在单线程环境下完成的
将原来table里面的内容复制到nextTable中,这个步骤是允许多线程操作
扩容
所在链表的元素个数达到了阈值 8,则将链表转换为红黑树
红黑树算法
链表转换为红黑树过程
重要操作
1.8 与 1.7的区别
ConcurrentHashMap
基于链接节点的无边界的线程安全队列,采用FIFO原则对元素进行排序,内部采用CAS算法实现
在入队的最后一个元素的next为null
队列中所有未删除的节点的item都不能为null且都能从head节点遍历到
对于要删除的节点,不是直接将其设置为null,而是先将其item域设置为null(迭代器会跳过item为null的节点)
允许head和tail更新滞后。这是什么意思呢?意思就说是head、tail不总是指向第一个元素和最后一个元素(后面阐述)
不变性
head的不变性和可变性
tail的不变性和可变性
精妙之处:利用CAS来完成数据操作,同时允许队列的不一致性,弱一致性表现淋漓尽致
ConcurrentLinkedQueue
第三种key-value数据结构:SkipList(跳表)
平衡二叉树结构
Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率
由很多层结构组成,level是通过一定的概率随机产生的
每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
最底层(Level 1)的链表包含所有元素
如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出
每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素
查找、删除、添加
SkipList
ConcurrentSkipListMap
内部采用ConcurrentSkipListMap实现
ConcurrentSkipListSet
Java并发集合
用于通过原子的方式更新基本类型
原子更新布尔类型
AtomicBoolean
原子更新整型
AtomicInteger
原子更新长整型
AtomicLong
基本类型类
通过原子的方式更新数组里的某个元素
原子更新整型数组里的元素
AtomicIntegerArray
原子更新长整型数组里的元素
AtomicLongArray
原子更新引用类型数组里的元素
AtomicReferenceArray
数组
如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类
原子更新引用类型
AtomicReference
原子更新引用类型里的字段
AtomicReferenceFieldUpdater
原子更新带有标记位的引用类型
AtomicMarkableReference
引用类型
如果我们只需要某个类里的某个字段,那么就需要使用原子更新字段类
原子更新整型的字段的更新器
AtomicIntegerFieldUpdater
原子更新长整型字段的更新器
AtomicLongFieldUpdater
原子更新带有版本号的引用类型
字段类
atomic
一个由数组实现的FIFO有界阻塞队列
ArrayBlockingQueue有界且固定,在构造函数时确认大小,确认后不支持改变
在多线程环境下不保证“公平性”
ArrayBlockingQueue
基于链接,无界的FIFO阻塞队列
LinkedBlockingQueue
支持优先级的无界阻塞队列
默认情况下元素采用自然顺序升序排序,可以通过指定Comparator来对元素进行排序
父节点的键值总是大于或等于任何一个子节点的键值
最大堆
父节点的键值总是小于或等于任何一个子节点的键值
最小堆
分类
添加操作则是不断“上冒”,而删除操作则是不断“下掉”
二叉堆
ReentrantLock + Condition
PriorityBlockingQueue
支持延时获取元素的无界阻塞队列
缓存:清掉缓存中超时的缓存数据
任务超时处理
应用
根据Delay时间排序的优先级队列:PriorityQueue
用来标记那些应该在给定延迟时间之后执行的对象
该接口要求实现它的实现类必须定义一个compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。
Delayed接口
DelayQueue
一个没有容量的阻塞队列
交换工作,生产者的线程和消费者的线程同步以传递某些信息、事件或者任务
难搞懂,与Exchanger 有一拼
SynchronousQueue
链表组成的的无界阻塞队列
相当于ConcurrentLinkedQueue、SynchronousQueue (公平模式下)、无界的LinkedBlockingQueues等的超集
有就直接拿走,没有就占着这个位置直到拿到或者超时或者中断
预占模式
LinkedTransferQueue
由链表组成的双向阻塞队列
容量可选,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer.MAX_VALUE
“工作窃取”模式
运用
LinkedBlockingDeque
阻塞队列
通过重复利用已创建的线程降低线程创建和销毁造成的消耗
降低资源消耗
当任务到达时,任务可以不需要等到线程创建就能立即执行
提高响应速度
进行统一分配、调优和监控
提高线程的可管理性
好处
静态工厂类,提供了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 、Callable 等类的静态工厂方法
Executors
线程池中核心线程的数量
corePoolSize
线程池中允许的最大线程数
maximumPoolSize
线程空闲的时间
keepAliveTime
keepAliveTime的单位
unit
用来保存等待执行的任务的阻塞队列
使用的阻塞队列
workQueue
用于设置创建线程的工厂
DefaultThreadFactory
threadFactory
RejectedExecutionHandler,线程池的拒绝策略
AbortPolicy:直接抛出异常,默认策略
CallerRunsPolicy:用调用者所在的线程来执行任务
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务
DiscardPolicy:直接丢弃任务
handler
参数含义
可重用固定线程数的线程池
corePoolSize和maximumPoolSize一致
使用“无界”队列LinkedBlockingQueue
maximumPoolSize、keepAliveTime、RejectedExecutionHandler 无效
分析
newFixedThreadPool
使用单个worker线程的Executor
corePoolSize和maximumPoolSize被设置为1
使用LinkedBlockingQueue作为workerQueue
newCachedThreadPool
会根据需要创建新线程的线程池
corePoolSize被设置为0
maximumPoolSize被设置为Integer.MAX_VALUE
SynchronousQueue作为WorkerQueue
如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程 ,可能会耗尽CPU和内存资源
newSingleThreadExecutor
线程池分类
Executor.execute()
ExecutorService.submit()
任务提交
任务执行
两种模型
线程池调优
线程池监控
ThreadPoolExecutor
继承自ThreadPoolExecutor
给定的延迟之后运行任务,或者定期执行任务
内部使用DelayQueue来实现 ,会把调度的任务放入DelayQueue中。DelayQueue内部封装PriorityQueue,这个PriorityQueue会对队列中的ScheduledFutureTask进行排序
ScheduledThreadPoolExecutor
Executor
异步计算
执行任务的取消
查询任务是否完成
获取任务的执行结果
提供操作
Future
实现RunnableFuture接口,既可以作为Runnable被执行,也可以作为Future得到Callable的返回值
内部基于AQS实现
FutureTask
线程池
Java并发体系总结笔记
https://git-scm.com/downloads
Git下载地址
选择不同系统安装包安装
Git安装(Window/Mac)
出现Git Bash命令行工具或Git GUI工具
git --version 查看git安装版本
检验是否安装成功
Git 安装
工作区(Working Directory)
暂存区(stage/index)
head唯一指向
master
版本库(repository)
Git 结构
Untracked(未被跟踪的)
Unmodify(文件已经入库)
Modified(文件已修改)
Staged(暂存状态)
Git 文件的4种状态
初始化git仓库
出现.git文件夹
git init
将文件添加到暂存区
git add
将工作空间下所有文件添加到暂存区(new,modifyed)
git add .
将工作空间下所有文件添加到暂存区(new,modifyed,delete)
git add -A
将工作空间下所有文件添加到暂存区(modifyed,delete)
git add -u
git add
将暂存区的文件提交到版本库
git commit -m <commit message>
跳过git add 命令,直接将工作区所有已跟踪的文件提交到版本库,未跟踪的(untracked)文件不能使用该命令
git commit -am <commit message>
git commit
git status -s
git status
git log --graph --oneline
git log --oneline
git log
git config --global user.name zivszheng
git config --global user.email zivs.zheng@gmail.com
git全局配置命令
git config --list
查看配置
项目父路径/.git/config文件
单个项目配置
git config
暂存本地修改内容(不想提交修改的内容,想切换分支)
git stash
查看暂存的历史记录
git stash list
恢复之前暂存的某个记录
git stash apple --index
删除某个暂存记录
git stash drop --index
用于从工作区和索引中删除文件
git rm -r .idea
git commit -m 'remove .idea'
git push origin master
git rm
Git基本命令
项目目录结构
tree
指向上一个commit Object
parent
author/commiter
commit message
commit Object/master/HEAD
git cat-file -p HEAD/唯一ID
git cat-file -t HEAD/唯一ID
查看对象
Git commit 解析
比较本地工作空间和staged区的差异
git diff
比较staged区和本地仓库中的差异
git diff -- staged
比较本地工作空间和本地仓库中的差异
git diff HEAD
Git diff
撤销上一次提交将暂存区的文件重新提交(改写提交)
git commit --amend
拉取暂存区的文件并将其替换工作区的文件
注意与git checkout branchname 区别
git checkout --filename
拉取最近一次提交到版本库中的文件到暂存区,该操作不影响工作区
git reset HEAD --filename
硬回滚(不可逆的),即暂存区,工作区全部用指定提交版本的目录树替换掉
--hard
mixed或不使用参数,覆盖暂存区,但不覆盖工作区
--mixed
软回滚,不进行暂存区和工作区的覆盖
--soft
git reset --option 版本号
Git 撤销操作
查看分支
git branch
创建分支
git branch
修改分支名称
git branch -m
切换分支
git checkout
创建并切换分支
git checkout -b
删除分支
git branch -d
git 分支创建、修改、删除、切换
合并指定分支到当前分支(Fast forward)
git merge
合并指定分支到当前分支(-no-ff 参数表示禁用Fast forward)
git merge -no-ff -m <commit message>
分支合并
git reflog --date=local | grep <branchname>
查看分支来自哪一个分支
Git 分支
git clone http://gitlab.xqchuxing.com/gittest/xqchuxing-test.git
git clone
查看远程信息
git remote -v
git remote
将本地上分支上推到
git push -u origin master
git push
获取远程的dev分支和本地的master分支合并
git pull origin dev:master
获取远程的dev分支和当前分支合并,实际是先执行git fetch 后再执行git merge
git pull origin dev
git pull
获取远程dev分支但不做合并
git fetch origin dev
git fetch
Git远程仓库
git remote add origin http://gitlab.xqchuxing.com/gittest/xqchuxing-test.git
关联远程仓库
查看当前所有tag
git tag
创建tag
git tag
创建一个指向某一次提交的tag
git tag
git tag -a -m <message>
查看tag
git show
Git tag
git help
git help <command>
官网文档地址 https://git-scm.com/book/zh/v2
Git Help
Git 命令总结笔记
出现的原因
设计理念
Docker是什么
美团
京东
企业级
开发和运维
能干什么
www.docker.com
www.docker-cn.com
获取
hub.docker.com
仓库
参考官方文档
配置仓库地址
安装
镜像
组成
docker version
docker info
docker --help
帮助命令
-a 列出所有镜像
-q 只显示镜像ID
--digests:显示摘要信息
--no-trunc:不截断输出,显示完整的镜像ID
docker images
镜像命令
docker search 镜像名
删除单个 docker rmi 镜像id/镜像名称
删除多个镜像 docker rmi id1 id2
删除全部镜像 docker rmi ${docker images -qa}
docker rmi 删除镜像
OPTIONS --name为容器指定新名称 -d 后台运行 -i交换方式运行 -t伪终端 -p端口映射 -P随机端口映射
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
新建并运行
-a :所有正在运行和运行过的-l: 显示最近创建的容器-n:显示最近创建的n个容器-q:只显示容器id
docker ps [options]
列出所有运行的容器
exit / ctrl + d:退出并停止容器
ctrl+p+q:退出不停止容器
退出容器
docker start 容器id/名称
启动容器
docker restart 容器id/名称
重启容器
docker stop 容器id/名称
停止容器
docker kill 容器id/名称
强制停止所有容器
docker rm 容器id/名称
删除容器
docker rm -f $(docker ps -aq)docker ps -a -q | xargs docker rm
删除所有容器
docker run -d 容器
以后台方式运行容器
docker exec -t 容器id/名称 bashshell 产生新的进程
docker attach 容器id/名称 进入容器不产生新的进程
进入正在运行的容器,并以前台方式运行
docker copy 容器id/名称:容器中路径 主机路径docker copy 主机路径 容器id/名称:容器中路径
容器 <->拷贝文件<->主机
docker 运行命令
命令
UnionFS(联合文件系统)
镜像加载原理
分层镜像
为什么采用这种设计
是什么
docker commit -m="" -a="作者" 容器id 目标镜像名称:[标签名]
docker commit 镜像提交
Bridge Network
Host Network
None Network
单机
Overlay Network
多机
网络
基础镜像,当前镜像是基于那个镜像
FROM
镜像维护者的姓名和邮箱地址
MAINTAINER
镜像构建时需要运行的命令
RUN
容器创建后,默认在那个目录
WORKDIR
当前容器对外暴露的接口
EXPOSE
用来构建镜像时设置环境变量
ENV
将宿主机目录下的文件copy到镜像且ADD命令会自动解压压缩包
ADD
COPY
容器数据卷,用来保存和持久化
VOLUME
指定容器启动时需要运行的命令
多条CMD命令,只有最后一条生效
CMD命令会被docker run之后的参数替换
CMD
指定容器启动过程中需要运行的命令
把docker run命令的参数追加到后面
ENTRYPOINT
ONBUILD
关键字
Dockerfile介绍
数据卷
日志系统存储(典型场景)
docker run -it --name n1 --volumes-from n0 centos
使用
数据容器卷
Docker总结笔记
4 面试专题突破
\"牛码社\"一个针对Java服务端同学维护一片高效、纯净、互动互助学习社区
Java开发扫盲总结 (牛码社出品)
0 条评论
回复 删除
下一页