您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java并发多线程编程——单例问题与线程安全性深入解析

小志的博客 发布时间:2021-04-16 22:03:25 ,浏览量:0

目录
    • 一、饿汉式和懒汉式单例模式(单线程示例)
    • 二、懒汉式单例模式(多线程示例)
    • 三、懒汉式单例模式(多线程示例,使用同步方法的方式)
    • 四、懒汉式单例模式(多线程示例,使用双重检查加锁方式)
    • 五、懒汉式单例模式(多线程示例,使用双重检查加锁和volatile关键字结合的方式)推荐使用此方式

一、饿汉式和懒汉式单例模式(单线程示例)

1、饿汉式单例模式代码

package com.xz.thread.t4;
/**
 * @description: 饿汉式单例模式
 * @author: xz
 */
public class HungrySingleton {
    //直接声明一个需要被单例的对象,并初始化
    private static HungrySingleton singleton=new HungrySingleton();
    //私有化构造方法
    private HungrySingleton(){}
    //对外提供一个静态的获取实例的方法
    public static HungrySingleton getInstance(){
        return singleton;
    }
}

2、懒汉式单例模式代码

package com.xz.thread.t4;
/**
 * @description: 懒汉式单例模式
 * @author: xz
 */
public class LazySingleton {
    //直接声明一个需要被单例的对象,
    private static LazySingleton singleton2;
    //私有化构造方法
    private LazySingleton(){}
    public static  LazySingleton getInstance(){
        if(singleton2 == null ){
            singleton2=new LazySingleton();
        }
        return singleton2;
    }
}

3、饿汉式和懒汉式单线程测试类

package com.xz.thread.t4;

/**
 * @description:
 * @author: xz
 */
public class Main {
    public static void main(String[] args) {

        HungrySingleton st1= HungrySingleton.getInstance();
        HungrySingleton st2= HungrySingleton.getInstance();
        HungrySingleton st3= HungrySingleton.getInstance();
        System.out.println("饿汉式单例模式=========");
        System.out.println(st1);
        System.out.println(st2);
        System.out.println(st3);

        LazySingleton s1= LazySingleton.getInstance();
        LazySingleton s2= LazySingleton.getInstance();
        LazySingleton s3= LazySingleton.getInstance();
        System.out.println("懒汉式单例模式=========");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

4、输出结果 在这里插入图片描述 5、结论

  • 由第4步输出结果截图可知,在单线程情况下,饿汉式和懒汉式单例模式都是获取的同一对象。
二、懒汉式单例模式(多线程示例)

1、懒汉式单例模式代码

package com.xz.thread.t4;

/**
 * @description: 懒汉式单例模式
 * @author: xz
 */
public class LazySingleton {
    //直接声明一个需要被单例的对象,
    private static LazySingleton singleton2;
    //私有化构造方法
    private LazySingleton(){}

    public static  LazySingleton getInstance(){
        if(singleton2 == null ){
            singleton2=new LazySingleton();
        }
        return singleton2;
    }
}

2、懒汉式多线程测试类

package com.xz.thread.t4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @description: 
 * @author: xz
 */
public class ThreadMain {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        for(int i=0;i            
关注
打赏
1661269038
查看更多评论
0.0439s