Java方向知识点梳梳理(二)

续接前文,主要是笔记草稿太多。。。

线程本地存储:若一个变量要被某个线程独享,Java.lang.Threadlocal类来实现线程本地存储功能,每一个线程的Thread对象都有一个ThreadLocalMap对象,该对象存储一组以ThreadLocal.threadlocalHashCode为键,以本地线程变量为值得K-V值对。

ThreadLocal对象:是当前线程threadlocalMap得访问入口,键:threadLocalHashCode,值:线程K-V值对中得本地线程变量

锁优化:为了更高效地在线程之间共享数据

自旋锁:物理机器上有一个以上地处理器,能够让两个或 以上的线程同时并行执行,我们可以让后面请求锁的那个线程“稍微等等”但不放弃处理器的执行时间,看持有锁的线程是否很快释放锁。为了让线程等待,只需让线程只需一个忙循环(自旋)
如果锁占用时间比较短,自旋锁效果就好,如果占用时间多,那效果就不好。
JDK1.6引入自适应的自旋锁,即自旋的时间以及锁的拥有者的状态来决定。

锁消除:指虚拟机即时编译器在运行时对一些代码上要求同步,但被检测到不可能存在共享数据竞争的锁进行消除。
求两个链表的公共节点:长短共同前进找公共点
判断树的深度:

int TreeDepth(BinTreeNode*root){
     if(root==null)
       return 0;
     int left=TreeDepth(root->left);
     int  right=TreeDepth(root->right);
  return  (left>right)?(left+1):(right+1);
}

判断树是否平衡:

bool  balanced(BinTree*root){
      if(root==null)
          return true;
      int left=TreeDepth(root->left);
      int right=TreeDepth(root->right);
      int diff=left-right;
      if(diff>1||diff<-1)
        return false;
      return balanced(root->left)&&balanced(root->right);
   }      

哈夫曼树:构建思想:反复选择两个最小值,合并,直到剩下一个元素,哈夫曼编码:左0右1
对同一组叶子来说,哈夫曼树可以是不唯一的,但最小带全路径长度一定是唯一的。
redis的持久化:
RDB:指定时间间隔将内存快照写入硬盘
AOF:日志方式,可恢复
事件驱动型适合IO密集型服务、多线程或进程适合于CPU密集型服务

nginx是一个高性能web和反向代理服务器,开源项目,采用C 编写的,简单的负载均衡和容错机制。采用了模块化事件驱动、异步以及非阻塞架构,并大量采用了多路复用及事件通知机制。

nginx工作方式:单工作进程(默认)、多工作进程

客户端发起请求到服务器网卡、网卡接受请求转交给内核处理、内核根据对应的套接字将请求交给工作在用户空间的web服务器进程。web服务器申请系统调用,获取相应的资源,再原路返回响应。

Nginx支持的负载均衡调度算法:轮询(默认)、weight、IP-hash、fair(根据响应时间)、url-hash

Nginx分为守护进程:master进程、4个业务进程:worker进程

提高web服务器的并发连接处理能力:
①基于线程,即一个进程生成多个线程,每个线程响应用户的请求
②基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。
③基于磁盘AIO(异步IO)
④支持mmap内存映射(传统的是页面输入到磁盘再到内核缓存再复制到web服务器上,mmap机制则是让内核缓存与磁盘进行映射,web服务器直接复制到页面内容即可,不在需要将磁盘上的页面输入到内核缓存上去)

MySQL单进程多线程:
主键:表的唯一标识,一般都是一个字段
复合主键:表中多个字段的集合
外键:表内A 字段参照另一表中字段B,则称A为外键

第一范式:满足数据库基本要求
第二范式:基于1NF,每个非关键字仅函数依赖于主键(主键为一个字段一般都满足2NF)
第三范式:不存在非关键字函数依赖于其他任何非关键字
OLTP:InnoDB存储引擎:支持事务处理,主要面向在线事务处理 (MySQL默认)
OLAP:MyISAM:以高速著称,面向在线分析

事务四大特性:ACID
原子性:事务要么成功,要么失败
一致性:事务执行前和执行后处于一致性状态,即总量不变
隔离性:多个并发事务之间不相互干扰
持久性:事务一旦提交,其对数据的改动是永久性的
事务隔离性:
1、脏读:一个事务访问了另一个事务未提交的数据
2、不可重复读:一个事务操作导致另一个事务前后读取数据不一致
3、幻读:一个事务操作导致另一个事务前后查询数量不一致

Serializeable:可避免脏读、不可重复读、幻读
Repeatable:可避免脏读,不可重复度(MySQL默认)
ReadCommit:可避免脏读
ReadunCommited:无任何保证

垂直拆分:表与表之间的IO竞争
水平拆分:单表中的数据量增长问题

Spring对事务控制的支持统一再transaction Definition类中,有几个重要的接口:
事务传播行为int getPropagation Behavoi
事务隔离级别int getSalationLevel()
事务过期时间int getTimeout()
事务读写特性boolean isReadonly()

除事务传播行为(有6个事务传播属性)是凭借自身框架完成的,其他都是借助底层资源完成

线程池:Runnable和Callable区别:
run()方法:提交给Thread包装没有返回值、不抛出异常
call()方法:提交给ExecuteService执行,可抛出异常,有返回值
红黑树性质5、:
1、每个节点都只能是红色或者黑色
2、根节点是黑色
3、每个叶子节点都是黑色
4、一条路径上不能出现相邻的两个红色节点
5、从任一节点到其每个节点所包含路径中包含相同的黑色节点

Servlet生命周期:加载、创建、初始化、处理请求、卸载
IOC控制反转:DI依赖注入,由容器动态将依赖关系注入到组件之中,注入对象之间依赖关系的方式有:赋值注入和构造器注入

ORM对象关系映射持久化层:hibernate
①获取配置文件,获得服务对象,获得SessionFactory,创建Session(opensession和getcurrentsession)
final:用于声明属性、方法和类
finally:异常处理、表示总是执行
finalize:覆盖此方法提供垃圾收集时的其他资源

Adapter模式:两种:
①直接继承父类实现接口,类适配器模式(使用继承的适配器)线程上下文加载
②将父类声明为private,然后直接new父亲调用父类方法,对象的适配器模式(使用委托的适配器)双亲委派类加载

TemplateMethod模式:在父类中定义处理流程框架,在子类中实现具体流程处理,使用继承来改变程序行为,抽象类覆盖具体类
里氏替换原则(LSP):无论在父类类型的变量中保存哪种子类的实例,程序都能工作
子类责任:子类具有实现在父类中所声明的抽象方法的责任
FactoryMethod模式:用TemplateMethod模式来构建生成实例的工厂,父类决定实例的生成方式,但并不决定所要生成的具体类,具体的处理全部交由子类负责,这样可以将生成的实例的框架和实际负责生成实例的类解耦.
Linux文件权限:每个文件三个安全等级:文件属性、能访问文件的默认属组、系统上其他用户

ArrayList和Vector区别:都实现List接口,继承Collection接口,有序集合,Vector线程安全,方法之间都是线程同步的,动态数组Arraylist线程不安全,方法之间都是不同步的,Vector增长为原来的一倍,Arraylist增长为原来的0.5倍。

Araylist、Vector和Linkedlist的区别:
Arraylist和Vector使用数组方式存储数据,查找很快,但插入和删除比较差
Linkedlist使用双向链表实现存储,插入更快,非线程安全
HashMap和Hashtable:都实现了Map接口,主要区别:HashMap允许空键值,且非线程安全、Hashtable不允许空键值,且线程安全,Hashtable继承自Dictionary而HashMap即Java1.2引进的Map.interface的一个实现,Hashtable的方法时Synchronized,而HashMap不是

List和Map:
List存储单列数据集合,Map存储键值,双列数据集合
List有序且允许重复,Map无序且不能重复,
List和Set都是继承Collection接口,set只能以Iterator接口取元素,而list可以通过get来明确。

String S=new String(“………”)
上述创建一个或者两个对象,字符串常量缓冲区,javac编译期间对字符串常量的相加直接优化,对变量则返回new对象。

ConcurrentHashMap结构:分段锁
这里写图片描述

分段锁Segment数据结构:
元素数量 : transient volatile int count
影响操作次数:transient int modCount
是否扩容阈值:transient int threshold
链表数组:transient volatile HashEntry< k,V>[]table
负载因子:final float loadFactory
Threshold=Capacity*loadFactory
分段锁有些方法需要跨段,如size()和containsValue()锁住整个表

ThreadPoolExecuter参数:
corePoolsize初始值
maximunpoolsize线程最大值
keepAliveTime池内线程高于corePoolsize时,经过多长时间被回收
unit时间单位
workQueue等待队列
threadFactory线程工厂类

线程同步的五种方式:
①同步方法 synchronized
②同步代码块 synchronzied
③volatile
④可重入锁,JDK1.5中新增的java.util.concurrent
⑤使用局部变量Threadlocal类

没有主键的表:数据无序放置在存储器上,一行一行排列整齐
有主键的表:表在磁盘上的顺序整齐排列转变成了树状结构,即整个表就变成了一个索引,即聚集索引(即一个表只有一个主键一个聚集索引)

主键的作用就是将表的数据转化为索引、以平衡树的格式放置

索引能加快查询速度,但增删改数据都会改变平衡树各节点中所有数据内容

非聚集索引:每次给字段建立一个新索引,字段中的数据都会被复制一份,用于生成索引,因此给表添加索引会增加表的体积MySQL索引使用场景这里写图片描述

这里写图片描述

GC的对象:虚拟机栈中引用的对象,方法去static引用的对象,方法区中常量引用的对象,本地方法栈中引用的对象
引用分为:强引用(不会)、软引用(第二次)、弱引用(第一次)、虚引用(仅通知)

垃圾若要回收,则放在一个优先队列中。
泛型 ? extend 上限
        ? super 下限
redis和memcache:都是内存数据库
memcache适合读多写少redis:数据量更少,除了支持map类型,还支持list,set和hash等结构存储。支持缓存交换,分布式:支持一主一丛,一主多从。持久化:RDB(内存->磁盘快照)、AOF(日志方式恢复)

以下内容感谢传智播客
MVC的执行流程
这里写图片描述

SpringMVC执行流程
这里写图片描述

猜你喜欢

转载自blog.csdn.net/mikeoperfect/article/details/80798221