1.CAS操作。(乐观锁机制)AtomicLong类,数据库 加一个version字段记录。update table set a=#{value} where version = #{version}。
2.volatile提供了可见性保证,但不提供操作原子性。标识了volatile的字段在更新后会马上刷入主存。没有标识的话只是当前线程的备份
3.b线程在执行,当遇到a.join()时,b线程会等待a执行完之后再继续执行。
4.写volatile变量时,可以确保volatile写之前的操作不会被编译器重排序到volatile写之后。读volatile变量时,可以确保volatile读之后的操作不会被编译器重排序到volatile读之前
5.伪共享是因为多个变量被放入了一个缓存行中,并且多个线程同时去写入缓存行中不同的变量。(缓存与内存交换的数据单位就是缓存行)
6.@Contended可以防止伪共享,但默认情况下该注解只有与java和核心类,比如rt包下的类。如果需要使用该注解需添加JVM参数:-XX:-RestrictContended。默认填充宽度128
7.自旋锁,在当前线程去获取锁时,如果锁已被占有,则不马上阻塞自己,在不放弃CPU的情况下多次尝试获取。(比较消耗CPU)。PS:比如for循环CAS
8.AtomicLong的性能瓶颈是多个线程同时竞争一个变量而导致阻塞并浪费CPU资源。LongAdder则类似ConcurrentHashMap的锁分段。使用分段的方式缓解线程竞争同一个变量
9.happens-before规则
10.可重入锁:可n次对同一个线程加锁,但也需要解锁n次
11.Random在多线程下使用时执行效率会很差。原因:内部使用自旋锁去更新随即因子。多线程下对单实例Random获取随机数,会由于自旋锁操作导致阻塞,性能下降。解决方法:可以使用:ThreadLocalRandom(该工具类会为每一个线程维护一份当前线程的随机因子)。
12.java中CAS操作使用了Unsafe类下的方法compareAndSwapInt
13.LongAccumulator类比LongAdder更强大,LongAccumulator可以提供计算规则。LongAdder只能从一个数开始累加
14.LinkedBlockingQueue实现了BlockingQueue接口,内部链表结构
15.ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue。内部数组结构
16.PriorityBlockingQueue: 一个支持线程优先级排序的无界队列,默认自然序进行排序,也可以自定义实现compareTo()方法来指定元素排序规则,不能保证同优先级元素的顺序。
17.DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象到期时才会被执行。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
18.CountDownLatch能够使一个或多个线程等待其他线程完成各自的工作后再执行,主线程必须在启动其它线程后立即调用await方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务
19。logback异步日志使用ArrayBlockingQueue.多生产者,单消费者