关于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的定义,我了解到了非常多,跟之前的学习产生的共鸣。

效果非常好。

时间: 2024-10-09 12:06:40

关于Javakeywordsynchronized——单例模式的思考的相关文章

再次进入程序,Java静态变量与成员变量的不同表现和对单例模式的思考

我们知道,在存储方式上,成员变量在JVM中是存储在堆里边的,而静态变量则位于JVM中的方法区,两者的主要区别在于,成员变量不再受引用常常会导致被回收,而方法区对垃圾回收的限制相当严苛,除非是整个应用被卸载,否则静态变量会一直存在. 在android应用中使用成员变量,在退出应用之后,所有的成员变量肯定会被回收,而静态变量则相反.尤其是在UI设计上,如果你自定义一个static的viewgroup,创建时候为其addchlid,你就一定要考虑到这个情况,因为再次进入程序,还是会调用addchild

C#-关于带参数的单例模式的思考(利用带参数的单例模式连接并查询数据库特定表的信息)

首先,让我们看一下单例模式是怎样的. public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (

设计模式-单例模式(Singleton)在Android开发应用场景思考和遇到的坑

介绍 在上篇博客中详细说明了各种单例的写法和问题.这篇主要介绍单例在Android开发中的各种应用场景以及和静态类方法的对比考虑,举实际例子说明. 单例的思考 写了这么多单例,都快忘记我们到底为什么需要单例,复习单例的本质 单例的本质:控制实例的数量 全局有且只有一个对象,并能够全局访问得到. 控制实例数量 有时候会思考如果我们需要控制实例的数量不是只有一个,而是2.3.4或者任意多个呢?我们怎样控制实例的数量,其实实现思路也简单,就是通过Map缓存实例,控制缓存的数量,当有调用就返回某个实例,

设计模式1:单例模式原理的思考

1.前言 关于设计模式的文章一直以来都没有写,因为总感觉翻一遍书,只是用代码搞个什么Cat,Dog的Class,再来个eat的method,abstract个animal来敲遍代码太无趣了,没有实际应用,或者深入思考,照书贴一遍代码是浪费时间的.今天之所以写下这一篇自然是有一些有趣并且有内涵的东西可以让人思考,那开始吧. 2.单例的思考 一般来说单例的初始化根据加载的时机分为两种,饿汉式和懒汉式,其中懒汉式又分为静态内部类和双重锁两种实现. 而这次,我们按并发场景下实现线程安全原理来分,基于类加

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

前述: 在学习单例模式后,对老师课上布置的课后作业,自然要使用单例模式,但是不是一般的单例,要求引起我的兴趣,案例是用服务器. 老师布置的要求是:服务器只有一个,但是使用这个服务器时候可以有多个对象(原版的)和备份数据库,也就是至少要两个对象,因为有可能服务器对象会垮掉,所以要用备份的,所以这里要考虑调用时候,应该返回哪个服务器对象,还有当服务器对象垮掉后,应该怎么处理,保证用户的使用.老师说,两个对象是基本要求,如果能够控制多个对象,分数更高哦. 我觉得蛮有意思的题目,如果只考虑两个对象,无非

设计模式思考----单例模式

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. 即保证一个类.只有一个实例存在,同时提供一个全局唯一访问这个类的访问点. 单例模式类图: 在应用系统开发中,我们常常有以下需求: -在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象 -在整个程序空间使用全局变量,共享资源 -大规模系统中,为了性能的考虑,需要节省对象的创建时间等等. 因为Singleton模式可以保证为一个类只生成唯一的实

由MVC引发的对单例模式思考

1.三层架构与MVC模式的区别 三层架构简介 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business Logic Layer).数据访问层(Data access layer).区分层次的目的即为了“高内聚低耦合”的思想.在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构.微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层.业务逻辑层(又或称为领域层)

php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的显得额外重要,即是算法和数据结构,再就是好的设计模式了,,,听过一句话,是好的数据结构是让计算机更快的工作,而一个好的设计模式则是使开发者工作的更快! 单例模式 单例模式特点 $_instance 必须声明为静态的私有变量 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去

设计模式-单例模式(Go语言描述)

这篇博客我们继续来看设计模式,今天带来的是一个最简单而且最常用的模式-单例模式.那什么是单例模式呢?相信大家最它最熟悉不过了,那我们就来快速的了解一下它的定义. 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 这个解释足够简单.说白了就是假如我们希望我们在我们的系统中该类仅仅存在1个或0个该类的实例.虽然单例模式很简单,但是熟悉java的同学可能了解,单例模式有很多写法,懒汉式.饿汉式.双重锁... 这么多形式,难道有什么目的?确实,不过他们的目的很明确,就是保证在一种特殊情况下的单例-