了解一下
核心作用
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
常见的五种单例模式的是实现方式
饿汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
public class demo1 {
private demo1(){
}
private static demo1 instance=new demo1();
public static demo1 getInstance(){
return instance;
}
}
class demo1Test{
public static void main(String[] args) {
demo1 instance=demo1.getInstance();
demo1 instance1=demo1.getInstance();
System.out.println(instance==instance1);
}
}
|
懒汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class demo2 {
private demo2(){
}
private static demo2 instance;
public static synchronized demo2 getInstance(){
if(instance==null)
{
instance=new demo2();
}
return instance;
}
}
class demo2Test{
public static void main(String[] args) {
demo2 instance=demo2.getInstance();
demo2 instance1=demo2.getInstance();
System.out.println(instance==instance1);
}
}
|
DCL懒汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
public class demo3 {
private demo3(){
}
private volatile static demo3 instance;
public static demo3 getInstance(){
if(instance==null)
{
synchronized (demo3.class){
if(instance==null)
{
instance=new demo3();
}
}
}
return instance;
}
}
class demo3Test{
public static void main(String[] args) {
demo3 instance=demo3.getInstance();
demo3 instance1=demo3.getInstance();
System.out.println(instance==instance1);
}
}
|
静态内部类实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
public class demo4 {
private demo4(){
}
private static class InnerClass{
private static final demo4 instance=new demo4();
}
public static demo4 getInstance(){
return InnerClass.instance;
}
}
class demo4Test{
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
demo4 instance=demo4.getInstance();
Constructor<demo4> demo4Constructor=demo4.class.getDeclaredConstructor(null);
demo4Constructor.setAccessible(true);
demo4 instance1=demo4Constructor.newInstance();
System.out.println(instance==instance1);
System.out.println(instance.hashCode());
System.out.println(instance1.hashCode());
}
}
|
优化静态内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| public class demo5 {
private demo5(){
synchronized (demo5.class){
if(instance!=null)
{
throw new RuntimeException("不要试图用反射破坏单例模式!");
}
}
}
private volatile static demo5 instance;
public static demo5 getInstance(){
if(instance==null)
{
synchronized (demo5.class){
if(instance==null)
{
instance=new demo5();
}
}
}
return instance;
}
}
class demo5Test{
public static void main(String[] args) throws Exception {
demo5 instance=demo5.getInstance();
Constructor<demo5> demo4Constructor=demo5.class.getDeclaredConstructor(null);
demo4Constructor.setAccessible(true);
demo5 instance1=demo4Constructor.newInstance();
System.out.println(instance==instance1);
System.out.println(instance.hashCode());
System.out.println(instance1.hashCode());
}
}
|
枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
public enum demo6 {
INTERFACE;
public demo6 getInstance(){
return INTERFACE;
}
}
class demo6Test{
public static void main(String[] args) {
demo6 anInterface = demo6.INTERFACE;
demo6 anInterface2 = demo6.INTERFACE;
System.out.println(anInterface==anInterface2);
}
}
|