精彩的设计模式盛宴刚刚落下帷幕。三天的时间。真是学习到了非常多。当中,遗留的非常多的问题。今天就谈谈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——单例模式的思考的更多相关文章

  1. 从一个小例子引发的Java内存可见性的简单思考和猜想以及DCL单例模式中的volatile的核心作用

    环境 OS Win10 CPU 4核8线程 IDE IntelliJ IDEA 2019.3 JDK 1.8 -server模式 场景 最初的代码 一个线程A根据flag的值执行死循环,另一个线程B只 ...

  2. Android 源码解析:单例模式-通过容器实现单例模式-懒加载方式

    本文分析了 Android 系统服务通过容器实现单例,确保系统服务的全局唯一. 开发过 Android 的用户肯定都用过这句代码,主要作用是把布局文件 XML 加载到系统中,转换为 Android 的 ...

  3. Python 实现单例模式的一些思考

    一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...

  4. 设计模式-单例模式下对多例的思考(案例:Server服务器)

    前述: 在学习单例模式后,对老师课上布置的课后作业,自然要使用单例模式,但是不是一般的单例,要求引起我的兴趣,案例是用服务器. 老师布置的要求是:服务器只有一个,但是使用这个服务器时候可以有多个对象( ...

  5. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  6. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  7. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  8. 单例模式和angular的services的使用方法

    在现实生活中存在着有这样的特点的一些类: A.这些类只能有一个实例: B.这些能够自动实例化: C.这个类对整个系统可见,即必须向整个系统提供这个实例. 不妨举一个具体的单例模式的例子:比如教室里面的 ...

  9. 【转】单例模式(Singleton)

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...

随机推荐

  1. 【MongoDB】The basic operation of Index in MongoDB

    In the past four blogs, we attached importance to the index, including description and comparison wi ...

  2. cmd 进入mysql 小技巧

    1.開始中找出执行:输入cmd 2.查找appserv所在盘,我的在D盘.所以接着输入:d: 3.在d盘中查找mysql所在文件夹:cd appserv\mysql\bin 4.再输入主机名.数据库名 ...

  3. LayoutParams继承于Android.View.ViewGroup.LayoutParams.

    LayoutParams相当于一个Layout的信息包,它封装了Layout的位置.高.宽等信息.假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉L ...

  4. WebBrowser网页操作之提取获取元素和标签(完整篇)

    最近使用WebBrower做了几个Hook小程序,收集积累如下: using System; using System.Collections.Generic; using System.Linq; ...

  5. 【HDU 2176】 取(m堆)石子游戏

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2176 [算法] Nim博弈 当石子数异或和不为0时,先手必胜,否则先手必败 设石子异或和为S 如果 ...

  6. js 智能识别收获地址

    项目地址https://github.com/wzc570738205/smart_parse 支持以下数据格式 马云,1351111111,北京市朝阳区姚家园3楼 马云1351111111北京市朝阳 ...

  7. Core篇——初探Core的Http请求管道&&Middleware

    目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...

  8. Oracle学习系类篇(四)

    .分析函数 分析函数oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组,然后计算基于组的邹忠统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处 ...

  9. Core Java(六)

    面向对象语言特性 (一) (一)  static 作用于 变量,方法,代码块 静态变量:被类的所有对象共享   在类加载时被加载   优先于对象 Student.country = "中国& ...

  10. js获取浏览器中相关容器的高度

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...