单例模式是指:对于一个类在内存中只能存在唯一一个对象,这种设计模式叫做单例设计模式。

单例设计模式的写法:

1. 设置私有(private)的构造方法。

2. 实例化一个该类的对象作为成员变量,并设置为private、static, 饿汉式还可以加上final。

3. 增加一个public  static 的成员方法getInstance,来获取step2 产生的成员变量。

实例:

1. 饿汉式:

 class Single {
private Single(){};
private static final Single s = new Single(); public static Single getInstance(){
return s;
}
}

2. 懒汉式:

 class Single {
private Single(){};
private static Single s = null;// 延迟加载

public static Single getInstance(){
if(null == s)//双重判断提高效率,后来的就不需要再判断锁内的内容,如果不符合条件就直接return
synchronized(Single.class)//同步代码块,该处的锁是这个类的字节码对象
{
if(null ==s)
s = new Single();
}
return s;
}
}

二者的区别就是:懒汉式提供了延迟加载,可以在需要时再根据对象是否存在再实例化对象;但是在多线程时会出现安全问题,因此开发中多使用饿汉式。
  

      懒汉式的安全问题可以采用加锁的方式来解决,synchronized 同步代码块,可以防止在一个线程判断完之后另一个线程切入的问题。而且此处的锁是Single类的字节码对象。

      在加上同步锁后,每次代码都要先等锁,然后再判断对象是否存在,会使得效率变低,因此,我们可以在同步锁外面再增加一个判断来提高效率。

关于多线程:

进程: 正在进行中的程序,包括代码和数据。每个进程都有一个执行顺序,叫做执行路径或控制单元。

线程:进程中的一个独立的控制单元就是一个线程,线程控制着进程的执行。每个进程都包含至少一个线程。多个线程共享进程的资源,而CPU根据线程分配时间片。

线程的创建方式有两种:

第一种方式:

  1. 定义类AThre继承Thread类。

  2. 复写Thread类中的run方法,定义线程执行的代码。

  3. new 一个类AThre的对象。

  4. 调用该对象的start() 方法。

第二种方式:

  1. 定义类BThread 实现Runnable接口。

  2. 复写Runnable 类中的run方法。

  3. new 一个类BThread的对象。

  4. new一个Thread的对象并将Bthread的对象作为实参传递给Thread的构造函数。

  5. 调用Thread对象的start() 方法。

note: start() 方法执行了两步操作,创建一个线程,在该线程中调用run方法。而如果直接调用run方法,则是在主线程中执行的run中的代码,没有实现多线程。

关于同步:

同步的前提是,必须有两个或两个以上的线程,而且多个线程使用的是同一个锁。

同步的确定:

  1. 明确哪些代码是多线程代码

  2. 明确共享数据

  3. 明确多线程运行中哪些语句是操作共享数据的。

同步有两种方式,

同步代码块 同步函数
synchronized(this){} synchronized 非静态方法
synchronized([className].class) synchronized 静态方法

      

单例模式实例&多线程应用的更多相关文章

  1. Servlet单实例多线程模式

    http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...

  2. Java多线程核心技术(五)单例模式与多线程

    本文只需要考虑一件事:如何使单例模式遇到多线程是安全的.正确的 1.立即加载 / "饿汉模式" 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接 ...

  3. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  4. 单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)

    刚才在看阿寻的博客”C#设计模式学习笔记-单例模式“时,发现了评论里有几个人在问单例模式在多线程环境下为什么lazy模式要加两个if进行判断,评论中的一个哥们剑过不留痕,给他们写了一个demo来告诉他 ...

  5. Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记

    第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...

  6. 实现单实例多线程安全API问题

    前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为singl ...

  7. Servlet 生命周期、工作原理-是单实例多线程

    Servelet是单实例多线程的 参考:servlet单实例多线程模式 一.Servlet生命周期 大致分为4部:Servlet类加载-->实例化-->服务-->销毁 1.Web C ...

  8. Java多线程编程核心技术---单例模式与多线程

    立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕. public class MyObject { //立即加载方式==饿汉模式 private static MyObject myOb ...

  9. Java多线程-----单例模式在多线程中的使用用问题

       1.饿汉模式(立即加载模式)与多线程 不管需不需要用到实例都要去创建实例,即在类产生的时候就创建好实例 package com.thread; /** * 饿汉模式 * * @author yy ...

随机推荐

  1. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  2. jmeter之关联

    前言:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联. 一.后置处理器-------正则 ...

  3. 音频播放器在chrome浏览器,play报错

    这个问题是谷歌浏览器的问题:https://www.oschina.net/news/96168/chrome-remove-the-autoplay-policy,可以查看这篇文章 如果你的版本没有 ...

  4. python基础15上_迭代器_生成器

    # 迭代器和生成器 # 迭代器: # 双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的 # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir ...

  5. 《贝贝GO》隐私政策

    隐私政策 贝贝GO尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,贝贝GO会按照本隐私权政策的规定使用和披露您的个人信息.但贝贝GO将以高度的勤勉.审慎义务对待这些信息. ...

  6. c语言实现两个单链表的交叉合并

    #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; struc ...

  7. JS里浮点数的运算

    //浮点数加法运算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1]. ...

  8. 使用SQLsever批量查询TXT文本中的值

    测试文档如下,需要查到case_no值为以下时,对应的单据信息分别是什么. 步骤如下: 在txt文本中 Ctrl+H,输入如下,点击“全部替换” 在word文本中,复制以上信息到word文本中,目的是 ...

  9. 在PL/SQL中调用Oracle存储过程

    存储过程 1 什么是存储过程? 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2 存储过程的参数模式 存储过程的参数特性: IN类型的参数 ...

  10. Android IPC机制—跨进程的观察者模式

    在AIDL文件中并不是所有的数据类型都可以使用,AIDL支持的数据类型如下: 基本数据类型(int.long.char.boolean.double等) String和CharSequence Lis ...