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()); }

最新文章

  1. block,inline和inline-block概念和区别(转)
  2. KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
  3. ASP.NET MVC案例——————拦截器
  4. html5用到的js
  5. parent relation column can&#39;t be updated LESSON_EXTENDED_ATTRIBUTE-&gt;LESSON_ID
  6. python参考手册 Read
  7. 学习使用Vim(一)
  8. docker安装使用
  9. JSP标准标签库(JSTL)--函数标签库 fn
  10. js加密
  11. centos 6安装opencv
  12. Java NIO SocketChannel套接字通道
  13. 用不到 50 行的 Python 代码构建最小的区块链
  14. vue里使用create、mounted调用方法的正确姿势
  15. 【转】机器学习在B2B的应用
  16. cookie详解(含vue-cookie)
  17. ArcGIS Server 内存占用相关
  18. Lintcode: Kth Prime Number (Original Name: Ugly Number)
  19. VisualSVN:允许修改svn提交日志(pre-revpro-change hook)
  20. Pycharm远程连接服务器,并在本地调试服务器代码

热门文章

  1. java_设计模式_装饰设计模式
  2. opencv:自定义滤波
  3. 你了解真正的 restful API 吗?
  4. The Preliminary Contest for ICPC Asia Xuzhou 2019 J Random Access Iterator (树形DP)
  5. 1010 Radix
  6. GridView 列表组件 以及动态 GridView
  7. 消息队列(五)--- RocketMQ-消息存储4
  8. 反编译 java
  9. Net Core解决ZipFile解压中文出现乱码
  10. Unix系统级I/O