首页 > 试题广场 >

下列哪个说法是正确的()

[单选题]
下列哪个说法是正确的()
  • ConcurrentHashMap使用synchronized关键字保证线程安全
  • HashMap实现了Collction接口
  • Array.asList方法返回java.util.ArrayList对象
  • SimpleDateFormat是线程不安全的

选D。

A选项中,ConcurrentHashMap 使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。

B中,HashMap定义规则如下:

public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
C中,应该是Arrays.asList(),其将一个数组转化为一个List对象,这个方***返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的内部类: 

图片说明
编辑于 2016-12-22 17:04:21 回复(14)
A. JDK1.8 的 ConcurrentHashMap 采用CAS+Synchronized保证线程安全。 JDK1.7 及以前采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock,因此采用Lock锁来保证线程安全。
B. 
C. Arrays.asList()  返回  java.util.Arrays.ArrayList 对象,这里的 ArrayList 是 Arrays 私有的内部类
D. 
发表于 2017-05-08 20:38:43 回复(6)
A、ConcurrentHashMap实际上时 HashTable的升级版,使用segment来分段和管理锁,并不是synchronized;
B、 HashMap实现的接口有:Serializable, Cloneable, Map<K,V> ,没有实现Cllectio
C、Arrays.asList()方法返回的列表是Arrays.ArrayList类型的,并不是java.util.ArrayList;
D、正确
发表于 2017-01-20 21:39:17 回复(2)
  • A: 这个选项吧,没有给出具体环境,现在jdk1.8及以后的版本 ConcurrentHashmap是采用CAS+synchronized关键字来保证线程安全性,在jdk1.7及之前的版本是采用分段锁机制来保证线程安全性。这种选项具体纠结其实没太大意义,可能就是能区分出来看没看过源码的人吧。

  • B: 这个经常有人弄混,给大家看个Java Collections Framewor的UML图 image
    从图中可以看出,Map接口也属于Java Collections Framework,因为Map这种映射的结构比较特殊,所以Map接口是单独的,而Set、Queue、List都是继承于Collection接口。这个选项是考察大家对Java集合框架的熟悉情况。

  • C: 看下源码就知道了

      @SafeVarargs
      @SuppressWarnings("varargs")
      public static <T> List<T> More ...asList(T... a) {
          return new ArrayList<>(a);
      }
    

    可以看到Array的asList方法确实是返回一个ArrayList类型的值,但是当我们点进去这个ArrayList,会发现,这其实是Array的一个内部类,继承自AbstractList。而并非返回的java.util.ArrayList对象。

      private static class More ...ArrayList<E> extends AbstractList<E>
          implements RandomAccess, java.io.Serializable
      {
          private static final long serialVersionUID = -2764017481108945198L;
          private final E[] a;
    
          More ...ArrayList(E[] array) {
              a = Objects.requireNonNull(array);
          }
      // ......
      }
    

    还是考察,看!没!看!过!源!码!

  • D: 正确。点进去看源码,这个类并没有进行任何的互斥同步,说明设计的时候就没想将其设计成线程安全的类。
发表于 2018-04-07 12:49:08 回复(0)
选D

A,ConcurrentHashMap,JDK1.7的时候,是利用Segment这个数据结构,锁分段技术保证的。JDK1.8之后用的是synchronized+CAS。Segment这个数据结构也废了,和HashMap一样了,数据+链表+红黑树。
B,Map和Collcetion没关系
C,Arrays.asList返回的是Arrays中一个内部类,也叫ArrayList,也实现了List接口。一旦对这个List做出结构性的改变,会出现异常。
D,DateFormat中的子类中线程都是不安全的
发表于 2018-06-28 10:22:55 回复(0)
记住集合那里的继承结构,List和Set是collectin的子接口,Map是单独的一个
发表于 2017-04-11 23:25:26 回复(0)
1.8的好像不用segment,而是改用sychronize了
发表于 2017-04-09 23:37:48 回复(0)
A,ConcurrentHashMap使用segment来分段和管理锁,保证线程的安全;
B. HashMap<K,V> 继承抽象Map类,实现Cloneable, Serializable接口
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
C.当时这个选项很迷惑我,不是很清楚,后来了解了下,这个返回的是Arrays的内部类Arrays.ArratList,不是java.util.ArrayList类
D.正确,
SimpleDateFormat是线程不安全的原因:
在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象(如static修饰)的话,如调用format方法时,多个线程会同时调用calender.setTime方法,导致time被别的线程修改,因此线程是不安全的。
发表于 2021-12-17 10:18:43 回复(0)
ConcurrentHashMap 线程安全的 HashMap。 1.7 采用分段锁的形式加锁;
1.8 使用 Synchronized 和 CAS(乐观锁) 实现同步,若数组的 Node 为空,则通过 CAS 的方式设置值,不为空则加在链表的第一个节点。
获取第一个元素是否为空使用 Unsafe 类提供的 getObjectVolatile 保证可见性。
发表于 2021-09-28 17:35:00 回复(0)
C项在不同的jdk版本好像是不同的,这题貌似过时了
jdk8返回java.util.ArrayList对象。
jdk7返回java.util.Arrays.ArrayList.ArrayList<T>对象

发表于 2020-02-19 16:08:33 回复(0)

D. SimpleDateFormat是线程不安全的。

这个说法是正确的。SimpleDateFormat 是线程不安全的类。它在多线程环境下使用可能导致并发问题,包括解析错误的日期和时间、格式化输出的不一致等。如果需要在多线程环境中处理日期和时间,可以考虑使用线程安全的替代类,如 java.time 包下的 DateTimeFormatter 类。

A. ConcurrentHashMap使用synchronized关键字保证线程安全。

这个说法是错误的。ConcurrentHashMap 并不是通过 synchronized 关键字来实现线程安全的。它使用了一种不同于传统的加锁方式来提供更好的并发性能。ConcurrentHashMap 使用分段锁(Segment)来控制并发访问,不同的段可以被不同的线程同时访问,从而提高并发性能。

B. HashMap实现了Collection接口。

这个说法是错误的。HashMap 类并没有实现 Collection 接口。它实现了 Map 接口,用于存储键值对的映射关系。Collection 接口是用于表示一组对象的接口,而在 HashMap 中,键和值是成对存在的。

C. Arrays.asList 方法返回 java.util.ArrayList 对象。

这个说法是错误的。Arrays.asList 方法返回的是一个 java.util.Arrays.ArrayList 对象,而不是常规的 java.util.ArrayList 类。java.util.Arrays.ArrayList 是一个固定大小的数组,它是在对数组进行操作时的一个便利接口。如果需要可变大小的 ArrayList 对象,应该使用 new ArrayList<>(Arrays.asList(...)) 的方式来创建。

发表于 2023-09-26 19:51:17 回复(0)
SimpleDateFormat是线程不安全的
发表于 2022-10-27 13:23:48 回复(0)
courrentHashMap 在jdk 1.8后,用的是synchronize去加锁,没有使用分段数据了
发表于 2022-03-03 21:18:58 回复(0)
这题没有说jdk的版本,1.7确实是lock锁+CAS,但是jdk1.8就是synchronized锁+CAS,因为在1.6之后对synchronized锁进行了升级使得它可以进行一个短暂的自旋
发表于 2021-12-10 07:42:50 回复(0)
SimpleDateFormat是线程不安全的
发表于 2021-06-05 18:41:01 回复(0)
SimpleDateFormat是线程不安全的
发表于 2021-04-30 10:36:40 回复(0)
Array.asList方法返回的是Array的静态成员内部类ArrayList
发表于 2020-09-01 09:30:01 回复(0)
JDK1.8中 ConcurrentHashMap是通过Syncchronized关键字和CAS算法保证线程安全的啊。
发表于 2019-06-12 19:31:44 回复(0)
A:早期的ConcurrentHashMap是通过分段锁Segment来实现的。java1.8以后是通过CAS+synchronized使锁更细化。
B: HashMap在java的集合框架中实现了Map接口,而Collection接口常见的实现类是LIst,Set,Queue等接口的实现类。
C:Arrays.asList方法返回的是java.util.Arrays.ArrayList.ArrayList<T>。
D:正确。

编辑于 2019-02-23 21:35:52 回复(0)
A.   ConcurrentHashMap使用ReentrantLock来保证线程安全。
B.   HashMap没有实现Collection接口。
C.   Array.asList方法返回java.util.Arrays.ArraytList对象。
D.   SimpleDateFormat是线程不安全的。
编辑于 2017-12-05 19:00:59 回复(0)