首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

双锁机制和静态内部方式

  • 23-10-13 01:42
  • 3180
  • 10713
blog.csdn.net

一、双锁机制(Double-Checked Locking)是一种旨在减少线程执行开销并提高性能的编程技术。在双锁机制中,首先检查是否需要对共享资源进行加锁,并且只有在需要时才会加锁。这种方法主要用于单例模式的实现。

在单例模式中,只有一个实例会被创建并共享。在多线程环境下,为了保证线程安全,需要对单例对象进行加锁处理。但是,每次获取单例对象时都进行加锁处理可能会导致性能降低,所以需要使用双锁机制来优化。

在双锁机制中,首先判断单例对象是否已经创建,如果未创建则尝试获取锁并进行创建,这是第一个锁,防止同时多个线程同时创建对象。当第一个线程成功创建单例对象并释放锁后,后续的线程需要再次进行判断,此时单例对象已经创建完成,后续的线程无需再创建,直接返回单例对象。这个检查加锁操作是第二个锁,只有在实例未被创建时才会获取锁,避免多个线程同时进行创建操作。

经典的双锁机制实现代码如下:

  1. public class Singleton {
  2. private static volatile Singleton instance = null;
  3. private Singleton() {}
  4. public static Singleton getInstance() {
  5. if (instance == null) {
  6. synchronized (Singleton.class) {
  7. if (instance == null) {
  8. instance = new Singleton();
  9. }
  10. }
  11. }
  12. return instance;
  13. }
  14. }

需要注意的是,双锁机制虽然可以优化多线程下的性能,但是也可能会产生死锁等问题,需要严格测试和实践验证。同时,在 Java 5 以后就已经不推荐使用双锁机制来实现单例模式。更好的办法是使用静态内部类等方式实现单例模式,它们可以保证线程安全并且具有更好的性能表现。

二、静态内部方式

静态内部类是指在一个类中定义一个静态的类。静态内部类与外部类没有关系,它的访问权限与普通类一样,可以是public、private等。静态内部类的主要作用是实现内部类的封装,同时也可以实现单例模式。

利用静态内部类实现单例模式,可以避免双锁机制带来的线程安全问题,同时也不会因为类加载的机制安全问题而导致实例化多次的现象。这种方式在多线程并发访问时,也能够保证单例对象的正确性。

实现方式如下:

  1. public class Singleton {
  2. private Singleton() {}
  3. private static class SingletonHolder {
  4. private static Singleton instance = new Singleton();
  5. }
  6. public static Singleton getInstance() {
  7. return SingletonHolder.instance;
  8. }
  9. }

在上面的代码中,SingletonHolder是一个私有的静态内部类,它的实例instance是在静态初始化时被创建的,因此线程安全性可以得到保证。而getInstance()方法返回的是SingletonHolder.instance,相当于直接访问静态内部类的一个成员变量,由于SingletonHolder是一个内部类,只有在getInstance()方法被调用时,SingletonHolder才会被加载,从而创建Singleton实例,所以只会创建一次。

总的来说,使用静态内部类实现单例模式是一种线程安全且性能好的做法,推荐使用。

返回目录

注:本文转载自blog.csdn.net的打了鸡血的点狗的文章"https://blog.csdn.net/m0_53396342/article/details/130233934"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top