1.用transient关键字标记的成员变量不参与序列化过程。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。
-
看到array,就要想到角标。
看到link,就要想到first,last。
看到hash,就要想到hashCode,equals.
看到tree,就要想到两个接口。Comparable,Comparator。
3.LinkedHashSet会保存插入的顺序。
4.B+ 树读性能好,但由于需要有序结构,当key比较分散时,磁盘寻道频繁,造成写性能较差
5.LSM(Log-Structured Merge-Trees)和 B+ 树相比,是牺牲了部分读的性能来换取写的性能(通过批量写入),实现读写之间的平衡。LSM可以快速建立索引。
6.MySQL是基于B+树聚集索引组织表
7.BitSet 该类实现了根据需要增长的位向量。 位组的每个组件都有一个boolean
值。 BitSet
的位由非负整数索引。 可以检查,设置或清除单独的索引位。 一个BitSet
可以用于通过逻辑AND,逻辑包括OR和逻辑异或运算来修改另一个BitSet
的内容。
8.为什么要用到并发?
-
充分利用多核CPU的计算能力;
-
方便进行业务拆分,提升应用性能
9.并发编程在那些场景下是不适用的
(1)频繁的上下文切换
时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的,时间片一般是几十毫秒。而每次切换时,需要保存当前的状态起来,以便能够进行恢复先前状态,而这个切换时非常损耗性能,过于频繁反而无法发挥出多线程编程的优势。通常减少上下文切换可以采用无锁并发编程,CAS算法,使用最少的线程和使用协程。
-
无锁并发编程:可以参照concurrentHashMap锁分段的思想,不同的线程处理不同段的数据,这样在多线程竞争的条件下,可以减少上下文切换的时间。
-
CAS算法,利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换
-
使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态
-
协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换
由于上下文切换也是个相对比较耗时的操作,所以在"java并发编程的艺术"一书中有过一个实验,并发累加未必会比串行累加速度要快。 可以使用Lmbench3测量上下文切换的时长 vmstat测量上下文切换次数
(2)多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用。
10.同步和异步最简单形象的解释:同步类似于生活之中的逛街购物,如果没货了,你需要等调货把货物给你调度出来你才能下单结账。而异步类似于生活中的网购,你只需要在网上下单即可,该干嘛干嘛去。之后收货就可以了。
11.并发与并行,并发:多个任务交替进行。并行指的是,真正意义上的的同时进行。(出现在多核CPU当中)