关于Javakeywordsynchronized——单例模式的思考
精彩的设计模式盛宴刚刚落下帷幕。三天的时间。真是学习到了非常多。当中,遗留的非常多的问题。今天就谈谈synchronized这个keyword。关于对synchronizedkeyword的思考是从单例模式引发的。
在代码中利用延迟载入,将对象的初始化定义为null值。在须要的时候才去进行对象的构造,getinstance这种方法。
这个就是我们常常说的懒汉式单例模式。
懒汉式单例的出现:
假设将类初始化的过程放到代码运行中,有优点。就是启动快。假设对象实例化过程比較复杂。这样能够提供效率。速度。当用到的时候再去创建对象。可是懒汉式单例模式相同存在一个问题。打个例如说:线程A希望使用SingletonClass,调用getInstance()方法。由于是第一次调用。A就发现instance是null的。于是它開始创建实例。就在这个时候,CPU发生时间片切换。线程B開始运行,它要使用SingletonClass,调用getInstance()方法。相同检測到instance是null——注意,这是在A检測完之后切换的。也就是说A并没有来得及创建对象——因此B開始创建。B创建完毕后,切换到A继续运行,由于它已经检測完了。所以A不会再检測一遍。它会直接创建对象。
这样,线程A和B各自拥有一个SingletonClass的对象——单例失败!
Synchronized同步锁引出:
通过介绍延迟载入再到懒汉式,最终引出了我们今天要讲的主题。那么怎样解决上面一个关于创建对象时,CPU切换的问题呢?事实上方法非常easy。就是将这个GetInstance方法加锁,是要getInstance()加上同步锁。一个线程必须等待另外一个线程创建完毕后才干使用这种方法,这就保证了单例的唯一性。
两个并发线程訪问同一个对象obj中的synchronized修饰的一个方法时,一个时间内仅仅能有一个线程得到运行。即A操作完才干够让B操作,否则B一直处于等待的状态中。也能够说是一种堵塞的状态。
相应代码能够是:
public class SingletonClass {
private static SingletonClass instance = null;
public synchronized static SingletonClass getInstance() {
if(instance == null) {
instance = new SingletonClass();
}
return instance;
}
private SingletonClass() {
}
}
什么时候用到synchronized?
在编写一个类时,假设该类中的代码可能执行于多线程环境下。那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。锁不只能够用到类的实例化,也能够用到静态成员方法的声明中。
synchronized优缺点?
通过它的长处能够看出它的缺点是什么,长处是将解决多线程的问题,避免占用资源,占用多个对象。相对缺点是会锁住某一段程序,别的程序假设须要调用的话就必须等待,降低了速度、效率。有可能产生死锁,导致程序中断。
小结:
之前对于单例模式的了解仅仅是知道它能够用于实例化一个窗口对象,有且仅仅有一个对象被实例化出来。如今学过了J2SE的线程那一章,本来也是晕晕的。不理解这个同步锁。当再一次回想这个单例模式的时候,结合着synchronized的定义,我了解到了非常多,跟之前的学习产生的共鸣。
效果非常好。
关于Javakeywordsynchronized——单例模式的思考的更多相关文章
- 从一个小例子引发的Java内存可见性的简单思考和猜想以及DCL单例模式中的volatile的核心作用
环境 OS Win10 CPU 4核8线程 IDE IntelliJ IDEA 2019.3 JDK 1.8 -server模式 场景 最初的代码 一个线程A根据flag的值执行死循环,另一个线程B只 ...
- Android 源码解析:单例模式-通过容器实现单例模式-懒加载方式
本文分析了 Android 系统服务通过容器实现单例,确保系统服务的全局唯一. 开发过 Android 的用户肯定都用过这句代码,主要作用是把布局文件 XML 加载到系统中,转换为 Android 的 ...
- Python 实现单例模式的一些思考
一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...
- 设计模式-单例模式下对多例的思考(案例:Server服务器)
前述: 在学习单例模式后,对老师课上布置的课后作业,自然要使用单例模式,但是不是一般的单例,要求引起我的兴趣,案例是用服务器. 老师布置的要求是:服务器只有一个,但是使用这个服务器时候可以有多个对象( ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- 单例模式和angular的services的使用方法
在现实生活中存在着有这样的特点的一些类: A.这些类只能有一个实例: B.这些能够自动实例化: C.这个类对整个系统可见,即必须向整个系统提供这个实例. 不妨举一个具体的单例模式的例子:比如教室里面的 ...
- 【转】单例模式(Singleton)
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...
随机推荐
- This Activity already has an action bar supplied by the window decor
问题描写叙述:继承自AppCompatActivity,使用Toolbar替代ActionBar的时候.出现错误 错误信息: 2.Caused by: java.lang.IllegalStateEx ...
- Fragment状态保存
这篇博文是对官方API Demo的FragmentRetainInstanceSupport.java的学习.路径在android-sdk-macosx/extras/android/support/ ...
- 英语发音规则---H字母
英语发音规则---H字母 一.总结 一句话总结: 1.H发[h]音? hot [hɒt] adj. 热的 house [haʊs] n. 住宅 head [hed] n. 头:头痛 hat [hæt] ...
- FastDFS分布式文件系统研究
FastDFS分布式文件系统 这个主要是针对应用型的,很使用,特别是对于电商等 一.编译安装 ubuntu平台: apt-get install libevent(这个默认就有,没有就装下) libe ...
- nyoj--118--修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- MVC bundle配置文件模板
bundle文件放在应用根目录,命名为 bundle.config 内容模板 <?xml version="1.0" encoding="utf-8"? ...
- VS自动注释——GhostDoc
直接上图片,使用步骤是按顺序来的: 安装就不多说了,直接下一步,下一步.直接讲讲如何自定义注释规则 软件下载链接:http://pan.baidu.com/s/1dF5TSel 密码:peuz 链接: ...
- 一个vue的全局提示框组件
<template> <!-- 全局提示框 --> <div v-show="visible" class="dialog-tips dia ...
- RecycleView错误: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder
1.错误 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positi ...
- 基于XMPP利用openfire简单的即时通讯
功能的实现结果:能够使自己编写客户端与spark客户端信息通讯,将接受到的信息更新到textview上. 1.下载openfire并安装.设置域名,添加用户 2.下载安装spark客户端 3.jar包 ...