技术总结

设计模式:
1.单例模式
最简单的单例,应用场景(spring bean默认实现singleton模式,其他模式是clone模式prototype,session,request,global session )
public class Single{
private static Single INS = null;
private Single(){
}

public static Single getIns(){
      if(INS ==null) {
        INS = new Single();
  }
    return INS;
}

}
这才是最简单的
public class Single{
private static Single INS = new Single();
private Single(){
}

public static Single getIns(){
    return INS;
}

}

2.工厂模式(Simple factory 常见简单工厂)
public class SimpleFactory{
public static createA(){
return new A();
}
public static createB(){
return new B();
}
}

3.抽象工厂(Abstract Factory Spring beanFactory)
public class AbstaractFactory{
IA createA();

   IB createB();

}

public class MFactory impl AbstaractFactory{
IA createA();

   IB createB();

}

public class NFactory impl AbstaractFactory{
IA createA();

   IB createB();

}

4.代理模式(dubbo 动态代理)

public class AObjAgent{
AObj obj = new AObj();
public String test(){
obj .test();
}
}
public class AObj{
public String test(){}
}

5.委托模式
近似等于代理模式

6.装饰者模式(继承添加新接口)
核心思想,继承拓展
简化版
public class A{
public void m(){}
}

public class B extend A{
public void n(){}
}
复杂版
public interface A{
public void m();
}

public class AClass{
public void m(){}
}
public interface B extend A{
public void n();
}

public class B extend AClass{
public void n(){}
}

7.责任链模式(过滤器,拦截器)
public interface Filter {
public void doFilter(FilterChain chain);
}
public class FilterChain {

private List<Filter> list = new ArrayList<>();

private int index = 0;

public FilterChain addFilter(Filter filter){
    list.add(filter);
    return this;
}

public void doFilter(){
    if (index == list.size()) {return;}
    this.list.get(index++).doFilter(this);
}

}
public class AFilter implements Filter{

@Override
public void doFilter(FilterChain chain){
    System.out.println("A");
    chain.doFilter();
}

}

public class BFilter implements Filter{

@Override
public void doFilter(FilterChain chain){
    System.out.println("B");
    chain.doFilter();
}

}

8.建造者模式(StringBuilder两种建造者)
复杂的逻辑封装到方法里,隐藏构建的过程
builder
public class A{}

public class builder{
public build(){
return new A();
}
}

  1. 桥接模式(WebApplicationContext 子类抽象类)
    逻辑封装 子类传入
    public interface AInterface{
    public void aMethod();
    }
    public class A impl AInterface{
    public void aMethod(){
    }
    }
    public class B impl AInterface{
    public void aMethod(){
    }
    }

public abstract class Handler {
protected AInterface a;
public Handler(AInterface a){
this.a = a;
}
protected abstract void runA();
}
public class TestHandler {

public Handler(int i ,AInterface a){
super(a);

}
protected void runA(){
a.aMethod();
}
}
10.适配器模式Adapter

新老业务做桥接

public class A{
public void aMethod(String arg1,String arg2);
public void aMethod();

}
public interface BInterface{
public void bMethod(String arg1);
}
public class BAdapter impl AInterface{
A a = new A();
public void aMethod(String arg1){
a.aMethod(arg1,null);
a.aMethod();
}
}

11.原型模式 clone已有的对象(spring bean)
public class A impl cloneable{

}

public class Main(){
private A a = new A();

 public static void main(String[] args){
    a=A.clone();      

}
}

12.命令模式 封装指令

String test = "test";

if(test){

}
13.享元模式 线程池
降低内存损耗
线程池
14.观察者模式 事件-通知机制(两个实现,观察者模式)
事件模式

15.策略模式(一个接口多个实现,dubbo里面的mina框架,netty框架被封装成统一的接口,一个接口对应多个网络层实现)
16.模板模式(逻辑封装在父类里)

spring bean的实现
由compontentScan来扫描 spring默认xml中配置为< compontent-scan>标签标识包扫描路径
此时compontent/controller/service/Repository注解会被扫描到内存中
xml解析器(yml解析器或者其他解析器)解析bean定义,通过反射方式生成bean对象 springioc基本原理
@Bean注解方式 由开发者指定bean的定义,spring决定何时调用得到对象

rpc restful
rpc 代表 dubbo 将本地方法映射到远端 强调的主体是 动作
1.强制约定了对于接口的调用参数,接口定义
2.基于同种语言调用

restful 代表 spring cloud 体现的思想是 万物皆资源 http接口返回json为代表一系列接口

  1. 依托于api文档
    2.不同语言之间可以互相调用系统解耦更方便

设计模式六大原则:
1.开闭原则(对修改关闭,对拓展开放)
2.依赖倒置原则(依赖于接口,而不依赖于具体实现)
3.单一职责原则(一个对象只实现一项功能)
4.里氏替换原则(所有父类能出现的地方,子类一定能出现,里氏替换原则是抽象的基石)
5.合成复用原则(对象之间的组合尽可能的采用组合的方式而不是继承)
6.最小依赖原则(一个类尽可能少的依赖其他对象,减少系统的耦合性)

gc:
可达性分析
1.引用计数
2.可达性分析
gc常用的算法有
1.标记清除算法(标记垃圾对象-清除,缺点易造成内存碎片,优点速度快)
2.标记整理算法(标记垃圾对象,将非垃圾对象向内存区一端移动,再将临界点之外的内存区清除,速度缓慢,但会有效减少内存碎片,容易形成连续的内存区)
3.复制算法(标记垃圾对象,将非垃圾对象标记复制到另一个内存区,将原内存区清除,缺点需要双倍内存区,优点当费垃圾对象较少时速度快)
4.分代收集算法(老年代新生代2:8,新生代采用标记清除算法,老年代采用标记整理算法,新生代到老年代晋级多次,当在新生代一定阈值存活之后采用复制算法)其中新生代称之为(Eden伊甸区(天堂死的快的么^^),取名字伊甸园,survivor老年代,又叫幸存区)
现在沿用的收集器
CMS收集器 +XX:+UseParNewGC(我特么最开始写+UseCMSGC 囧) 收集过程 初始标记,并发标记,重新标记,并发清除四个过程、
G1收集器: -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 然后把 相较于CMS收集器的改进是:
1.内存分代不隔离

  1. 可预测停顿

java8 默认GC Parallel GC
java9 默认GC 是G1

Full GC 和 Minor GC
Minor GC Eden区GC
Full GC 清理整个内存空间
Major GC 老年代GC 一般来说 MinorGC 会出发FullGC

触发Full GC的条件

  1. System.gc()
  2. 老年代不足
  3. 永久带不足
  4. 新生代晋升老年代空间不足
  5. 堆中分配大对象,空间不足以分配

CMS收集器的收集过程
初始标记——>并发标记——>重新标记——>并发清除

即时编译JIT机制和编译优化
1.即时编译JIT,热点代码编译成本地平台机器码
算法两种:1采样定期采集栈顶方法 2. 定期统计(xx时间内打到xx次,过时减半)
两种
1。热点方法编译

  1. 回边方法编译(回边方法指的是:在代码执行流控制(跳转)的时候进行计数,达到一定阈值后编译整个方法)

ClassLoader

redis:
redis分布式锁的实现:setNx指令

redis的数据结构有:string hash list set sortedSet

CAP原则:
C 强一致性
A 可用性
P 分区容错性
定律:一个系统不可能三个同时满足,而只能同时达到三大原则中的两个

满足CA RDS mysql/sqlserver等关系型数据库
满足CP nosql为代表的 redis/mongodb/cache框架
满足AP 一些简单的数据库simple db

关系型数据库的原则为 CAP原则的变种 称之为ACID
其中 A 原子性
C 一致性
I 隔离性(独立性)
D 持久性

说说锁
乐观锁和悲观锁
悲观锁
悲观锁往往认为不加锁我完全没办法进行下一步操作
我所有数据随时有可能因为线程被挂起而会出现错误的数据
悲观锁的性能:在java中 线程的切换往往需要由用户态转换成系统太去完成线程的切换操作
其中完成了这样几部操作,保存线程A的CPU寄存器信息——>存储到CIP中——>从CIP中读取线程B的寄存器信息——>恢复执行线程B
在这其中 有可能耗费的时间比线程本身生命周期的时间还要长所以非常耗费性能
代表有synchronized,reentractLock 其中在java8中两者的性能耗费基本相同,但是 reentractLock中有一些高级特性

  1. 可以设置公平锁或者非公平锁
  2. 可以设置多个condition

在线程执行过程中,往往可能在线程挂起的下一瞬间,线程所竞争的资源就会被释放,而当线程下一次再被执行则需要好久,所以在java6以后进行线程的synchronized,reentractLock 和都会进行优化先进行自旋一段时间,当不能竞争到锁时再去进行线程挂起等待被唤醒
乐观锁
乐观锁在设计中认为随时可能资源被释放,而挂起线程是在浪费时间,因为当线程挂起的一瞬间锁就有可能被释放,所以乐观锁的设计是尽可能的不去挂起线程,而是假设程序在执行过程中都是没有冲突的,当冲突出现的时候尽可能的去尝试获取资源,直到得到资源典型代表就是CAS(Compare and Swap)
CAS
CAS在计算机中是一个CPU指令的应用(Compare and swap) 该指令是一个三操作数的指令 V A B即 内存地址 新值 旧值
其中在 x64和 x86 中是 comxchg执行来执行

在CAS中有一个bug 称之为ABA问题,即当A值被改变成B值之后又被改回A值 CAS会认为值没有改变但是实际上值已经被改变过了
解决方案是同时去改变两个值即给CAS的值是两个参数一个版本号一个目标值

公平锁和非公平锁
注意:这些划分只是单纯的从某个纬度去划分的,一个锁可能具备一个或多个特性
公平锁,当锁释放之后所有线程公平竞争没有优先级任何一个线程都有可能获得当前锁并执行,有的线程可能永远无法获取到锁
reentractLock 通过构造函数可以被构建成公平锁

非公平锁,当锁释放之后线程会按照一定优先级来竞争锁(时间,权重等)
synchronized就是一个非公平锁
reentractLock 默认也是非公平锁,可以通过boolean的构造函数来构造出公平锁
可重入锁和自旋锁
可重入锁,一个线程持有该锁之后,该线程下的子代码也持有该锁而无需再次获取,又叫递归锁
自旋锁,当一个代码获取到锁之后,其他代码访问该锁的时候不断尝试(循环)获取该锁而不是中断

读写锁
reentractReadWriteLock
读写锁允许多个线程同时读,但只允许同一个线程同时写

轻量锁和重量锁
是否会阻塞线程为标准(划重点)阻塞线程的叫重量级锁,不阻塞的叫轻量级锁

偏向锁
大多数情况下 锁不仅不存在线程竞争并且是由同一个线程多次获取,为了减小锁获取的代价

偏向锁的理解:
当一个线程被初始化的时候偏向锁是无状态的,当一个线程访问该对象的时候,检查偏向锁,将该对象的偏向锁的threadId改成自己的,当再次访问该对象的时候直接比对偏向锁的threadId如果是自己的则不用获取锁,如果不是自己的则唤醒持有该锁的线程,如果线程不存活,则直接将偏向锁记录的id改成自己的,如果线程存活,则让其继续执行完这一段代码,这时候偏向锁升级为轻量级锁,即有冲突但冲突程度很轻,这个时候如果第三个线程进来了,则认为该锁竞争程度很大,则将除了持有锁的其它线程全部阻塞,此时轻量级锁升级为重量级锁

Mark Word 当前对象状态

对象头信息:
偏向锁 地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,217评论 11 349
  • 我觉得生命是最重要的,所以在我心里,没有事情是解决不了的。不是每一个人都可以幸运的过自己理想中的生活,有楼有车当然...
    听听歌睡睡觉阅读 296评论 0 8
  • 最近总是胡思乱想,盼望着他的到来。 可心理怕怕的,总感觉失败了,精子还是精子,卵子还是卵子,它们没有相遇,没有造出...
    长颈鹿的小毛鬃阅读 99评论 0 0