• 一个单例模式的简单例子


    ex1:
    public class Singleton   
    {   
        private static final Singleton singleton = null;   
      
        private Singleton()   
        {   
        }   
        public static Singleton getInstance()   
        {   
            if (singleton== null)   
            {   
                singleton= new Singleton();   
            }   
            return singleton;   
        }   
    }  
     
    这个不多说了,肯定是错误的,如果多个线程访问的时候都是==null,那么接下来就是产生多个实例。不算单例模式。
    ex2:
    public class Singleton   
    {   
        private static final Singleton singleton = null;   
      
        private Singleton()   
        {   
        }   
        public static Singleton getInstance()   
        {   
            if (singleton== null)   
            {   
                synchronized (Singleton.class) {   
                    singleton= new Singleton();   
                }   
            }   
            return singleton;   
        }   

    这个虽然加了同步锁,但是如果多个线程同步访问==null,那么还是会产生多个实例,只是产生实例的时候同步而已。
    ex3:
     public class Singleton   
    {   
        private static final Singleton singleton = null;   
      
        private Singleton()   
        {   
        }   
        public static Singleton getInstance()   
        {   
            synchronized (Singleton.class)   
            {   
                if (singleton== null)   
                {   
                    singleton= new Singleton();   
                }   
            }   
            return singleton;   
        }   

    这个就可以了,但是这个地方对于每个访问的这个方法都是同步,而最需要的同步只是在new的地方,所以这样做虽然保证了单例,但是效率有点低哦。
    ex4:
    public class Singleton   
    {   
        private static final Singleton singleton = null;   
      
        private Singleton()   
        {   
        }   
        public static Singleton getInstance()   
        {   
            if (singleton== null)   
            {   
                synchronized (Singleton.class)   
                {   
                    if (singleton== null)   
                    {   
                        singleton= new Singleton();   
                    }   
                }   
            }   
            return singleton;   
        }   

    这个不错,保证了单例。这个叫做double-check 双重检查。
    还有一个比较简单的写法。
    ex5:

    public class Singleton    
    {    
        private static final Singleton singleton = new Singleton();
       
        private Singleton()    
        {    
        }    
        public static Singleton getInstance()    
        {    
            return singleton;    
        }    
    }  

    这样也可以,具体2种差别就不多说了。下面这个看起来要简单好多的哈


  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/jrmy/p/14316348.html
Copyright © 2020-2023  润新知