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 ...
随机推荐
- [Revit]Autodesk Revit 二次开发整理(资料、准备工作和环境搭建)
1 前言 Revit被Autodesk收购之后,整理和开放了一大部分API,供开发者实现自己的功能和程序,总体来说API的功能比较完善,毕竟市面上已经出现了各式各样的插件. 本人也是初学者,在Revi ...
- java抽奖思路
现在在做一个有关抽奖的活动,将我自己所做的抽奖思路书写一下 1.项目奖项的配置存储在MongoDB 配置的参数为 奖项的等级(prizeLevel).数量(prizeNum).奖项的名称(prizeN ...
- 【Java】Class JavaLaunchHelper is implemented in both ** and **
详细问题描述如下: objc[64179]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachin ...
- [__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x17deba00
还真是一波未平一波又起,又出现了这个问题,详情如下: -[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized ...
- Qtech 暑假未讲到的算法(不完全)
一.数据结构: 优先队列.堆.RMQ问题(区间最值问题,可以用线段树解决,还有一个Sparse-Table算法).排序二叉树.划分树.归并树..... 字符串处理: KMP.字典树.后 ...
- 从JavaScript到Python之异常
不少前端工程师看到这个标题可能会产生质问: 我js用得好好的,能后端能APP,为什么还要学习Python? 至少有下面两个理由: 学习曲线.ES6之后的JavaScript(TypeScript)的在 ...
- 【Java例题】2.8 解一元二次方程
8.解一元二次方程. 输入一元二次方程的a,b,c三个系数,解一元二次方程 ax^2+bx+c=0,输出两个根 package study; import java.util.Scanner; pub ...
- 3、数组的声明及初始化(test1.java)
今天学习了,一位数组和二维数组,先学习了数组的申请,数组的初始化,数组的拷贝等.对于数组我认为,和C\C++中的数组,没有什么太大的区别,但是在JAVA中,大家都知道JAVA是面向对象的编程语言,每一 ...
- requestAnimationFrame 兼容方案
[toc] 编写涉及:css, html, js 在线演示codepen html代码 <div class="roll-box"> <div class=&qu ...
- node一键发布,并运行
作为一个前端开发人员如果你只会写一些业务代码,从程序员的角度来考虑已经可以了.但是从架构的角度来考虑那远远不够: 在此记录下成长中的经历: 想要达成的目的:运行一个脚本实现代码的打包,上传至服务器并部 ...