Java并发编程实战~Immutability模式

        解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。

快速实现具备不可变性的类

        将一个类所有的属性都设置成 final 的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。更严格的做法是这个类本身也是 final 的,也就是不允许继承。因为子类可以覆盖父类的方法,有可能改变不可变性,所以推荐你在实际工作中,使用这种更严格的做法。

        经常用到的 String 和 Long、Integer、Double 等基础类型的包装类都具备不可变性。

利用享元模式避免创建重复对象

        享元模式本质上其实就是一个对象池,利用享元模式创建对象的逻辑也很简单:创建之前,首先去对象池里看看是不是存在;如果已经存在,就利用对象池里的对象;如果不存在,就会新创建一个对象,并且把这个新创建出来的对象放进对象池里。

使用 Immutability 模式的注意事项

1. 对象的所有属性都是 final 的,并不能保证不可变性;
2. 不可变对象也需要正确发布。

例如下面的代码中,Bar 的属性 foo虽然是 final 的,依然可以通过 setAge() 方法来设置 foo 的属性 age。所以,在使用Immutability 模式的时候一定要确认保持不变性的边界在哪里,是否要求属性对象也具备不可变性。

class Foo{int age = 0;int name = "abc";
}final class Bar {final Foo foo;void setAge(int a){foo.age = a;}
}

下面我们再看看如何正确地发布不可变对象。不可变对象虽然是线程安全的,但是并不意味着引用这些不可变对象的对象就是线程安全的。例如在下面的代码中,Foo 具备不可变性,线程安全,但是类 Bar 并不是线程安全的,类 Bar 中持有对 Foo 的引用 foo,对 foo这个引用的修改在多线程中并不能保证可见性和原子性。

//Foo 线程安全
final class Foo{final int age = 0;final int name = "abc";
}//Bar 线程不安全
class Bar {Foo foo;void setFoo(Foo f){this.foo = f;}
}

如果你的程序仅仅需要 foo 保持可见性,无需保证原子性,那么可以将 foo 声明为volatile 变量,这样就能保证可见性。如果你的程序需要保证原子性,那么可以通过原子类来实现。

public class SafeWM {class WMRange{final int upper;final int lower;WMRange(int upper,int lower){// 省略构造函数实现}}final AtomicReference<WMRange>rf = new AtomicReference<>(new WMRange(0,0));// 设置库存上限public void setUpper(int v){while(true){WMRange or = rf.get();// 检查参数合法性if(v < or.lower){throw new IllegalArgumentException();}WMRange nr = new WMRange(v, or.lower);if(rf.compareAndSet(or, nr)){return;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析:AWS、谷歌云、IBM Cloud和微软 Azure四巨头2018将会有哪些布局?

来源&#xff1a; IDC圈近来&#xff0c;公司规模已经不再是企业选择云服务商的重要因素&#xff0c;市场对云服务商优劣的判断有了多种标准。企业对全球一些大型云计算服务商&#xff08;例如亚马逊AWS&#xff0c;谷歌云平台&#xff0c;IBM Cloud和微软 Azure等&#xff09;…

讲解SQL Server定时作业job的设置方法

如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现。 ◆1、管理->SQL Server代理->作业(按鼠标右键)->新建作业-> ◆2、新建作业属性(常规)->名称[自定义本次作业的名称]…

C++学习之路 | PTA乙级—— 1093 字符串A+B (20 分)(精简)

1093 字符串AB (20 分) 给定两个字符串 A 和 B&#xff0c;本题要求你输出 AB&#xff0c;即两个字符串的并集。要求先输出 A&#xff0c;再输出 B&#xff0c;但重复的字符必须被剔除。 输入格式&#xff1a; 输入在两行中分别给出 A 和 B&#xff0c;均为长度不超过 10​6​​…

用法 stl_C++STL 容器篇

前言上一章节主要是详细介绍了C泛型编程基础&#xff0c;不清楚的可以回顾一下哦。本章节主要针对于CSTL(标准模板类库)做个详细介绍。标准模板类库也就是别人写的模板类&#xff0c;主要内容是各种数据结构的封装&#xff0c;以及常用算法。暂时分三个章节介绍&#xff0c;本章…

超级强大的 vim 配置(vimplus)

From : http://www.cnblogs.com/highway-9/p/5984285.html From : http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html From : http://www.cnblogs.com/youxia/p/linux002.html From : http://blog.csdn.net/namecyf/article/details/7787479 最近在重新配置Vim&a…

谷歌将屏蔽一切与加密货币相关的广告 6月正式生效

来源&#xff1a;腾讯证券北京时间3月14日下午消息&#xff0c;据外媒报道&#xff0c;谷歌开始对与加密货币相关的广告的进行打击。谷歌可持续广告业务负责人斯科特-斯宾塞&#xff08;Scott Spencer&#xff09;在接受CNBC采访时称&#xff0c;该公司正在调整与金融服务相关的…

Java并发编程实战~Copy-on-Write模式

Copy-on-Write 模式的应用领域 1、在操作系统领域。类 Unix 的操作系统中创建进程的 API 是 fork()&#xff0c;传统的 fork() 函数会创建父进程的一个完整副本 2、很多文件系统也同样用到了&#xff0c;例如 Btrfs (B-Tree File System)、aufs&#xff08;advanced multi-la…

[导入]身份验证方面的问题

目前再研究Discuz !NT 1.0源码发现它Web.config中设置,为什么不用Form方式,有谁能说说?文章来源:http://topic.csdn.net/u/20080828/11/051abbea-ba95-466d-afcd-82bbb0f647e3.html转载于:https://www.cnblogs.com/zengxlf/articles/1279232.html

ARM体系结构与汇编指令

可编程器件的特点 • CPU在固定频率的时钟控制下节奏运行。 • CPU可以通过总线读取外部存储设备中的二进制指令集&#xff0c;然后解码执行。 • 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的&#xff0c;是CPU的设计者&#xff08;ARM公司&#xff09;定义的&a…

微软宣布在机器翻译方面取得突破,中翻英可达人类水平

来源&#xff1a;猎云网一组微软研究团队于本周三宣布&#xff0c;他们已经创造了第一个能够将中文新闻翻译成英文的机器翻译系统&#xff0c;精确度与人类译者一致。该公司表示&#xff0c;它通过来自各种在线报纸的约2000条语句样本对这一系统进行了反复测试&#xff0c;并将…

pla3d打印材料密度_3D打印金属材料模型过程中常见问题

在金属3D打印过程中&#xff0c;可能会出现大量设备操作者试图避免的问题&#xff0c;包括孔隙、残余应力、致密度、翘曲、裂纹及表面光洁度等。下面我们来谈谈这几种常出现的问题。1、表面光洁度在金属3D打印件被使用或放置在展柜之前&#xff0c;它已经经历了大量类似CNC加工…

GPID和LED

笔记源自《朱老师物联网大讲堂》 《1.4.ARM裸机第四部分-GPIO和LED》 第一部分、章节目录 1.4.1.裸机实验体验之usb启动配合dnw工具下载 1.4.2.裸机实验体验之SD卡下载 1.4.3.自己动手安装交叉编译工具链1 1.4.4.自己动手安装交叉编译工具链2 1.4.5.Makefile大侠隆重登场 1.4…

Java并发编程实战~ThreadLocal

ThreadLocal 的使用方法 static class SafeDateFormat {// 定义 ThreadLocal 变量static final ThreadLocal<DateFormat>tl ThreadLocal.withInitial(()-> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));static DateFormat get(){return tl.get();} }// …

智慧停车介绍、产业链市场全透析

来源&#xff1a;传感器技术最近&#xff0c;Goodwin调查发现&#xff0c;在城市地区&#xff0c;接近30%的交通拥堵源自于司机寻找停车位。据称&#xff0c;到2020年&#xff0c;将会有20亿的汽车在公路上跑着&#xff0c;这就意味着&#xff0c;届时汽车的数量将比目前多了7.…

Python 下载 图片、音乐、视频 和 断点续传

Python3 使用 requests 模块显示下载进度: http://blog.csdn.net/supercooly/article/details/51046561 python编写断点续传下载软件&#xff1a;https://www.leavesongs.com/PYTHON/resume-download-from-break-point-tool-by-python.html Python实现下载界面(带进度条&…

.NET Framework 2.0新增特性总结

下午闲着无聊&#xff0c;翻了翻很久之前买的书籍&#xff0c;看了一下dotNetFramework2.0后添加的特性&#xff0c;包括以下几点&#xff1a; 代码段。这个功能很早就知道了&#xff0c;Framework已经提供了很多代码段&#xff0c;我们也可以自定义代码段&#xff0c;不过之前…

10停止nginx命令 win_Linux下配置Nginx并使用https协议

环境Centos7.6nginx-1.17.0下载官网&#xff1a;http://nginx.org/download/nginx-1.17.0.tar.gz环境确认在安装nginx前首先要确认系统中是否安装gcc、pcre-devel、zlib-devel、openssl-devel检查是否安装过软件包yum list installed | grep xxx安装软件包yum -y install gcc p…

s5pv210开发板、原理图、刷机和数据手册

笔记源自《朱老师物联网大讲堂》 《1.3.ARM裸机第三部分-开发板、原理图和数据手册》 第一部分、章节目录 1.3.1.开发板和光盘资料简介 1.3.2.开发板硬件手册带读 1.3.3.开发板刷系统1 1.3.4.开发板刷系统2 1.3.5.开发板刷系统3 1.3.6.X210核心板、底板原理图导读1 1.3.7.X21…

腾讯AI Lab发布三大核心战略,与自然科研达成战略合作

来源&#xff1a;腾讯AI实验室3月15日&#xff0c;腾讯AI Lab第二届学术论坛在深圳举行&#xff0c;聚焦人工智能在医疗、游戏、多媒体内容、人机交互等四大领域的跨界研究与应用。全球30位顶级AI专家出席&#xff0c;对多项前沿研究成果进行了深入探讨与交流。本次论坛以“共享…

Java并发编程实战~Guarded Suspension模式

Guarded Suspension 模式 比如&#xff0c;项目组团建要外出聚餐&#xff0c;我们提前预订了一个包间&#xff0c;然后兴冲冲地奔过去&#xff0c;到那儿后大堂经理看了一眼包间&#xff0c;发现服务员正在收拾&#xff0c;就会告诉我们&#xff1a;“您预订的包间服务员正在收…