1.关于设计模式的一些小知识
这个blog是在学完所有的设计模式以后写的,目前正在学jvm
我们会发现,其实有很多框架,或者很多技术,都是通过反射这个技术来实现的
反射技术是可以做很多事,关于zookeeper,springcloud,等暂时先了解,等后续jvm弄完了,就可以直接看spring了
2.单例
单例singleton用的非常的多,在实际项目中,比如你的配置信息,或者用户信息,都只有一份(前端中),当时写android的时候,就用到了单例,那个时候直接就是在init的时候加载了,这里主要说一下几种单例模式:
1.枚举
枚举就是创建固定对应的数据,这些数据只创建一次,本质就是若干组数据单例
这里枚举并不难,在写到HTTP_200;HTTP_500这种代码的时候,可以用枚举
enum HttpEnum{
HTTP_200(200,"返回成功"){
this.httpCode = httpCode;
this.httpMsg = httpMsg;
}
private Integer httpCode;
private String httpMsg;
public Integer gethttpCode{
return httpCode;
}
public String gethttpMsg{
return httpMsg;
}
这里举了一个枚举的小小例子,到时候用的时候再写,记得更深一些.
2.饿汉式,在初始化的时候,就把那一份单例创建出来了,所以之后哪怕开多线程,也是线程安全的,因为直接用就行了,不涉及到创建
3.懒汉式,在要用到的时候才创建,所以肯定是有线程安全问题的
4.双重检验锁
上一篇blog有提到,
先判断对象是否已经被初始化,再决定要不要加锁
这里涉及到2个双重检验锁,正确错误与否,跟编译器重排序有关
这里的错误双重检验锁,居然跟从排序有关,A线程正在初始化对象的
时候,B线程因为检测到单例不为空,对其进行访问,但是此时
对象还没有初始化完成
正确的做法是在单例对象前面加volatile ,避免重排序
但是这个尽量不要用,其实技术有很多,但是总会有一些最好的技术,是用的最多的,你要做的就是知道,然后拿来用就行了,做应用级的时候,入门的时候,知其然可以节省时间,提高效率