单例模式,解决线程冲突

/**
 * 单例模式的使用
 *
 * 单例创建用户服务对象 没必要给每个用户都创建一个
 *
 * 单例 :1 构造方法私有化 2 创建一个私有的静态变量 3 公共的静态方法 当做入口
 *
 * @param user
 */

/*
 * 第一种单例模式
 */

// 问题 : 预先加载,没有手动实例化变量的时候 已经实例化了变量
// 当你要使用对象的时候,只是把这个变量给你

// 1 构造方法私有化 外界不能直接访问
private UserService(){}
// 2 创建一个私有的静态变量(常量)
private static final UserService USER_SERVICE = new UserService(); // 3对外提供一个 公共的 静态的 返回该对象实例的一个方法
public static UserService getInstance(){
    return USER_SERVICE; }

/**
 * 第二种    问题: 排队严重     严重影响效率     因为每个用户在计算机里面都是一个单独的线程    
 *         当 一个线程 调用UserService 对象以后    加了一把锁    
 *   别人就访问不了了
 *   
 *   
 *   单例模式的目标是什么?
 *           是为了让当前类只能产生一个对象    如果 我先后创建了多个还是单例吗?.
 * @param user
 */
private UserService(){};//构造方法私有化
private static UserService userService = null;  //先创建一个 静态变量
public static synchronized UserService getInstance(){  
    if(userService == null){   //如果为空  我返回一个新的  
        userService = new UserService();
    }
    return userService;  //如果不为空 直接返回
}

// -------------第三种---------------------
/**
 * 如果两个线程同时判断了userService是空 进去了 第一个线程创建的疏忽,锁住了,第二个需要瞪大,第一个线程创建完了之后
 * 本来是第二个,我不需要再创建了 ,但是他已经在判断里面了,所以又创建了一个 ,所以说,单例模式没有成功
 *
 * @param user
 */
private UserService(){}//构造方法私有化
private static UserService userService = null;
public static UserService getInstance() {
    if(userService == null){//如果两个或多个线程同时进入这里,判断完成后都为空,那么会创建好多对象吧,单例模式就失效了
        synchronized(UserService.class){//我现在对整个类锁了 userService = new
            UserService();
        }
    } return userService;
}

// -----------------第四种----------------
private UserService() {
}// 构造方法私有化

private static UserService userService = null;// 私有的静态变量

public static UserService getInstance() {// 获取当前类对象的方法
    if (userService == null) {
        synchronized (UserService.class) {// 现在是对整个类锁住了
            if (userService == null) {// 更上面第三章方法一样,当前就能解决第三种方法的问题(创建了多个对象),因为,就是两个同事进入上面的if判断,到这里,就会判断不通过,就会直接返回一个对象,不会在去创建新的对象
                userService = new UserService();
            }

}
    }
    return userService;
}

时间: 2024-08-05 02:59:58

单例模式,解决线程冲突的相关文章

C++拾遗--多线程:原子操作解决线程冲突

C++拾遗--多线程:原子操作解决线程冲突 前言 在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作. 正文 1.线程冲突 #include <stdio.h> #include <stdlib.h> #include <process.h> #include <Windows.h> int g_count = 0; void count(void *p) { Sleep(100); //do some work //每个线程把g_c

Spring单例模式与线程安全

问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存在这样的问题了. Spring 单例模式与线程安全 Spring 框架里的 bean ,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.

转-Spring单例模式与线程安全

问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存在这样的问题了. Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方.单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 当多用户

【多线程学习第二弹】单例模式与线程安全

Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题 同步机制的比较 ThreadLoc

1、Spring单例模式与线程安全

引自:https://www.cnblogs.com/wxd0108/p/5524756.html 一.问题背景 这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就会存在线程安全问题.如果是Spring中bean的创建模式为非单例的,也就不存在这样的问题了. 二.Spring 单例模式与线程安全 Spring 框架里的 bean ,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就

Spring学习11- Spring使用ThreadLocal解决线程安全问题

ThreadLocal是什么      早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”.其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些.      当使用ThreadLoca

C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 七.单例模式解决静态成员对象和全局对象的构造顺序难题 上回书说道,我们的程序有一个隐藏的漏洞,如果ClassRegister这个类所在的.o文件,如果在所有.o文件中是第一个被链接的的,那么就不会出问题. 这么说太抽象了,让我们画个图表 ClassRe

Android开发设计模式之——单例模式关于线程不安全问题处理

单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例模式.下面针对一些例子分析一下我们在开发过程中应用单例模式需要注意的点. 一.作用单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点 二.适用场景 1. 应用中某个实例对象需要频繁的被访问. 2. 应用中每次启动只会存在一个实例.如账号系统

JAVA设计模式-单例模式(Singleton)线程安全与效率

一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式进行探索的. 本文的目的是:结合文章中的八种单例模式的写法,使用实际的示例,来演示线程安全和效率 既然是实际的示例,那么就首先定义一个业务场景:购票.大家都知道在春运的时候,抢票是非常激烈的.有可能同一张票就同时又成百上千的人同时在抢.这就对代码逻辑的要求很高了,即不能把同一张票多次出售,也不能出现