单例模式实例&多线程应用
单例模式是指:对于一个类在内存中只能存在唯一一个对象,这种设计模式叫做单例设计模式。
单例设计模式的写法:
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 静态方法 |
单例模式实例&多线程应用的更多相关文章
- Servlet单实例多线程模式
http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...
- Java多线程核心技术(五)单例模式与多线程
本文只需要考虑一件事:如何使单例模式遇到多线程是安全的.正确的 1.立即加载 / "饿汉模式" 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- 单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)
刚才在看阿寻的博客”C#设计模式学习笔记-单例模式“时,发现了评论里有几个人在问单例模式在多线程环境下为什么lazy模式要加两个if进行判断,评论中的一个哥们剑过不留痕,给他们写了一个demo来告诉他 ...
- Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记
第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...
- 实现单实例多线程安全API问题
前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为singl ...
- Servlet 生命周期、工作原理-是单实例多线程
Servelet是单实例多线程的 参考:servlet单实例多线程模式 一.Servlet生命周期 大致分为4部:Servlet类加载-->实例化-->服务-->销毁 1.Web C ...
- Java多线程编程核心技术---单例模式与多线程
立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕. public class MyObject { //立即加载方式==饿汉模式 private static MyObject myOb ...
- Java多线程-----单例模式在多线程中的使用用问题
1.饿汉模式(立即加载模式)与多线程 不管需不需要用到实例都要去创建实例,即在类产生的时候就创建好实例 package com.thread; /** * 饿汉模式 * * @author yy ...
随机推荐
- win10安装java
java安装还比较顺利,贴两篇亲测可行的教程 1.开发环境安装:https://www.cnblogs.com/shirley-0021/p/8510051.html 2.开发工具安装(Eclipse ...
- Gurobi在Python环境里安装与使用(Windows环境)
- Groovy学习笔记-陷阱
1.def和in是关键字 2.==映射到了equals() 中,如果有Comparable接口实现,则优先compareTo str1 = 'hello' str2 = str1 str3 = new ...
- 安装linux虚拟机配置静态ip(桥接模式)
1.centOs7.VMware Workstation14 2.常规新建虚拟机操作后,来到选择连接模式: 这里选择桥接模式,复制物理网络连接状态(就是把实际的主机网卡信息拷贝一份,让虚拟机也有一份和 ...
- 模块四-shutil模块
shutil模块 高级的文件处理模块 主要是文件的处理,移动,压缩和解压缩 shutil模块的使用方法: shutil.copyfile()#拷贝文件 shutil.copy()#拷贝文件和权限 sh ...
- compareTo的用法
在java编程中,我们会偶尔遇到字符串大小比较的问题,compareTo()方法很简单就实现这种功能.该方法用于判断一个字符串是否大于.等于还是小于另一个字符串.判断字符串大小的依据是根据它们在字典表 ...
- kafka工作原理介绍
两张图读懂kafka应用: Kafka 中的术语 broker:中间的kafka cluster,存储消息,是由多个server组成的集群. topic:kafka给消息提供的分类方式.brok ...
- Python多进程并发(multiprocessing)
1.新建单一进程 如果我们新建少量进程,可以如下: 2.使用进程池 是的,你没有看错,不是线程池.它可以让你跑满多核CPU,而且使用方法非常简单. 注意要用apply_async,如果落下async, ...
- ionic2简单分析
Angular2是一个全新的框架,它从ReactJS以及其他web移动框架借鉴了不少经验和优点,巨大的改进使得开 发体验和性能已经超越了Angular1,而且Ionic2无论是从UI交互效果和跨平台的 ...
- 取MySQL结果集的第一条记录
select * FROM SU_supplycontract t WHERE supplyContractCode="CRM20180813002" limit 1;