单例模式的饿汉模式为啥是线程安全的

发布网友 发布时间:2022-04-20 09:04

我来回答

4个回答

热心网友 时间:2023-09-29 01:39

多线程主要是利用cpu,而内存则是发生线程冲突的地方。内存就是你放对象的地方。所谓不安全,是破坏了数据的特性,这里就是单例。恶汉是预先建好,就这一次,自然不会出现更多实例。而懒汉,请求来时再创建,可能同时处理多个请求,创建多个实例。追问创建多个实例就不安全了吗?能再讲讲吗?可以给举个例子吗?再有操作同一个对象就安全了吗,我看那个计时器的例子,就是操作servicecount加1,线程a操作service还没有将结果写入,然后b进来又执行一次,最终计时器加1,但实际请求操作是做了两次计数,就出现线程安全问题了,那它这时候a和b操作的不也是同一个对象吗

热心网友 时间:2023-09-29 01:39

    线程安全-百度百科

    本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。

    线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

    我觉的这个定义是比较准确的。

    我的理解是这样的,线程之所以产生安全问题是对原来正确数据造成改变污染。对于单例懒汉模式下,单例类原本在多线程的情况下应该只会产生一个对象,实际上会出现产生多个对象,数据出现错误,所以说线程是不安全的;然而对与单例饿汉情况,多线程在实例化单例类时并不会出现多的对象的情况,数据正确,所以并未出现线程安全。

    对于你将的多个对像............的问题:准确的是说,多个线程访问共享资源会出现线程安全,当然这也是包含在数据被污染的大集合内。

我结合该问题写的文章,多多支持:网页链接

热心网友 时间:2023-09-29 01:40

哦哦,忽略我刚才的评论,你的问题是在 不是同一个对象是不是就不安全了 . 这个问题也不尽然啊,要具体的看这个对象干啥事.如果你刚才说的那个计时器,如果加上单例模式,就安全了.如果不加上单例模式,不安全的原因是 :
servicecount ++

这语句实际上是执行了三个步骤 ,
1 从内存中读取 servicecount 的值,
2 servicecount 加上1
3 将servicecount 保存到内存.
如果第一个线程还没有把加一之后的 servicecount 值保存到内存,这时候第二个线程进来,读取的值,也是第一线程读取的值,这时候就出问题.
如果这个方法,能够用syncronized修饰,那么无论几个线程进来,都没有问题了.就没有必要进行单例了.所以你的处理办法是
syncronized{
servicecount ++ ;
}
而不是用单例.
结论 : 单例能够保证获取的类的实例只有一个,这时候是安全的.
是否选择单例,跟具体业务有关系
不是单例模式,也不一定就是不线程安全的(这是废话)

热心网友 时间:2023-09-29 01:40

单例模式之饿汉式,由于是在类加载时加创建了对象,且类加载只会加载一次(不考虑特殊极端情况),适合全局唯一的对象,比如MyBatis中的SqlSessionFactory对象。

在多线程情况下,我们使用锁来保证线程安全。就拿synchronized来说,我们通常会对一个唯一的对象进行上锁,而单例模式正好是唯一的,保证只有一个线程会抢占到锁,同一时间只会有一个线程去修改共享数据,所以是线程安全的。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com