「java单例模式线程安全」java实现线程安全的单例模式
本篇文章给大家谈谈java单例模式线程安全,以及java实现线程安全的单例模式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java 在单例模式饿汉式中使用成员变量是线程安全的吗?
你好,很高兴回答你的问题。
如果没有做同步处理,是线程不安全的。
获取单例对象的方法需要做同步处理。
如果有帮助到你,请点击采纳。
设计模式之单例模式
单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。
下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。
如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。比如,配置信息类,全局 ID 生成器等。
要实现一个单例,我们要考虑以下几点:
懒汉式相对于饿汉式的优势是 「支持延迟加载」 。但缺点也很明显,因为使用了 synchronized 关键字导致这个方法的 「并发度很低」 。如果这个单例类偶尔会被用到,那这种实现方式还可以接受。但是,如果频繁地用到,就会导致性能瓶颈,这种实现方式就不可取了。
这是一种既支持延迟加载、又支持高并发的单例实现方式。
在 java1.5 以下 instance = new Singleton(); 有指令重排问题,需要给 instance 成员变量加上 volatile 关键字,java1.5 之后不会再这个问题。
这种方式利用了 Java 的静态内部类,有点类似饿汉式,但又能做到了延迟加载。
当外部类 Singleton 被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。insance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。
这是一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式是通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。
上面的单例类对象是进程唯一的,一个进程只能有一个单例对象。那如何实现一个线程唯一的单例呢?
假设 IdGenerator 是一个线程唯一的单例类。在线程 A 内,我们可以创建一个单例对象 a。因为线程内唯一,在线程 A 内就不能再创建新的 IdGenerator 对象了,而线程间可以不唯一,所以,在另外一个线程 B 内,我们还可以重新创建一个新的单例对象 b。
我们通过一个 ConcurrentHashMap 来存储对象,其中 key 是线程 ID,value 是对象。这样我们就可以做到,不同的线程对应不同的对象,同一个线程只能对应一个对象。实际上,Java 语言本身提供了 ThreadLocal 工具类,可以更加轻松地实现线程唯一单例。
如何创建线程?如何保证线程安全?
创建线程的方式一:继承Thread类(由于Java单继承的特性,这种方式用的比较少)
步骤:
1、继承Thread类,然后重写run方法
请点击输入图片描述
2、创建子类对象,然后调用start()方法来启动线程
请点击输入图片描述
我们可以看到这边现在只创建了一个线程,那么如果要创建多个线程要怎么做呢?通过继承Thread的方式创建线程,想要创建多个不同的线程就要先创建多个不同的继承Thread的类,然后再根据上面的步骤1,2来创建线程,这显然有些麻烦,为了展示多线程,我们先在上面的线程中增加一个主线程,也就是main方法中执行的线程。如下:
请点击输入图片描述
创建线程的方式二:实现Runnable接口(Java可以实现多个接口,这种方式常用)
步骤:
1、创建一个类实现Runnable接口,然后重写run方法
请点击输入图片描述
2、创建实现类对象、代理类对象,然后代理类对象调用start()方法启动线程
用实现Runnable接口的方式,实现多线程:
《模拟抢票系统》,代码如下:
线程调用了start()方法,并不意味着立即执行,而是到就绪状态,等待cpu的调度,所以每次执行的结果都是不一样的。
创建线程的方式三:实现java.util.concurrent并发包下的Callable接口(进阶版,初学者做个了解)
步骤:
1、创建一个类实现Callable接口,然后重写call()方法
(和run方法不一样的是,call方法可以有返回值,并且可以抛出异常)
2、创建Callable的实现类对象--》创建执行服务--》提交执行服务得到Future对象--》获取结果--》停止服务
Java单例模式饿汉式会有线程安全问题吗
标准的答案!饿汉式没有线程安全问题,懒汉式需要双重锁定解决可能的线程安全问题。
饿汉式的缺点是类一加载就实例化,提前占用系统资源
java单例模式线程安全的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java实现线程安全的单例模式、java单例模式线程安全的信息别忘了在本站进行查找喔。