Immutable Object模式 - 多线程

前言

在多线程编程中,我们常会碰到修改一个对象的值,如果在不加锁的情况下 ,就会出现值不一致的问题,那么有没有一种方式可以不通过加锁的方式也可以保证数据的一致性呢,当然有,今天介绍的不可变对象模式就可以达到这样的效果

问题

如何在多线程情况下,不重复打印出0-99的数值

可变对象模式下
  1. 首先新建一个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;
}
}
  1. 新建一个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);
}
}
  1. 运行程序
/**
* @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();
}
}
}
  1. 运行结果如下:
.....前面结果省略

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等

不可变对象模式
  1. 首先新建一个不可变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);
} }
  1. 新建一个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);
}
}
  1. 运行程序
/**
* @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();
}
}
}
  1. 运行结果如下:
.....前面结果省略

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模式 - 多线程的更多相关文章

  1. Java多线程编程模式实战指南(二):Immutable Object模式

    多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...

  2. Java多线程编程模式实战指南(二):Immutable Object模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...

  3. Immutable Object模式

    多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线 ...

  4. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  5. Java多线程编程模式实战指南:Active Object模式(下)

    Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...

  6. Java多线程编程模式实战指南:Active Object模式(上)

    Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...

  7. Java多线程编程模式实战指南一:Active Object模式(下)

    Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...

  8. Java多线程编程模式实战指南一:Active Object模式(上)

    Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...

  9. Java多线程编程模式实战指南(一):Active Object模式--转载

    本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...

随机推荐

  1. Go语言圣经习题练习_1.5. 获取URL

    练习 1.7: 函数调用io.Copy(dst, src)会从src中读取内容,并将读到的结果写入到dst中,使用这个函数替代掉例子中的ioutil.ReadAll来拷贝响应结构体到os.Stdout ...

  2. 第一章jQuery基础

    一.jQuert简介 1.什么是jQuery jQuery是javaScript的程序库之一,它是javaScript对象和实用函数的封装. jQuery是继Prototype之后又一个优秀的java ...

  3. Linux文件系统损坏导致无法正常启动与fsck修复工具

    今天在打开自己的虚拟机学习的时候,发现在文件系统检查过程中出现以下的报错: /dev/mapper/VolGroup-lv_root:UNEXPECTED INCONSISTENCY;RUN fsck ...

  4. JS面向对象编程(二):构造函数的继承

    对象之间继承的 5 中方法.            比如, 现在有一个"动物"对象的构造函数.            function Animal(){              ...

  5. 【iOS】Interface Builder 预览

    Interface Builder 为最顶层视图提供了 Simulated Metrics,预览用户界面的各种外观设置效果,例如顶部有导航栏或底部有标签栏的效果,如图所示:

  6. 【iOS】iOS Error Domain=NSCocoaErrorDomain Code=3840 "未能完成操作。(“Cocoa”错误 3840。)"

    昨天遇到的这个问题,详细信息: ----->类和方法__25+[Manager noticeRequest:]_block_invoke399----->错误信息Error Domain= ...

  7. asp.net ashx处理程序中switch case的替代方案总结

    目录 1.用委托字典代替switch...case; 2.利用反射替代switch...case: 3.比较两种方案 4.其他方案 4.说明 5.参考 在开发 asp.net 项目中,通常使用一般处理 ...

  8. S2:log4j

    配置步骤 1.引入jar,放到lib中,jar包被项目管理 2.在src目录下copy了一个文件log4j.properties 3.使用Logger   String word="会员登记 ...

  9. 手动编译PHP开发环境

    目录 手动编译PHP开发环境 问题复盘 部署环境及配置 目标环境 安装部署环境开始 首先安装PHP 安装mysql 安装nginx 手动编译PHP开发环境 这是一篇来自深夜加班的手稿 问题复盘 你有没 ...

  10. 【POJ - 3616】Milking Time(动态规划)

    Milking Time 直接翻译了 Descriptions 贝茜是一个勤劳的牛.事实上,她如此​​专注于最大化她的生产力,于是她决定安排下一个N(1≤N≤1,000,000)小时(方便地标记为0. ...