线程基础(三十)

本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。

接上篇,本篇讲解线程另外一个设计模式:Immutable Pattern. 不可变模式.

概念

Immutable Pattern:不可变模式, 设计思路非常简单, 要求共享资源是一个不可改变对象, 线程只能访问资源,而不允许对资源修改.并发环境下即使不使用加锁操作,也可保证线程操作安全.

知识补充

敞开讲述前,先来科普一下不可对象:
java中类分2种类型, 可变类与不可变类, 不可变类是指当类实例化后, 就不允许修改对象的任何属性值.常见不可变类有: 基本类型包装类(Integer/Long等), 还有String也是不可变类.这些类都满足一下几个条件:
1:对象实例化后其值(状态)不能在修改
2:对象的所有字段都是不可变的(即使用final修饰)
3:对象是正确方式创建的

public final class Integer extends Number implements Comparable<Integer> {
     @Native public static final int   MIN_VALUE = 0x80000000;
     @Native public static final int   MAX_VALUE = 0x7fffffff;
     private final int value;
     ....
}
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
}

那如何构建出不可变对象了, 一般遵循下面几点:
1:把所有属性定义为private final类型, 初始化后不允许再修改
2:不定义setter方法,如果设置也要设置private 不允许外界访问
3:只提供getter方法,只允许访问
4:在构造器中初始化所以属性
5:类定义为final,防止出现子类(如果有必要)

代码演示
@Getter
@ToString
public final class User {
    private final String idNumber;  //身份证号
    private final String username;  //名称
    public User(String idNumber, String username){
        this.idNumber = idNumber;
        this.username = username;
    }
}
public class App {

    public static void main(String[] args) {
        final User user = new User("44080100000000", "wolfcode");
        new Thread(new Runnable() {
            public void run() {
                System.out.println(user);
            }
        }).start();
        new Thread(new Runnable() {
            public void run() {
                System.out.println(user);
            }
        }).start();
    }
}
User(idNumber=44080100000000, username=wolfcode)
User(idNumber=44080100000000, username=wolfcode)

不管开启多少个线程, 打印的数据都是一样的.

运用

到这可能会发问:什么情况选择使用Immutable Pattern呢?建议满足下面2个条件时使用:
1:实例创建后状态不能改变
2:实例是共享的,且必须频繁访问
Immutable Pattern 的优势在不使用synchronized进行保护也可以满足线程安全性,当实例被共享,且被频繁访问时,Immutable 模式优点就体现出来了,相对synchronized来说,能极大提高性能。

所以在java的jdk标识类库中很多类都是用该模式:
包装类:Boolean Byte Character Double Float Integer Long Short Void
awt中的: Color
字符串: String
大数据类:BigInteger Bigdecimal
正则:Pattern

总结

Immutable Pattern:不可变模式, 就是将共享资源对象设计成不可变对象, 线程只可以获取,不可以修改.这便可实现线程安全目的.

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

推荐阅读更多精彩内容