java多线程基础知识点

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.多生产者,单消费者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值