线程安全Collections.synchronizedList
ollections.synchronizedList引发的线程安全问题
有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类
似 private static List<Task> taskQueue = Collections.synchronizedList(new
LinkedList<Task>());的方法可以得到本身不是线程安全的容易的线程安全的状态,但是要注意
的是线程安全仅仅指的是如果直接使用它提供的函数,比如:queue.add(obj); 或者
queue.poll(obj);,这样我们自己不需要做任何同步。
但如果是非原子操作,比如:
1. if(!queue.isEmpty()) {
2. queue.poll(obj);
3. }
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)
我们很难保证,在调用了isEmpty()之后,poll()之前,这个queue没有被其他线程修改。
所以对于这种情况,我们还是需要自己同步:
1. synchronized(queue) {
2. if(!queue.isEmpty()) {
3. queue.poll(obj);
4. }
5. }
对于Collections.synchronizedList(new LinkedList<Task>()),
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:
List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext())
foo(i.next()); }
最新文章
- block,inline和inline-block概念和区别(转)
- KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
- ASP.NET MVC案例——————拦截器
- html5用到的js
- parent relation column can&#39;t be updated LESSON_EXTENDED_ATTRIBUTE->;LESSON_ID
- python参考手册 Read
- 学习使用Vim(一)
- docker安装使用
- JSP标准标签库(JSTL)--函数标签库 fn
- js加密
- centos 6安装opencv
- Java NIO SocketChannel套接字通道
- 用不到 50 行的 Python 代码构建最小的区块链
- vue里使用create、mounted调用方法的正确姿势
- 【转】机器学习在B2B的应用
- cookie详解(含vue-cookie)
- ArcGIS Server 内存占用相关
- Lintcode: Kth Prime Number (Original Name: Ugly Number)
- VisualSVN:允许修改svn提交日志(pre-revpro-change hook)
- Pycharm远程连接服务器,并在本地调试服务器代码