Collections.synchronizedList使用

Collections.synchronizedList使用

1.SynchronizedList类具体代码:

  static class SynchronizedList<E>extends SynchronizedCollection<E>implements List<E> {private static final long serialVersionUID = -7754090372962971524L;final List<E> list;SynchronizedList(List<E> list) {super(list);this.list = list;}SynchronizedList(List<E> list, Object mutex) {super(list, mutex);this.list = list;}public boolean equals(Object o) {if (this == o)return true;synchronized (mutex) {return list.equals(o);}}public int hashCode() {synchronized (mutex) {return list.hashCode();}}public E get(int index) {synchronized (mutex) {return list.get(index);}}public E set(int index, E element) {synchronized (mutex) {return list.set(index, element);}}public void add(int index, E element) {synchronized (mutex) {list.add(index, element);}}public E remove(int index) {synchronized (mutex) {return list.remove(index);}}public int indexOf(Object o) {synchronized (mutex) {return list.indexOf(o);}}public int lastIndexOf(Object o) {synchronized (mutex) {return list.lastIndexOf(o);}}public boolean addAll(int index, Collection<? extends E> c) {synchronized (mutex) {return list.addAll(index, c);}}public ListIterator<E> listIterator() {return list.listIterator(); // Must be manually synched by user}public ListIterator<E> listIterator(int index) {return list.listIterator(index); // Must be manually synched by user}public List<E> subList(int fromIndex, int toIndex) {synchronized (mutex) {return new SynchronizedList<>(list.subList(fromIndex, toIndex),mutex);}}@Overridepublic void replaceAll(UnaryOperator<E> operator) {synchronized (mutex) {list.replaceAll(operator);}}@Overridepublic void sort(Comparator<? super E> c) {synchronized (mutex) {list.sort(c);}}private Object readResolve() {return (list instanceof RandomAccess? new SynchronizedRandomAccessList<>(list): this);}}

1.使用方式

官方文档就是下面的使用方式

List list = Collections.synchronizedList(new ArrayList());...synchronized (list) {Iterator i = list.iterator(); // Must be in synchronized blockwhile (i.hasNext())foo(i.next());}

既然封装类内部已经加了对象锁,为什么外部还要加一层对象锁?

看源码可知,Collections.synchronizedList中很多方法,比如equals,hasCode,get,set,add,remove,indexOf,lastIndexOf…

都添加了锁,但是List中

Iterator<E> iterator();

这个方法没有加锁,不是线程安全的,所以如果要遍历,还是必须要在外面加一层锁。

使用Iterator迭代器的话,似乎也没必要用Collections.synchronizedList的方法来包装了——反正都是必须要使用Synchronized代码块包起来的。

所以总的来说,Collections.synchronizedList这种做法,适合不需要使用Iterator、对性能要求也不高的情况。

2.SynchronizedList和Vector最主要的区别:

  1. Vector扩容为原来的2倍长度,ArrayList扩容为原来1.5倍
  2. SynchronizedList有很好的扩展和兼容功能。他可以将所有的List的子类转成线程安全的类。
  3. 使用SynchronizedList的时候,进行遍历时要手动进行同步处理 。
  4. SynchronizedList可以指定锁定的对象。

3.for的注意点与

for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + ",");
}Iterator iterator = list.iterator();
while (iterator.hasNext()) {System.out.print(iterator.next() + ",");
}for (Integer i : list) {System.out.print(i + ",");
}

第一种是普通的for循环遍历、第二种是使用迭代器进行遍历,第三种我们一般称之为增强for循环(for each)

可以看到,第三种形式是JAVA提供的语法糖,这里我们剖洗一下,这种增强for循环底层是如何实现的。

   for (Integer i : list) {System.out.println(i);}

反编译后:

    Integer i;for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){i = (Integer)iterator.next();        }

如果在Vector,Collections.synchronizedList使用增强for循环,就必须在外面单独加锁,因为它不是单单一个操作,不是原子性的,如果在遍历的过程中,进行add,remove操作,就会抛出异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...

Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)有没有办法只通过数据库链接而不是当前会话的数据提交在表上插入/更新的数据&#xff1f; 或者他们被认为是同一个&#xff1f;例如&#xff1a;INSERT INTO main_database.main_table(value1, valu…

oracle ado6,c# ado 连接数据库 六步曲

建立连接分为六步&#xff1a;1.定义连接字符串&#xff0c;oracle 的连接字符串为&#xff1a;private static string connString "Data Source192.168.1.130:1521/mydata;Persist Security InfoTrue;User IDem_test;Passwordtest123;UnicodeTrue";2.根据连接字符串…

java中数组遍历的三种方式

1.for循环遍历 通常遍历数组都是使用for循环来实现。遍历一维数组很简单&#xff0c;遍历二维数组需要使用双层for循环&#xff0c;通过数组的length属性可获得数组的长度。 2.Arrays工具类中toString静态方法遍历 利用Arrays工具类中的toString静态方法可以将一维数组转化为…

127.0.0.1 myz.php,XXE漏洞总结 · MYZ’s Blog

就先以这次校赛的例子作为开头吧ctf首先说一说这次的题&#xff1a;这一次的题是一种回显式的xxe,但是过滤了ENTITY参数.(有点难以判别)贴出源码:1234567891011121314151617181920212223242526272829303132libxml_disable_entity_loader(false);$user1 $_POST[user1];$xmlfile…

mysql中union 查询

mysql中union 查询 UNION ALL只是简单的将两个结果合并后就返回。这样&#xff0c;如果返回的两个结果集中有重复的数据&#xff0c;那么返回的结果集就会包含重复的数据了。 从效率上说&#xff0c;UNION ALL 要比UNION快很多&#xff0c;所以&#xff0c;如果可以确认合并的…

oracle内存表与临时表,Oracle 临时表之临时表空间组(TTG)

环境&#xff1a;sysORCL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 Producti…

修改TOMCAT的JVM虚拟机内存大小几种方式

修改TOMCAT的JVM虚拟机内存大小几种方式 Tomcat默认可以使用的内存为128MB&#xff0c;在较大型的应用项目中&#xff0c;这点内存是不够的&#xff0c;需要调大。 经常会出现Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出的错误。 对此有以下几种方法可以选…

oracle数据库read only,oracle 报错Linux-x86_64 Error: 30: Read-only file system

本帖最后由 ccton 于 2014-2-18 12:08 编辑[root**** hydata]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 5.6 (Tikanga)[root**** hydata]# uname -aLinux gywsj.hyb210 2.6.18-238.el5 #1 SMP Sun Dec 19 14:22:44 EST 2010 x86_64 x86_64 x86_64 GNU…

sql中in和exist语句的区别?

两者都能实现表功能查询&#xff0c;主要区别如下&#xff1a; 1、适用表的类型不同。 in是子查询为驱动表&#xff0c;外面的表为被驱动表&#xff0c;故适用于子查询结果集小而外面的表结果集大的情况。 exists是外面的表为驱动表&#xff0c;子查询里面的表为被驱动表&am…

织梦task_do.php,织梦20160906更新后栏目空白问题

织梦发布了20160906更新&#xff0c;dedecmsv5.7已经很久没有更新了&#xff0c;看到这个更新后心中突然感动强烈的兴奋&#xff0c;虽然早有准备这只是个小小的更新&#xff01;本次更新内容&#xff1a;dede/makehtml_list_action.php,优化更新列表页速度&#xff0c;建议在后…

linux shell 执行目录,bash shell脚本执行的几种方法

bash shell 脚本执行的方法有多种&#xff0c;本文作一个总结&#xff0c;供大家学习参考。假设我们编写好的shell脚本的文件名为hello.sh&#xff0c;文件位置在/data/shell目录中并已有执行权限。方法一&#xff1a;切换到shell脚本所在的目录(此时&#xff0c;称为工作目录)…

Java 源码--Arrays

前言 数组比较特殊&#xff0c;一个数组属于一个对象&#xff0c;但是它的创建方式却不同于一般对象。 Java中的数组创建数组有以下三种方式&#xff1a; // 第一种 int[] array new int[5]; // 第二种 int[] array {1, 2, 3, 4, 5}; // 第三种 int[] array new int[]{1,…

HashMap原理深入理解

hashing(哈希法)的概念 散列法&#xff08;Hashing&#xff09;是一种将字符组成的字符串转换为固定长度&#xff08;一般是更短长度&#xff09;的数值或索引值的方法&#xff0c;称为散列法&#xff0c;也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快&#…

linux终端转到目录,linux下目录及终端学习

linux目录按调用分为相对路径与绝对路径相对路径&#xff1a;从当前路径下查找查找目标也可使用./调用当前目录下文件或者../调用上一层目录中文件&#xff0c;可通过pwd查看当前路径绝对路径&#xff1a;从根目录出发查找文件。执行cat /etc/passwd命令时由于引用绝对路径&…

HashMap的底层原理

一&#xff1a;HashMap的节点&#xff1a;HashMap是一个集合&#xff0c;键值对的集合,源码中每个节点用Node<K,V>表示 static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> next;Node是一个内部类&…

linux 远程调试文件夹,GDB远程调试开发板程序

一、概述可能我们都熟悉直接在发行版linux系统下调试系统&#xff0c;只需要在安装系统的时候包含了调试工具&#xff0c;直接可以根据gdb进行调试。但对于很多做嵌入式的来说&#xff0c;可能经常需要调试运行在开发板上的应用程序&#xff0c;下面就来说说。先说一下我们的调…

linux必备工具,Linux装机必备工具

分类 名称 类比 说明压缩工具 RAR for Linux WinRAR Linux中压缩解压RAR格式文件的工具联络聊天 EVA QQ 一个界面、使用 类似QQ的聊天工具。MP3 播放 XMMS WinAmp Linux中MP3播放器下载工具 Downloader4X FlashGet Linux中的多线程下载利器流媒体播放 RealPlayer 10 RealPlaye…

hashMap 底层原理+LinkedHashMap 底层原理+常见面试题

1.源码 java1.7 hashMap 底层实现是数组链表 java1.8 对上面进行优化 数组链表红黑树 2.hashmap 是怎么保存数据的。 在hashmap 中有这样一个结构 Node implenets Map.entity{hashkeyvaluenext} 当我们向hashMap 中放入数据时&#xff0c;其实就是一个 Enity{keyvaue}在存之…

linux时间跳变影响,MONGO 集群 修改linux主机时间后的影响

生产环境是一主一从一仲裁3分片的集群&#xff0c;现在发现其中一个节点比当前时间大了好几天&#xff0c;后使用NTP将时间往回调整副本集上。原来时间是5月3日&#xff0c;当前是4月26日&#xff0c;对此进行了调整。[rootcwdtest1 bin]# dateFri May 3 13:20:31 CST 2019[ro…

Java容器解析——HashMap

前言 HashMap是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 1 定义 public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {}由HashMap定义可以看出 1&#xff09; HashMap<K,V>表示…