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 ...
随机推荐
- 转 java - java基础知识点
转 https://www.cnblogs.com/xdp-gacl/p/3641769.html 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可 ...
- 林大妈的JavaScript基础知识(一):JavaScript简史
前言:做一名Web设计师是一件令人兴奋的事.在Web技术中,JavaScript是一个经历从被人误解到万众瞩目的巨大转变,在历史的冲击中被留存下来的个体.因为JavaScript的引导,Web开发也从 ...
- Android Studio项目/Flutter 案例中Gradle报错通用解决方案(包括Unable to tunnel through proxy问题)
目录 Step 1:修改Gradle版本为本地版本 Step 2:修改classpath为Android Studio版本 Step 3:关闭代理 Step 1:修改Gradle版本为本地版本 ...
- UE4 代理 BindRaw和BindUObject
代理允许您在C++对象上以通用的但类型安全的方式调用成员函数.通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系. 任何时候都应该通过 ...
- django+uwsgi+nginx 部署生产环境
一.Uwsgi安装 python3 -m pip install uwsgi cp /usr/local/python3/bin/uwsgi /usr/bin/ 测试 在django项目主目录下cre ...
- java 8中新的日期和时间API
java 8中新的日期和时间API 使用LocalDate和LocalTime LocalDate的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息.另外,它也不附带任何与时区相关的信 ...
- vmware15pro安装ubuntu18.10时出现显示不全问题
如果这个时候用网上的ALT+左键拖拽根本没有效果 所以这里提供另外一种方式 就是正常安装的时候发现分区部分显示不全 此时点击右上角的橙色小×:询问是否退出 我们点击退出:之后就会来到试用界面 到了这里 ...
- 【Java例题】2.6 三角形的面积
6. 用海伦公式计算三角形的面积. 设边长分别时a,b和c,s=(a+b+c)/2, 则三角形面积area=sqrt(s*(s-a)*(s-b)*(s-c)). package study; impo ...
- 数据结构之最小堆的实现C++版
完全二叉树之所以用数组的方式存在,在于他的一个特性 若子节点为i,则父节点为(i-1)/2,注意c++特性,该结果肯定是个整数. 若父节点为j,则子节点必为2*j+1;则在数组里面可以非常方便的通过下 ...
- Go中的反射reflect
前面我们在学习到struct结构体的时候,因为结构体中的字段首字母大写,而我们想把json文件映射到该结构体上时,需要在在结构体字段后面加上json标签,表明结构体字段和json字段的映射关系.这其中 ...