Day07

1. 说说你对ThreadLocal的理解

  1. ThreadLocal是线程变量,它将需要共享的数据复制多份,每个线程各一份。内部使用了一个ThreadLocalMap来存储信息,key是当前线程,而value是我们需要传输的数据,我们可以在线程执行的过程中通过get/set,操作map中的数据,不过需要注意的是在使用线程池的时候,线程执行完毕不会被销毁,而是进入线程池中等待,这个时候我们需要手动释放一下map中的数据,以免造成内存浪费

2. 请你说说JUC

  1. JUC是java.util.concurrent的缩写,这个包时JDK1.5提供的并发包,包内主要提供了支持并发操作的各种工具。这些工具大致分为如下5类:原子类、锁、线程池、并发容器、同步工具
  2. 原子类:并发包下提供了atomic子包,这个包中的原子操作类提供了一种用法简单、线程安全地更新一个变量的方式。在atomic包里一共提供了17个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新引用类型、原子更新属性,原子更新数组
  3. 锁:并发包中新增了Lock接口以及相关实现类用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了隐式获取释放锁的便捷性,但是却拥有了多种synchronized关键字所不具备的同步特性,包括:可中断地获取锁、非阻塞地获取锁、可超时地获取锁。
  4. 线程池:其中ThreadPoolExecutor类代表常规的线程池,而它的子类ScheduledThreadPoolExecutor对定时任务提供了支持。此外,由于Executors是一个用于创建线程池的工具类,由于该类创建出来的是带有无界队列的线程池,所以在使用时要慎重
  5. 并发容器:第一类是以降低锁粒度来提高并发性能的容器,它们的类名以Concurrent开头,如ConcurrentHashMap。第二类是采用写时复制技术实现的并发容器,它们的类名以CopyOnWrite开头,如CopyOnWriteArrayList。第三类是采用Lock实现的阻塞队列,内部创建两个Condition分别用于生产者和消费者,这些类都实现了BlockingQueue接口,如ArrayBlockingQueue
  6. 同步工具:新增了几个有用的并发工具类。其中Semaphore类代表信号量,可以控制同时访问特定资源的线程数量;CountDownLatch类则允许一个或多个线程等待其他线程完成操作;CyclicBarrier可以让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时才会打开

3. Java哪些地方使用了CAS

  1. CAS比较并交换,比较典型的使用场景有原子类、AQS、并发容器。
  2. AQS:在向同步队列的尾部追加节点时,它首先会以CAS的方式尝试一次,如果失败则进入自旋状态,并反复以CAS的方式进行尝试
  3. 并发容器:以ConcurrentHashMap为例,它的内部多次使用了CAS操作。在初始化数组时,以CAS的方式修改初始化状态,避免多个线程同时进行初始化。在执行put方法初始化头结点时,它会以CAS的方式将初始化好的头结点设置到指定槽的首位,避免多个线程同时设置头结点

4. 请说说你对Java集合的了解

  1. JAVA中的集合类分为4大类,分别由4个接口来代表,它们是Set、List、Queue、Map。其中,Set、List、Queue都继承自Collection接口。
  2. Set代表无序的、元素不可重复的集合。List代表有序的、元素可以重复的集合。Queue代表先进先出的队列。Map代表具有映射关系的集合。
  3. Java提供了众多集合的实现类,它们都是这些接口的直接或间接的实现类,其中比较常用的有:HashSet、Treeset、Arraylist等。
  4. 这些集合或接口大多数都是非线程安全的。虽然非线程安全,但是这些类的性能较好。如果需要使用线程安全的集合类,则可以利用Collections工具类,该工具类提供的synchronizedxxx()方法,可以将这些集合类包装成线程安全的集合类。但是Vector、HashTable,虽然都是线程安全的集合类,但是都是非常古老的API,不推荐使用,性能很差。

5. 你知道哪些线程安全的集合?

  1. java.util包下有极少数的线程安全的集合,如Vector,HashTable等,但是它们都是基于synchronized关键字实现的,性能很差,开发中不常用。
  2. 一般可以使用collections工具类方法将非线程安全的集合类包装为线程安全的类。同时在java5以后,concurrent包中提供了大量的支持并发访问的集合类。例如ConcurrentHashMap和CopyOnWriteArrayList等
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏