谈谈java的Collections.synchronized()
来源:互联网 发布:网络教育几月发毕业证 编辑:程序博客网 时间:2024/05/22 03:06
java中Collections.synchronized()的方法很好用~
有一次看到一个很优秀的同事写了以下一串代码,如下
private static volatile ConcurrentMap<String, Map<Integer, Set<String>>> all;public void demo(){ ... Map<Integer, Set<String>> foo =Collections.synchronizedMap(new HashMap<Integer, Set<String>>()); //point 1 ... Set<String> bar = Collections.synchronizedSet(preIdSet);//point 2 foo.put("ff",bar); .... all.put("bb",foo);point 3}
我本能的提出质疑,我说你见过哪个源码有这样写过?我对源码的阅读虽然不多,却也不能算是孤陋寡闻。这样的写法就是很奇怪。
我提出每个类方法中的变量都是安全的。怎么可能需要同步呢?
他的解释是代码会被放入在point 3的all全局变量中,这样的解释是合理的。
因为all是全局变量,你把point 1和point 2放入里面后,的确会面临被其它线程的修改。
最近看书,思想总是会飘来飘去。我想起了这件事,就再次思考。
首先对于all这个变量,它已经是线程安全的了,何必再继续对内部的每个变量再进行一次同步操作呢,这样只会浪费性能。
举个例子,要想保证all变量的线程安全,必须保证all里面的对象A不能被同时修改。
既然A对象已经被锁住不能同时修改了,何必继续对A对象内部的a加锁呢?
修改a即是对A对象修改。所以它不可能被其他线程修改。
更正一下:
现在觉得以上想法是有问题的。
synchronized方法获得的对象 只保证对象的每个方法执行中是线程安全的。并不表示,方法结束后,它依然是线程安全的。
例如,线程安全的Map执行get(),会保证get中是线程安全的,但是get得到对象后,这个对象依然有可能被其他线程修改。
0 0
- 谈谈java的Collections.synchronized()
- Synchronized collections vs Concurrent collections
- Java Notes: Synchronized的类锁和对象锁以及谈谈线性安全类
- java-Collections的应用
- java Collections 的用法
- Java Collections的常见问题
- 关于 Collections.synchronized...方法实现线程安全的实质
- 谈谈java线程锁synchronized关键字和volatile关键字
- synchronized java的见解
- java的synchronized关键字
- java的synchronized
- java的synchronized详解
- Java的关键字synchronized
- Java的synchronized
- java的synchronized用法
- java synchronized的运用
- java 的synchronized详解
- java的synchronized总结
- Building Crosswalk For Windows
- 第十六周阅读程序4(3)
- 第六章 注解式控制器详解—请求映射规则详解
- 02_01_Linux操作系统及常用命令
- 单链表的有关算法
- 谈谈java的Collections.synchronized()
- iOS 使用Mansory 进行键盘和输入框的适配
- 曲里电站出现开关机不动作的问题之解决过程
- C/C++——vector的基本操作总结
- oracle-PL/SQL基本语法
- 高精度四则运算模板
- Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)
- ios method swizzling
- axis2发布web项目开发webservice和接口调用