zoukankan      html  css  js  c++  java
  • 了解什么是不变模式

    不变模式

    一)、不变模式的概述

    使用场景: 当多线程对同一个对象进行读写操作时,为保证对象数据的一致性和正确性,有必要对对象进行同步。

    作用: 确保在没有同步操作的多线程环境中,保持对象内部状态的一致性和正确性

    核心思想:一个对象一旦被创建,则它的内部状态将永远不会改变,同时,其内部状态也决不会自行发生改变。

    二)、不变模式与只读属性的区别

    只读属性:对象本身不能被其他线程修改, 对象的自身状态却可能自行修改。

    不变模式:没有一个线程可以修改其内部结构和数据,同时,其内部状态也 不会自行改变,即自对象创建后,内部状态和数据保持绝对的稳定。

    只读属性举例:

    一个对象的存活时间(对象的创建时间和当前时间的时间差)是只读的,因为任何一个第三方线程都不能修改这个属性,因为随着时间的推移,存活时刻都在发生变化,并不满足不变模式的要求,无论出于什么原因,对象自创建后,其内部状态和数据保持绝对的稳定。

    三)、不变模式的使用场景

    1).当对象被创建后,其内部状态和数据不再发生任何变化。

    2).对象需要共享、被多线程频繁访问。

    四)、不变模式的实现

    1).去除setter方法以及所有修改自身属性的方法

    2).将所有属性设为私有,并用final标记

    3).确保没有子类可以重载修改它的行为

    4).有一个可以创建完整对象的构造函数

    product类:

    /**
     * 不变模式的实现:
     *
     *    Product: 产品类
     *
     *    属性:
     *    no: 序列号
     *    name: 名称
     *    price:价格
     *
     *    不变模式的要求:
     *    1.类由final修饰,没有子类重载可以改变它的行为
     *    2.属性由final修饰,确保不可改
     *    3.去除setter以及所有修改属性的方法
     *    4.有一个可以创建完整对象的构造函数
     *
     * */
    //1.类名由final修饰
    public final class Product {
        //2.属性由private final修饰
        private final String no;
        private final String name;
        private final double price;
        //3.没有设置setter方法
    
        //4.可以创建完整对象的构造函数
        public Product(String no, String name, double price) {
            this.no = no;
            this.name = name;
            this.price = price;
        }
    }
    

    五)、不变模式在JDK中的应用

    JDK中,不变模式的应用非常广泛。

    java.lang.String类和所有的元数据类包装类,都是使用不变模式实现的。

    JDK的主要不变模式类型如下:

    java.lang.Stirng
    
    java.lang.Boolean
    
    java.lang.Byte
    
    java.lang.Character
    
    java.lang.Double
    
    java.lang.Float
    
    java.lang.Integer
    
    java.lang.Long
    
    java.lang.Short
    

    注:在多线程的环境下,不变对象是不需要进行同步操作的。

    金麟岂能忍一世平凡 飞上了青天 天下还依然
  • 相关阅读:
    android界面横屏和竖屏的切换
    google 提供webrtc 的实例使用 turnserver的方式
    如何使官方提供的AppRTCDemo 运行在自己搭建的server(官方提供的apprtc)上(官方的server源码)
    android在全屏下第一次触摸屏幕没有触发事件
    ubuntu常用命令记录集
    python 一个包中的文件调用另外一个包文件 实例
    python-插入排序
    phantomjs submit click
    python socket.error: [Errno 10054] 解决方法
    python-快速排序,两种方法→易理解
  • 原文地址:https://www.cnblogs.com/Auge/p/11703374.html
Copyright © 2011-2022 走看看