一.集合的线程安全性 我们通常所讲的某个集合是线程安全的,指的是单个操作是线程安全的,也就是需要具体到某个变量或方法的,如果是多个连续的操作,并不能保证这些连续的操作是线程安全的. 比如我们通常说hashTable是线程安全的.那假如现在有一个hashTable,里面有一个键值对key:test 现在有两个线程a和b均需要给这...
可能会出现空的情况,也可能丢失数据,也有可能正常,这个只是3个线程同时访问,我们加大线程的数量到30(代码省略,只需将for循环的3改成30即可!),就会报错:java.util.ConcurrentModificationException Exception in thread "Thread-2" Exception in thread "Thread-3" java.util.ConcurrentModificationException at java.util...
publicvoidadd(intindex, E element){synchronized(mutex) {list.add(index, element);} } 其中,mutex是final修饰的一个对象: finalObject mutex; 我们可以看到,这种线程安全容器是通过同步代码块来实现的,基础的add方法任然是由ArrayList实现。 我们再来看看它的读方法: publicEget(intindex){synchronized(mutex) {...
线程安全的,不允许null键和null值,效率低,给整个方法添加synchronized,太笨重3、LinkedHashMap: 底层数据结构是链表和哈希表,由链表保证有序(存储和取出的顺序一致),哈希表保证唯一,线程不安全4、TreeMap: 底层数据结构是红黑树(一种自平衡的二叉树),可以按照某种规则进行排序,自然排序和选择器排序,线程不安全5、Co...
Vector:自带线程安全的特性,适合多线程环境中使用。 5.有什么副作用: ArrayList:在列表中间进行添加或删除操作效率低下,因为这需要移动大量元素来填补空缺或创建空间。 LinkedList:随机访问效率低,因为找到特定元素需要从头节点开始遍历。 Vector:由于其线程安全特性,单线程环境下的操作会因同步机制而导致额外的性能开销。
非阻塞式集合:当集合已满或为空时,被调用的添加(满)、移除(空)方法就不能立即被执行,调用这个方法的线程不会被阻塞,而是直接则返回null或抛出异常。 下面,就来看下concurrent包下,到底存在了哪些线程安全的集合: Collection集合: List: CopyOnWriteArrayList ...
缺点:查询效率低,查询集合中的元素的时候,需要进行全链表的扫描 Vector 底层也是数组,只不过是线程安全的,但是效率不高,所以使用较少 Set:无序、不可重复 HashSet 底层是HashMap TreeSet(属于SortedSet)-让集合中的元素具备了排序的能力 底层是TreeMap
原理仅是在每个方法上加上了 synchronized 来保证线程安全,相比于 Vector 扩展性,灵活性更高 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...
Vector:Vector 是一种线程安全的 ArrayList。它在所有的公共方法上都添加了同步,因此可以在多线程环境下安全使用。然而,这也意味着它的性能可能不如 ArrayList,特别是在只有少量并发或者完全没有并发的情况下。 CopyOnWriteArrayList:这是一种特殊的 List,它通过在每次修改时复制整个底层数组来实现线程安全。这意味着迭代...