1.为什么用单例?
简单来说就是全局共享一个对象,如果某对象初始化很麻烦也推荐用单例,只有一个情况下好管理,什么配置类,Util包一般情况下最好都是单例
2.单例跟static关系
两者有点像,static从理解是确实是“单例”,但是根本所处JVM区域不同,static只能在静态方法区,单例对象还可以再堆里,spring容器常见吧,这不就是一个最好的单例,JVM调优调的也主要是堆,静态区以后少用。
3.懒汉饿汉
当做一种思维来理解
4.单例实现
一定要保证私有构造,我看网上很多人忘了写这个,不私有构造,怎么成单例?
是不是final也无所谓吧,我觉得加跟不加都行。
5.双层锁单例的实现
最外层的if是减少可能排队的线程,貌似不加也行?不加的话可能会有更多的线程阻塞到里面。
中间那层锁是阻塞线程用的,目的是让线程一个一个去创建。
里面那层实际上比较重要,因为阻塞的线程可能是多个,没有这个判断里面的线程刚释放锁,外面的就立刻又创建一个了造成多次初始化会浪费。
//饿汉式
class SingleA {
public static SingleA singleA = new SingleA();
public static SingleA getSingle(){
return singleA;
}
private SingleA() {
}
}
//懒汉式
class SingleB{
public static SingleB singleB = null;
public static synchronized SingleB getSingleB(){
if(singleB==null){
singleB=new SingleB();
}
return singleB;
}
private SingleB() {
}
}
//静态内部类
class SingleC{
public static class SingleCC{
public static SingleCC singleCC=new SingleCC();
}
public static SingleCC getSingelC(){
return SingleCC.singleCC;
}
private SingleC(){
}
}
//双层锁
class SingleD{
public static SingleD singleD = null;
public static SingleD getSingleD(){
if (singleD==null){
synchronized ("lock"){
if (singleD==null){
singleD=new SingleD();
}
}
}
return singleD;
}
private SingleD(){
}
}
class SingleE{
enum Color{
Name("颜色");
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
Color(String name) {
this.name = name;
}
}
public static void main(String[] args) {
}
}