本文收集整理关于线程安全的单例模式的相关议题,使用内容导航快速到达。
内容导航:
Q1:Java的单例模式是不是线程安全的?
单例也不能保证100%线程安全的。解决方法就是创建实例方法中加入Java关键字synchronized。
Java语言的关键字synchronized,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。
Q2:怎么实现一个线程安全的单例模式
设计模式在面试中挺常考的,单例模式是考的最多的。线程安全的单例还有很多种实现方法。可以使用静态内部类、双重校验锁、静态代码块等。
123456789101112131415161718191、饿汉式publicclassSingleton(){privatestaticSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}2、懒汉式publicclassSingleton(){privatestaticSingletoninstance;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}Q3:单例设计模式恶汉和懒汉哪个线程安全
饿汉式获取实例的步骤简单所以线程更安全。懒汉式只是不会在类加载时即创建静态对象而效率略高,而因此也导致有判断是否已创建对象环节会使线程变得不安全,需要加同步锁才能解决该问题。
WWw.YijitA@o.com
Q4:单例模式的饿汉模式为啥是线程安全的
哦哦,忽略我刚才的评论,你的问题是在不是同一个对象是不是就不安全了 . 这个问题也不尽然啊,要具体的看这个对象干啥事.如果你刚才说的那个计时器,如果加上单例模式,就安全了.如果不加上单例模式,不安全的原因是 :
servicecount ++
这语句实际上是执行了三个步骤 ,
1 从内存中读取 servicecount 的值,
2 servicecount 加上1
3 将servicecount 保存到内存.
如果第一个线程还没有把加一之后的 servicecount 值保存到内存,这时候第二个线程进来,读取的值,也是第一线程读取的值,这时候就出问题.
如果这个方法,能够用syncronized修饰,那么无论几个线程进来,都没有问题了.就没有必要进行单例了.所以你的处理办法是
syncronized{
servicecount++ ;
}
而不是用单例.
结论 : 单例能够保证获取的类的实例只有一个,这时候是安全的.
是否选择单例,跟具体业务有关系
不是单例模式,也不一定就是不线程安全的(这是废话)
Q5:Java单例模式饿汉式会有线程安全问题吗
标准的答案!饿汉式没有线程安全问题,懒汉式需要双重锁定解决可能的线程安全问题。
饿汉式的缺点是类一加载就实例化,提前占用系统资源
Q6:如何用c++实现一个线程安全的单例模式
static Singelton* GetInstance()这个不是创建指针,而是指明该函数返回的类型是Singelton的指针;
Singelton *s=Singelton::GetInstance();前面的Singelton *s 只是定义个指针,指向的类型是Singelton ,他保留的只是地址,所以不用构造并没有调用任何函数。
Singelton*Singelton::instance_; 这个只是实例化一次instance_;
最好应该这样做Singelton*Singelton::instance_=NULL;否则他就是一个野指针,这样很危险。
Q7:Java线程安全的单例模式的几种实现
四种线程安全的单例模式实现方式,其实并不局限于这四种,本文只是起一个抛砖引玉的作用。