Android 设计模式—单例模式记要

单例模式

定义:(定义都是抽象的,无需过度在意其意义,设计模式这种东西只可意会不可言传)确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式写法有很多种,因地制宜就行,但关键点都是在并发问题上:

1.private构造函数

2.public static静态公有方法

3.保证线程安全,适应多线程并发访问:(2个关键点)

        * 同步锁synchronized修饰符:避免同时被多个线程访问,防止线程不同步,保证并发情况下的原子性,可见性,有序性

          * Volatile修饰符:本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从内存中读取(它修饰的变量的读写操作都必须在内存中进行),保证了多线程共享变量的可见性,原子性(需条件),有序性(需条件))。

4.保证访问性能(例如单例每次访问都进行synchronized判断影响性能)

5.相关:因为单例涉及并发,涉及synchronized和Volatile修饰符,这2者都关系到CUP线程与内存交互,java内存模拟。不论是synchronized还是Volatile都是对下面3个保证性问题进行的操作,只是在某些情况下适用或者不适用。

        5.1.Java内存模拟JMM(JMM定义了java虚拟机JVM在内存中的工作方式)

JMM定义了多线程之间共享变量的可见性,一个线程对共享变量的写入何时对另一个线程可见,以及如何在需要的时候对共享变量进行同步。

        5.2.并发编程必须的3个保证性问题:原子性问题,可见性问题,有序性问题

          *原子性:一个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就不执行。

理解场景:A向B转账500元操作;2个步骤,账户A减去500元,账户B加上500元:A减500èB加500;过程中如果插入个账户B取走500元:A减500èB减500èB加500。原本是2步,变为3步。转账结果就会发生错误。

只有简单的读取,储存操作才是原子操作如I= 10(变量之间的互相赋值不是原子操作),如果要实现更大范围操作的原子性,可以通过synchronized,因为锁能保证一个时刻只有一个线程执行代码块,从而不存在原子性问题。

        *可见性:当多个线程访问同一个变量,一个线程修改了变量的值,他线程能立即看到修改的值。

理解场景:CPU1下线程1执行int I = 0 , I = 10,CPU2下线程2执行 j = I ;假若线程1初始化  I = 0 后将 I = 10放入高速缓存中,但是没有放入主存中,此时线程2执行,从主存中读取的仍然是      I = 0 ,j 就不等于10。线程1已经改变了i的值,但是线程2没有立即看到线程1修改的值,导致可见性问题。

Synchronized的锁能保证同一时间只有一个线程执行代码块的同时,在释放锁之前会将对变量的修改刷新到主存当中,因此避免上面场景中的问题,进而解决可见性问题。

        *有序性:程序执行的顺序按照代码的先后顺序执行。

注意场景:指令重排序(InstructionReorder):处理器为了提高程序运行效率,可能会对输入的代码进行优化,不保证各个语句的执行先后顺序同代码顺序一致,但是保证执行结果一致(单线程一致,多线程233)。

Synchronized的锁能保证同一时间只有一个线程执行代码块,相当于单线程执行,自然保证有序性。

Volatile禁止进行指令重排序。

          5.3.使用volatile必须具备以下2个条件:(2个条件就是保证操作是原子性操作,从而保证使用volatile关键字的程序在并发时能够正确执行。)

*对变量的写操作不依赖于当前值

*该变量没有包含在具有其他变量的不变式中

          5.4.synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。

下周不是线程就是工厂模式。。


对于生活理想,应该像宗教徒对待宗教一样充满虔诚与热情!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容