Immutable Object模式 - 多线程
Immutable Object模式 - 多线程
前言
在多线程编程中,我们常会碰到修改一个对象的值,如果在不加锁的情况下 ,就会出现值不一致的问题,那么有没有一种方式可以不通过加锁的方式也可以保证数据的一致性呢,当然有,今天介绍的不可变对象模式就可以达到这样的效果
问题
如何在多线程情况下,不重复打印出0-99的数值
可变对象模式下
- 首先新建一个Count对象,代码如下:
/**
* @Author: Wang Chong
* @Date: 2019/9/2 22:02
* @Version: V1.0
*/
public class Count {
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
- 新建一个CountThread线程
/**
* @Author: Wang Chong
* @Date: 2019/9/2 22:14
* @Version: V1.0
*/
public class CountThread implements Runnable {
private Count count;
public CountThread(Count count) {
this.count = count;
}
@Override
public void run() {
int i = count.getI();
System.out.println("no immutable object,current is is :" + i);
}
}
- 运行程序
/**
* @Author: Wang Chong
* @Date: 2019/9/2 22:17
* @Version: V1.0
*/
public class CountMain {
public static void main(String[] args) {
Count count = new Count(0);
for (int i=0; i<100;i++){
count.setI(i);
CountThread countThread = new CountThread(count);
new Thread(countThread).start();
}
}
}
- 运行结果如下:
.....前面结果省略
no immutable object,current is is :93
no immutable object,current is is :93
no immutable object,current is is :94
no immutable object,current is is :96
no immutable object,current is is :85
no immutable object,current is is :97
no immutable object,current is is :98
no immutable object,current is is :91
no immutable object,current is is :99
no immutable object,current is is :99
no immutable object,current is is :99
可以发现运行结果中很多重复数字,例如93,99等
不可变对象模式
- 首先新建一个不可变CountImmutable对象,代码如下:
/**
* @Author: Wang Chong
* @Date: 2019/9/2 22:02
* @Version: V1.0
*/
public final class CountImmutable {
private volatile int i;
CountImmutable(int i){
this.i = i;
}
public int getI() {
return i;
}
/**
* 返回新的实例
* @param i
* @return
*/
public CountImmutable set(int i){
return new CountImmutable(i);
}
}
- 新建一个CountImmutableThread线程
/**
* @Author: Wang Chong
* @Date: 2019/9/2 22:14
* @Version: V1.0
*/
public class CountImmutableThread implements Runnable {
private CountImmutable count;
public CountImmutableThread(CountImmutable count) {
this.count = count;
}
@Override
public void run() {
int i = count.getI();
System.out.println("current is :" + i);
}
}
- 运行程序
/**
* @Author: Wang Chong
* @Date: 2019/9/2 22:17
* @Version: V1.0
*/
public class ImmutableDemo {
public static void main(String[] args) {
CountImmutable count = new CountImmutable(0);
for (int i=0; i<100;i++){
count = count.set(i);
CountImmutableThread countThread = new CountImmutableThread(count);
new Thread(countThread).start();
}
}
}
- 运行结果如下:
.....前面结果省略
current is :69
current is :45
current is :89
current is :54
current is :57
current is :58
current is :39
current is :47
current is :51
current is :55
current is :91
current is :95
current is :99
从上面的代码,可以看到不可变对象模式下,多线程环境中不通过加锁的方式也可以保证数值的一致性
总结
不可变对象模式适用场景如下:
- 被建模对象状态变化不频繁
- 同时对一组相关的数据进行写操作,要保证其原子性
- 当要用某个对象的key作为安全HashMap的Key
Immutable Object模式 - 多线程的更多相关文章
- Java多线程编程模式实战指南(二):Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...
- Java多线程编程模式实战指南(二):Immutable Object模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...
- Immutable Object模式
多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...
- 多线程程序设计学习(3)immutable pattern模式
Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者 1.1:immutable参与者是一个 ...
- Java多线程编程模式实战指南:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南:Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
- Java多线程编程模式实战指南一:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南一:Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
- Java多线程编程模式实战指南(一):Active Object模式--转载
本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...
随机推荐
- [ PyQt入门教程 ] PyQt5环境搭建和配置
PyQt入门系列教程主要目的是希望通过该系列课程学习,可以使用PyQt5工具快速实现简单的界面开发,包括界面设计.布局管理以及业务逻辑实现(信号与槽).简单说就是可以使用PyQt5工具快速画一个控件摆 ...
- UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十五场
传送门 A: Colorful Subsequence •题意 给一个长为n的小写字母序列,从中选出字母组成子序列 问最多能组成多少种每个字母都不相同的子序列 (不同位置的相同字母也算是不同的一种) ...
- 图像相似度中的Hash算法
度量两张图片的相似度有许多算法,本文讲介绍工程领域中最常用的图片相似度算法之一--Hash算法.Hash算法准确的说有三种,分别为平均哈希算法(aHash).感知哈希算法你(pHash) ...
- RobotFramework_3.SeleniumLibrary操作(一)
RobotFramework_3.SeleniumLibrary操作(一) *:first-child { margin-top: 0 !important; } body>*:last-chi ...
- 【Docker】unauthorized: incorrect username or password
昨天朋友推荐玩玩 Docker.虽然之前就听过,但一直不清楚干嘛的,也没去搞过,虽然前段时间就装了,但一直没打开.这两天刚开始熟悉,就遇到了点小问题.一番 Google 之后解决了,记录一下. CLI ...
- 【iOS】Your account already has a valid ios
打包内测的时候遇到了这个问题,如图所示: 官网解决办法: If the certificate already exists in Member Center, a “Your account alr ...
- 【iOS】iOS CocoaPods 整理
github 上下载 Demo 时第一次遇到这个情况,当时有些不知所措,也没怎么在意,后来项目调整结构时正式见到了这个,并且自己去了解学习了. CocoaPods安装和使用教程 这篇文章写得很好!ma ...
- JVM总结(三)
JVM总结(3)Class文件,类加载机制.编译过程 Java编译器先把Java代码编译为存储字节码的Class文件,再通过Class文件进行类加载. Class类文件的结构 Java编译器可以把Ja ...
- Vue系列:Slot 插槽的使用范例
插槽对于自定义的组件开发来说,是十分强大的功能.这篇主要做个简单梳理 插槽可以分3种: 1.简单插槽 2.具名插槽 3.作用域插槽
- docker-compose 综合训练
Docker-compose综合训练 一. 实验目的: 熟悉Docker-compose的基本工作原理: 熟悉Docker-compose安装 熟悉Docker compose命令基础 熟悉Docke ...