美文网首页
线程基础(三十)

线程基础(三十)

作者: 叩丁狼教育 | 来源:发表于2019-08-26 17:12 被阅读0次

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

接上篇,本篇讲解线程另外一个设计模式: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:不可变模式, 就是将共享资源对象设计成不可变对象, 线程只可以获取,不可以修改.这便可实现线程安全目的.

相关文章

  • 线程基础(三十)

    本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 接上篇,本篇讲解线程另外一个设计模式:Immutab...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • Java-并发编程知识点总结

    目录: 线程基础 线程池 各种各样的锁 并发容器 原子类 Java 内存模型 线程协作 AQS 框架 一、线程基础...

  • 年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Nett

    并发编程 线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、...

  • Java多线程总结 之 基础概念

    基础概念 序言 线程知识结构图 线程基础 什么是线程: 线程和进程的区别: 什么是同步: 并发和并行的区别: 什么...

  • 线程-线程基础

    创建线程 new Thread(?).start() ?可以是2种。 runable接口的实现类 也可以继承Thr...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • 多线程方法

    一. 基础并行多线程结构 二. 标准多线程方法,控制并发线程数,带线程锁

  • 线程池

    线程池种类 ThreadPoolExecutor 基础线程池 线程执行任务过程 当前执行线程数 < corePoo...

  • NSThread三种创建线程的方法

    对耗时操作的理解 NSThread基础 线程控制 线程安全 线程间同行

网友评论

      本文标题:线程基础(三十)

      本文链接:https://www.haomeiwen.com/subject/hnedectx.html