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. ArchSummit分享 | 高德地图App架构演化与实践

    讲师介绍 郝仁杰,高德地图无线开发专家.在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享. 背景概述 高德是国内领先的数字地图内容.导航和位置服务 ...

  2. 通过mark和reset方法重复利用InputStream

    InputStreammarkreset 在这篇博客中我们已经简单的知道可以通过缓存InputStream来重复利用一个InputStream,但是这种方式的缺点也是明显的,就是要缓存一整个Input ...

  3. redis订阅者与发布者

    #conding=utf-8 #一.创建redis类 文件名 RedisHelper import redis # conn=redis.Redis(host='127.0.0.1')# import ...

  4. Hive映射HBase表的几种方式

    1.Hive内部表,语句如下 CREATE TABLE ods.s01_buyer_calllogs_info_ts( key string comment "hbase rowkey&qu ...

  5. 动态开内存(malloc与calloc)

    malloc与calloc 1.函数原型 #include<stdlib.h> void *malloc(unsigned int size);     //申请size字节的内存 voi ...

  6. thinkphp3.2集成极光推送

    项目中用到了给客户端的推送功能,选用了极光推送,下面演示一下在thinkphp中集成极光推送 1.下载极光推送的php类,可以从笔者的git下载 地址:https://git.oschina.net/ ...

  7. FTP工具-FileZilla安装使用教程

    1.首先,百度搜索“FileZilla”,进入官网,下载地址:https://www.filezilla.cn/download/client  ,根据自己电脑配置去下载 2.下载本地,双击运行安装程 ...

  8. weblogic10.3.6漏洞修改方案

    1.CVE-2018-2628漏洞 CVE-2018-2628漏洞利用的第一步是与weblogic服务器开放在服务端口上的T3服务建立socket连接,可通过控制T3协议的访问来临时阻断攻击行为. W ...

  9. echarts3.x 入门

    echarts 使用 1.getStart 1.1引入 echart <!-- 引入 ECharts 文件 --> <script src="echarts.min.js& ...

  10. Go中的interface学习

    学过Java的同学都知道在Java中接口更像是一种规范,用接口定义了一组方法,下面实现这个接口的类只管按照写好的方法名和返回值去实现就好,内部如何实现是各个方法自己的事情,接口本身不关注. 另外Jav ...