这篇博客介绍线程安全的应用——单例模式。
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
实例:
/** * @author: ChenHao * 关于懒汉式的线程安全问题,使用同步机制 * 对于一般的方法内,使用同步方法块,可以考虑使用this * 对于静态方法而言,使用当前类充当锁。 */ public class TestSingleton { public static void main(String[] args) { System.out.println(MySingle.getInstance()); System.out.println(MySingle.getInstance()); } } class MySingle{ //声明一个私有的静态变量,第一次调用才初始化,避免内存浪费。 private volatile static MySingle instance=null; //让构造器为private私有化,避免外部直接创建对象 private MySingle(){} public static MySingle getInstance(){ if(null ==instance){//提高效率:如果已经存在对象,则不进行锁等待,直接返回对象,只有当对象为空才会进入锁等待,这里可以在第一个进入锁创建对象后,sleep10秒来放大效果 //这里有五个线程等待 synchronized(MySingle.class){ //第一次:当一个线程进来后,其他线程都在锁外面 //第一个线程创建对象后,释放锁,其他线程得到锁后,如果instance不为null,则不需要创建 if(null ==instance){ instance =new MySingle(); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } return instance; } }
代码分析:多个线程同时创建MySingle类的实例,比如现在有6个线程,第一次同时调用getInstance()静态方法,
线程A获取了锁,其他5个线程都在synchronized(MySingle.class)外面等待,第一个线程创建对象后,释放锁,其他线程得到锁后,如果instance不为null,则不需要创建;
第一个if(null ==instance)作用是提高效率:如果已经存在对象,则不进行锁等待,直接返回对象,只有当对象为空才会进入锁等待,这里可以在第一个进入锁创建对象后,sleep10秒来放大效果,此时已经创建了instance ,但是还没有释放锁,所以新来的线程不需要再等待锁,直接使用已经创建好的instance;
第二个if(null ==instance)判断instance是否已经存在,如果第一个线程已经创建instance,并释放锁,接下来的线程进入后则不需要再创建;
运行结果:输出相同的对象实例
PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定 […]...
Synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象 […]...
多线程按顺序打印数字,支持配置线程数目和打印数字结尾 Posted on 2020-05-10 18:33 […]...
queue模块(在python2中叫Queue)实现了各种多生产者-多消费者队列,可用于在执行的多个线程之间安 […]...
金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之三:多线程synchronized 继续面试大纲系 […]...
使用 synchronize 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指 […]...
一、自旋锁 自旋锁是一种基础的同步原语,用于保障对共享数据的互斥访问。与互斥锁的相比,在获取锁失败的时候不会使 […]...
Java 是很多人一直在用的编程语言,但是有些 Java 概念是非常难以理解的,哪怕是一些多年的老手,对某些 […]...
已经很久没有遇到如此顽固的bug了,总共耗费了我近1个礼拜的时间。期间的种种冲突,个人崩溃,最终解决方案的 […]...
http://www.cnblogs.com/eaglet/archive/2013/01/10/285422 […]...
这几天学习JavaEE时做了一个记录。 JavaEE笔记 作者:光和影子我的博客 前言 阿里来我们学校搞实习招 […]...
说到邮箱很多人的第一反应就是BAT这类的公司提供的邮箱服务器,其实邮箱还是很多类型的。企业使用什么样的邮箱,取 […]...
在我们编程实现一些系统操作的时候,往往要求我们执行操作的进程拥有足够的权限方可成功操作。比如,我们使用 Exi […]...
10 Zabbix4.4.0-告警“Zabbix server is not running” 点击返回:自学 […]...
11月19日,业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Ranch […]...
毫无疑问直播是当前移动互联网最热门的领域之一,在超强热度的引导下直播领域也吸引了大量的商业资本。在各大直播应用 […]...
Powered By WordPress