Immutable Object模式 - 多线程
发布时间:2020-12-15 07:53:00 所属栏目:Java 来源:网络整理
导读:Immutable Object模式 - 多线程 前言 在多线程编程中,我们常会碰到修改一个对象的值,如果在不加锁的情况下 ,就会出现值不一致的问题,那么有没有一种方式可以不通过加锁的方式也可以保证数据的一致性呢,当然有,今天介绍的不可变对象模式就可以达到这样
Immutable Object模式 - 多线程前言
问题
可变对象模式下
/** * @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; } }
/** * @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 :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
不可变对象模式
/** * @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); } }
/** * @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
总结
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |