Android面试真题(2023.3.14)

254 阅读3分钟

一、JAVA基础相关

  1. java中线程安全的集合有哪些?
  2. 线程池的构造参数有哪些?分别代表什么含义。
  3. 线程的状态有哪些
  4. 动态代理和静态代理的区别

kotlin相关

  1. kotlin中有哪些常用的扩展函数
  2. kotlin协程的启动方式有哪些

其他

  1. dart是如何实现并发的
  2. 在子线程new Handler会崩溃么,为什么?Handler源码
  3. ARouter是如何提供服务的
  4. 利用Gradle实现过哪些复杂的应用

解答

java中线程安全的集合有哪些?

首先看下Collection族类关系

image.png

其中线程安全的有

image.png

Collections包装方法

List synchronizedList = Collections.sychronizedList(new ArrayList());

Set sychronizedSet = Collections.sychronizedSet(new HashSet());

Map<K, V> synchronizedMap = Collections.sychronizedMap(new HashMap<K, V>());

Collections针对每种集合都声明了一个线程安全的包装类,在原集合的基础上添加了锁对象,集合中的每个方法都通过这个锁对象实现同步

Vector保证线程安全的原理

它几乎给所有的public方法都加上了sychronized关键字。由于加锁倒是性能降低,在不需要并发访问时,这种强制性的同步就显得多余,所以现在几乎没有什么人在使用。

CopyOnWriteArrayList

顾名思义,Copy-On-Write 就是 CopyOnWriteArrayList 的实现机制。即当对象进行写操作时,使用了Lock锁做同步处理,内部拷贝了原数组,并在新数组上进行添加操作,最后将新数组替换掉旧数组;若进行的读操作,则直接返回结果,操作过程中不需要进行同步。

并发 Queue。

在并发队列上,JDK提供了两套实现,一个是以 ConcurrentLinkedQueue 为代表的高性能队列,一个是以 BlockingQueue 接口为代表的阻塞队列。ConcurrentLinkedQueue 是一个适用于高并发场景下的队列。它通过无锁的方式(CAS),实现了高并发状态下的高性能。通常,ConcurrentLinkedQueue 的性能要好于 BlockingQueue 。

与 ConcurrentLinkedQueue 的使用场景不同,BlockingQueue 的主要功能并不是在于提升高并发时的队列性能,而在于简化多线程间的数据共享。

BlockingQueue 提供一种读写阻塞等待的机制,即如果消费者速度较快,则 BlockingQueue 则可能被清空,此时消费线程再试图从 BlockingQueue 读取数据时就会被阻塞。反之,如果生产线程较快,则 BlockingQueue 可能会被装满,此时,生产线程再试图向 BlockingQueue 队列装入数据时,便会被阻塞等待。

参考链接blog.csdn.net/lijingjingc…

java中线程安全的MAP有哪些

ConcurrentHashMap

原理分析:www.jianshu.com/p/c0642afe0…

动态代理和静态代理的区别

代理的作用:为对象提供一种代理以控制对这个对象的访问。 blog.csdn.net/ShuSheng000…

www.cnblogs.com/linghu-java…

blog.csdn.net/m0_59879385…

kotlin协程的启动方式有哪些?

  1. launch():用于启动一个新的协程并且不关心协程的结果。
  2. async():用于启动一个新的协程并返回一个 Deferred 对象,可以使用 await() 方法来获取协程的结果。
  3. runBlocking():用于在当前线程中启动一个新的协程并等待协程执行完毕,是一种方便测试和调试协程代码的方式。
  4. withContext():用于在当前协程中切换到另一个上下文中执行代码,常用于在 IO 线程中执行耗时的操作。
  5. produce()actor{}:用于创建协程通道和协程 Actor。
  6. CoroutineScope(){} : 可以使用 CoroutineScope() 构造函数来创建一个新的协程作用域,并在其中启动协程。在作用域内启动的所有协程都会在作用域结束时自动取消,以避免内存泄漏。