单例模式(考虑多线程)

简介:

下面这个程序比较经典,现在忘了. 先保存下来.

复制代码
  1 import java.util.ArrayList;
  2 
  3 public final class SingletonObject {
  4     private static SingletonObject obj;
  5     private SingletonObject(){}
  6     //如果在方法上声明同步,会成为系统并发访问的瓶颈
  7     public static SingletonObject getInst(){
  8         if(obj == null){
  9             synchronized("aa"){
 10                 if(obj == null){
 11                     obj = new SingletonObject();
 12                 }
 13             }
 14         }
 15         return obj;
 16     }
 17 
 18     //1.将对象声明到类中作为类变量,初始化
 19     //违反了第一条
 20     //2.1.将对象声明到类中作为类变量,且不初始化
 21     //在static中初始化
 22     //总要有一个初始化的代码,写到哪里?如果写到static代码块中,那么类加载时,就会被执行,和直接写obj2 = ....一样的
 23     //上述方案违反了下面的第一条
 24     //2.2.将对象声明到类中作为类变量,且不初始化
 25     //将初始化写入到获取对象的方法中
 26     //obj2 = new SingletonObject();
 27     //上述方案违反了下面的第二条
 28     //2.2.1.将对象声明到类中作为类变量,且不初始化
 29     //在获取方法中进行null的判定,进行初始化
 30     //上述方案违反了下面的第三条
 31     //最终方案:既要进行对象的一次初始化,又不能将该初始化语句放入到获取方法中
 32     //Java中哪种方案是归属于类的模型体系下的且只执行一次,且在类加载时不进行加载,但是使用时才进行加载,那么这个方案就是最终方案
 33     //内部类解决方案
 34     
 35     private static class Inner{
 36         //将对象初始化的操作加入到内部类中
 37         private static final SingletonObject obj2 = new SingletonObject();
 38     }
 39     
 40     public static SingletonObject getInst2(){
 41         //既需要延迟加载,不使用不创建
 42         //又要保障创建的时候不会被多次创建,做成单例
 43         //又要求每次获取的时候最好不做null判定
 44         return Inner.obj2;
 45     }
 46     
 47     public static void main2(String[] args) {
 48         System.out.println(SingletonObject.getInst());
 49         System.out.println(SingletonObject.getInst());
 50         System.out.println(SingletonObject.getInst());
 51     }
 52     
 53     public static void main(String[] args) {
 54         
 55         long t1 = System.currentTimeMillis();
 56         long start = 90000000000000001L;
 57         long end = 90000000000000100L;
 58         long refMax = (long)Math.sqrt(end);
 59         ArrayList<Long> primes = new ArrayList<Long>();
 60         OUT:
 61         for(long i = 2;i <= refMax ; i++){
 62             for(long j = 2;j<= Math.sqrt(i);j++){
 63                 if(i % j == 0){
 64                     continue OUT;
 65                 }
 66             }
 67             primes.add(i);
 68         }
 69         System.out.println("end");
 70         OUT:
 71         for(long i = start;i<=end;i++){
 72             for(Long prime:primes){
 73                 if(i % prime == 0){
 74                     continue OUT;
 75                 }
 76             }
 77             System.out.print(i+"\t");
 78         }
 79         long t2 = System.currentTimeMillis();
 80         System.out.println(t2-t1);
 81         
 82         
 83         OUT:
 84         for(int i = 101;i <= 200 ; i++){
 85             for(int j = 2;j<= Math.sqrt(i);j++){
 86                 if(i % j == 0){
 87                     continue OUT;
 88                 }
 89             }
 90             System.out.print(i+"\t");
 91         }
 92     }
 93 }
 94 /*
 95 A走到这里,时间片到期,该B运行
 96 B执行完毕了,此时obj对象是B线程new出来的
 97 此时B执行完毕,A又运行,由于是从此处时间片到期,恢复运行后,还从当前行继续
 98 执行下面的代码,A线程又创建了一个对象
 99 此时B创建了一次,A创建了一次,外面最少是两个对象
100 */
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4005118.html,如需转载请自行联系原作者

相关文章
|
安全 Java
线程安全的单例模式(Singleton)
线程安全的单例模式(Singleton)
157 4
|
12月前
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
安全 Java 关系型数据库
单例模式下引发的线程安全问题
单例模式确保类在进程中仅有一个实例,适用于如数据库连接等场景。分为饿汉式与懒汉式:饿汉式在类加载时创建实例,简单但可能浪费资源;懒汉式延迟创建实例,需注意线程安全问题,常采用双重检查锁定(Double-Checked Locking)模式,并使用 `volatile` 关键字避免指令重排序导致的问题。
231 2
单例模式下引发的线程安全问题
|
设计模式 安全 Java
【多线程-从零开始-柒】单例模式,饿汉和懒汉模式
【多线程-从零开始-柒】单例模式,饿汉和懒汉模式
164 1
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
202 1
|
安全 Java
除了双重检查锁定机制外的线程安全单例模式
除了双重检查锁定机制外的线程安全单例模式
|
设计模式 SQL 安全
单例模式大全:细说七种线程安全的Java单例实现,及数种打破单例的手段!
设计模式,这是编程中的灵魂,用好不同的设计模式,能使你的代码更优雅/健壮、维护性更强、灵活性更高,而众多设计模式中最出名、最广为人知的就是Singleton Pattern单例模式。通过单例模式,我们就可以避免由于多个实例的创建和销毁带来的额外开销,本文就来一起聊聊单例模式。
330 0
|
设计模式 安全 Java
多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
158 2
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
微服务
多线程内存模型问题之在单例模式中,volatile关键字的作用是什么
多线程内存模型问题之在单例模式中,volatile关键字的作用是什么

热门文章

最新文章