博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
还没理解,有待补充---易变域上的同步
阅读量:7121 次
发布时间:2019-06-28

本文共 2048 字,大约阅读时间需要 6 分钟。

hot3.png

常看到在易变域上的同步代码,并且写的同学会很自然觉得这样是安全和正确的。

# 问题分析见文章链接:,对应的英文文章:
Demo类。

Demo说明

主线程中开启2个任务线程执行addListener。主线程最终结果检查。

问题说明

最终Listener的个数不对。

快速运行

mvn compile exec:java -Dexec.mainClass=com.oldratlee.fucking.concurrency.SynchronizationOnMutableFieldDemo

具体demo:

public class SynchronizationOnMutableFieldDemo {    static final int ADD_COUNT = 10000;    static class Listener {        // stub class    }    private volatile List
listeners = new CopyOnWriteArrayList
(); public static void main(String[] args) throws Exception { SynchronizationOnMutableFieldDemo demo = new SynchronizationOnMutableFieldDemo(); Thread thread1 = new Thread(demo.getConcurrencyCheckTask()); thread1.start(); Thread thread2 = new Thread(demo.getConcurrencyCheckTask()); thread2.start(); thread1.join(); thread2.join(); int actualSize = demo.listeners.size(); int expectedSize = ADD_COUNT * 2; if (actualSize != expectedSize) { // 在我的开发机上,几乎必现!(简单安全的解法:final List字段并用并发安全的List,如CopyOnWriteArrayList) System.err.printf("Fuck! Lost update on mutable field! actual %s expected %s.\n", actualSize, expectedSize); } else { System.out.println("Emm... Got right answer!!"); } } public void addListener(Listener listener) { synchronized (listeners) { List
results = new ArrayList
(listeners); results.add(listener); listeners = results; } } ConcurrencyCheckTask getConcurrencyCheckTask() { return new ConcurrencyCheckTask(); } private class ConcurrencyCheckTask implements Runnable { @Override public void run() { System.out.println("ConcurrencyCheckTask started!"); for (int i = 0; i < ADD_COUNT; ++i) { addListener(new Listener()); } System.out.println("ConcurrencyCheckTask stopped!"); } }}

 

转载于:https://my.oschina.net/u/1024107/blog/759393

你可能感兴趣的文章
前端重构实践(一) —— 性能优化
查看>>
Oracle 10g 问题集锦
查看>>
如何处理IE首页被篡改的问题
查看>>
思科网络设备模拟器GNS3与SecureCRT关联
查看>>
Activemq判断队列存活脚本(一)
查看>>
系统状态检测 及进程控制
查看>>
xen-tools创建虚拟机找不到root fs的解决办法
查看>>
IBM X3650 M4 服务器
查看>>
备份和归档的区别
查看>>
shell基础
查看>>
linux 文件类型 时间戳 ls bash特性四 文件查看命令 cp move echo
查看>>
如何在XenDesktop中映射USB设备
查看>>
Java并发编程 基础知识学习总结
查看>>
我又发现一个直接就能安装中文小红帽的方法
查看>>
ACM弱校ACMer A HDU1045Fire Net有感
查看>>
cxgrid实现分组统计和添加Footer
查看>>
刘敏华:2013年网络营销行业展望
查看>>
理解MySQL——架构与概念
查看>>
vsftpd虚拟用户
查看>>
ionic 幻灯指令 ion-slide-box
查看>>