单例模式实例&多线程应用
单例模式是指:对于一个类在内存中只能存在唯一一个对象,这种设计模式叫做单例设计模式。
单例设计模式的写法:
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 ...
随机推荐
- 精进之路之volatile
volatile 首先了解下Java 内存模型中的可见性.原子性和有序性. 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他 ...
- Python 从入门到实践 试一试 参考代码
这两天学习Python 看了python从入门到实践的书籍,里面有课后题“试一试” 然后就跟着写了,代码在以下地址,如果需要自取 https://files.cnblogs.com/files/fud ...
- 2019-04-18-day035-守护线程与池
内容回顾 互斥锁 在同一个进程中连续锁两次以上会死锁 进程的数据共享 进程之间可以共享数据 提供共享数据的类是Manager 但是他提供的list\dict这些数据类型是数据不安全的 针对 += -= ...
- keras 入门整理 如何shuffle,如何使用fit_generator 整理合集
keras入门参考网址: 中文文档教你快速建立model keras不同的模块-基本结构的简介-类似xmind整理 Keras的基本使用(1)--创建,编译,训练模型 Keras学习笔记(完结) ke ...
- java web从入门到精通
1.Springboot配置 1.1mybatis mapper.xml所在的目录必须为resource的资源文件夹,如果xml文件在java的package里面,需要修改文件夹类型 idea修改方式 ...
- java数字转IP 一行
System.out.println(InetAddress.getByName(String.valueOf(12345)).getHostAddress());
- eikonal equation - 程函方程
[转载请注明出处]http://www.cnblogs.com/mashiqi 2018/08/08 eikonal equation如下:$$|\nabla_x \tau (x)| = n(x).$ ...
- Composer的入门与使用
一 什么是composer composer是一种php的包管理工具, 类似于Java的maven, Ubuntu的apt等, 可以方便的解决php的包管理, 管理依赖关系等问题. 二 使用compo ...
- Oracle数据导入Hbase操作步骤
——本文非本人原创,为公司同事整理,发布至此以便查阅 一.入库前数据准备 1.入hbase详细要求及rowkey生成规则,参考文档“_入HBase库要求 20190104.docx”. 2.根据标准库 ...
- USB接口禁用与启用
前几天闺蜜淘了一台小本,但是发现计算机USB接口是禁用的,有点头疼,所以问了万能的度娘,找到了n种办法.不过这一种是适用于我的情况,简单记录一下. 解决方法:(主要就是修改注册表) 1.打开注册表编辑 ...