一、JAVA基础相关
- java中线程安全的集合有哪些?
- 线程池的构造参数有哪些?分别代表什么含义。
- 线程的状态有哪些
- 动态代理和静态代理的区别
kotlin相关
- kotlin中有哪些常用的扩展函数
- kotlin协程的启动方式有哪些
其他
- dart是如何实现并发的
- 在子线程new Handler会崩溃么,为什么?Handler源码
- ARouter是如何提供服务的
- 利用Gradle实现过哪些复杂的应用
解答
java中线程安全的集合有哪些?
首先看下Collection族类关系
其中线程安全的有
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…
kotlin协程的启动方式有哪些?
launch():用于启动一个新的协程并且不关心协程的结果。async():用于启动一个新的协程并返回一个Deferred对象,可以使用await()方法来获取协程的结果。runBlocking():用于在当前线程中启动一个新的协程并等待协程执行完毕,是一种方便测试和调试协程代码的方式。withContext():用于在当前协程中切换到另一个上下文中执行代码,常用于在 IO 线程中执行耗时的操作。produce()和actor{}:用于创建协程通道和协程 Actor。CoroutineScope(){}: 可以使用CoroutineScope()构造函数来创建一个新的协程作用域,并在其中启动协程。在作用域内启动的所有协程都会在作用域结束时自动取消,以避免内存泄漏。