前言:单例模式大家应该很熟悉了,我在这里就自己总结一下自己这段时间学到的单例相关的知识。

单例模式的目的:保证一个类只有单一的实例,也就是说你无法通过new来创建这个类的一个新实例。

单例模式的意义:保证一个类只有单一的实例,也就是说你无法通过new来创建这个类的一个新实例。我们可以控制类对象的产生的数目。

单例模式使用场合:

使用单例的情况有3种:
1、类a从类b继承,这时a需使用单例才能直接访问b中声明的变量和方法
2、类a将被类b继承,这时a也需要使用单例,否则b将无法直接使用a的方法
3、单例可以提供一个构造函数,确保使用该单例时能够初始化一些环境,比如从外部读入配置文件,或者和外部建立基本通信等

几种实现方式(均为线程安全的实现方式):

1. 饿汉式: 

public class Singleton {
private Singleton(){
System.out.println("Singleton is create");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}

这种实现方式也被我们称为饿汉式单例模式,宗旨就是不管你要不要,我先提前new出来,这肯定是线程安全的,因为new的动作发生在第一次访问类的时候。

缺点:可能会出现不必要的实例化。也就是我不想获取实例,它却自己做了,这样会降低效率。

例子:

public class Singleton {
public static int STATUS=1;
private Singleton(){
System.out.println("Singleton is create");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}

  我仅仅想访问Singleton里面的一个静态字段,结果他还执行了一次new对象的操作。

2.同步方法:

  

public class LazySingleton {
private LazySingleton() {
System.out.println("LazySingleton is create");
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance() {
if (instance == null)
instance = new LazySingleton();
return instance;
}
}

这种方式虽然解决了线程安全和没做多余的动作的要求,但是由于是在整个getInstance方法加了synchronized,导致一次只能一个线程调用getInstance方法,会影响程序运行效率。

3.同步代码块(Double Check)

   

public Resource getResource() {
if (resource == null) {
synchronized(this){
if (resource==null) {
resource = new Resource();
}
}
}
return resource;
}

很不错的解决方案,但是首先需要将单例声明为volatile类型以保证线程安全,其次,用了同步代码块,所以也是会影响效率,不过比

之前几个好很多。

4.内部静态类:

  

public class StaticSingleton {
private StaticSingleton(){
System.out.println("StaticSingleton is create");
}
private static class SingletonHolder {
private static StaticSingleton instance = new StaticSingleton();
}
public static StaticSingleton getInstance() {
return SingletonHolder.instance;
}
}

这种方式没用到同步,但是很好的解决了之前几种情况的缺点。

 

Java高并发下的 “单例模式”的更多相关文章

  1. Java高并发下多线程编程

    1.创建线程 Java中创建线程主要有三种方式: 继承Thread类创建线程类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此也把run方法称为 ...

  2. java高并发下的数据安全

    高并发下的数据安全 我们知道在多线程写入同一个文件的时候,会存现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的).如果是My ...

  3. 高并发下的Java数据结构(List、Set、Map、Queue)

    由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下正常工作,这是因为这些数据结构不是线程安全的.本节将着重介绍一些可以用于多线程环境的数据结构,如并发List.并发 ...

  4. JAVA跨域、RestTemplate高并发下异常与配置、JSON数据Long转String

    ## 跨域支持 import org.springframework.context.annotation.Bean; import org.springframework.context.annot ...

  5. Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解

    Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解 说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返 ...

  6. Java高并发如何解决

    Java高并发如何解决 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧 ...

  7. 转载:Java高并发,如何解决,什么方式解决

    原文:https://www.cnblogs.com/lr393993507/p/5909804.html 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并 ...

  8. 关于Java高并发的问题

    前言: 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和 ...

  9. 【转】Java高并发,如何解决,什么方式解决

    原文地址:https://www.cnblogs.com/lr393993507/p/5909804.html 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了. ...

随机推荐

  1. Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD

    @echo off rem 设置标题 title windows 7 无线热点设置 author:humi rem 设置背景颜色 color 1E :: 设置窗口大小 mode con: cols=1 ...

  2. vue路由(一)

    “vue.js 路由允许我们通过不同的 URL 访问不同的内容.通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)”这段是从网上直接抄 ...

  3. wince如何扫描条码并且在浏览器上查询数据

    这个挺简单的,winform也适用 public override void OnGetBarcode(string scanStr) { try { Process.Start("iesa ...

  4. ifeq ifneq ifdef ifndef

    条件语句中使用到了三个关键字:“ifeq”.“else”和“endif”.其中: 1.        “ifeq”表示条件语句的开始,并指定了一个比较条件(相等).之后是用圆括号括包围的.使用逗号“, ...

  5. XML文件解析之SAX解析

    使用DOM解析的时候是需要把文档的所有内容读入内存然后建立一个DOM树结构,然后通过DOM提供的接口来实现XML文件的解析,如果文件比较小的时候肯定是很方便的.但是如果是XML文件很大的话,那么这种方 ...

  6. 解决yum命令后出现libldap-2.4.so.2: cannot open shared object file

    问题: [root@lgh ~]# yum There was a problem importing one of the Python modules required to run yum. T ...

  7. c语言的函数指针和函数指针数组的简单demo

    今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. #include <cstdio> #include <Windows. ...

  8. python爬虫伪装技术应用

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82423865 -写在前面 本篇博客主要是爬虫伪装技术的应 ...

  9. 笔记本电脑安装jupyterthemes

    上午准备在老笔记本上也装上jupyter themes,竟然遇到一堆问题: 首先直接 pip install jupyterthemes 参考:https://blog.csdn.net/Jinlon ...

  10. 2018江苏徐州icpc试题-A-生化危机【多源点-基础广搜】