多线程、锁

https://joonwhee.blog.csdn.net/article/details/106609583

线程池使用的是哪种
线程池参数怎么配置
线程池各个参数的作用
线程池的参数配置要注意什么
线程池的工作流程
JDK 中的并发类知道哪些
AQS 的底层原理
介绍下悲观锁和乐观锁
使用过哪些锁
synchronized 和 Lock 的区别、使用场景
synchronized 原理
synchronized 作用于静态方法、普通方法、this、Lock.class 的区别
为什么引入偏向锁、轻量级锁,介绍下升级流程
死锁的必要条件,如何预防死锁
介绍下 CountDownLatch 和 CyclicBarrier
介绍下 CAS,存在什么问题
介绍下 ThreadLocal,存在什么问题

1.乐观锁 悲观锁
2.serlvet是否线程安全
servlet单例多线程不是线程安全,共享数据需要通过锁或者threadlocal来保证
3.ABA问题?如何避免?
参考:说清楚ABA问题,通过版本戳version来对记录或对象标记避免ABA问题比如AtomicStampedReference AtomicMarkableReference
4.threadlocal解释
参考:线程副本,Thread里的map,key为当前ThreadLocal对象,value为值
5.stringbuffer stringbuilder区别
6.volatile关键字解释
7.线程池参数理解以及执行流程?核心数 最大数 空闲时间 阻塞队列 拒绝策略
8.java内存模型?
9.java并发集合框架JUC?
参考:CopyOnWriteArrayList写时复制,适合读多写少
concurrenthashmap 分段加锁
concurrentskiplistmap 跳表 时间复杂度O(logN)
10.ArrayBlockingQueue常用操作?boolean add(E e) boolean offer(E e) peek() poll() put(E e)take()
11.原子long是怎么保证原子性的?通过cas函数
12.concurrentLinkedQueue和linkedBlockingQueue区别?concurrentLinkedQueue非阻塞 用的cas自旋实现的适合并发,弱一致性,size()方法很耗性能;linkedBlockingQueue阻塞的,用读写两把锁实现
13.AQS(AbstractQueuedSynchronizer)?AQS的线程阻塞策略使用了自旋等待和挂起两种方式,通过挂起线程前的低频自旋保证了AQS避免了线程上下文切换开销及CPU时间片占用的最优化选择。保证在等待时间短(低并发)通过自旋去占有锁而不需要挂起,而在等待时间长时(高并发竞争激烈)将线程挂起。实现锁性能的最大化。
14.reentrantLock和synchronized区别
1).api不同,syschronized是关键字用来修饰方法和代码块,reentrantLock是对象直接lock(需要手工加锁和释放锁)
2).synchronized非公平锁,reentrantLock默认也是但是可以设置成公平锁
3).reentrantLock可以通过newCondition绑定多个Condition对象(用来分组唤醒需要唤醒的线程们),synchronized要和多个条件关联时不得不添加锁(要么随机唤醒一个线程要么唤醒全部线程)
4).reentrantLock支持等待可中断,锁长期不释放,正在等待的线程可以选择放弃等待
目前Synchronized优化后(引入偏向锁,轻量级锁(自旋锁)),两者的性能就差不多了.
ReentrantLock实现的前提就是AbstractQueuedSynchronizer,简称AQS,ReenTrantLock的实现是一种自旋等待和挂起(偏向锁->轻量级锁cas自旋->重量级锁阻塞),通过循环调用CAS操作来实现加锁。它的性能比较好也是因为避免了使线程进入内核态的阻塞状态避免上下文切换
15.reentrantlock 可重入 重入的理解 公平非公平的理解
16.锁升级
17.偏向锁?
偏向锁:偏向锁偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,那么持有偏向锁的线程无需再进行同步。很明显,当锁的竞争情况很少出现时,偏向锁就能提高性能,因为它比轻量级锁(如自旋锁)少了一步:CAS
18.线程的状态?新建(newThread)、就绪(runnable)、运行(running)、死亡(dead)、堵塞(blocked)
19.协程?一个线程里面可以有多个协程,协程也有自己的上下文,但是协程的切换由协程自己来控制(主动让出或者调用了内核函数阻塞)
20.hashmap线程安全?数据结构?数组+链表
21.解决hash冲突的方法?
1)开放定址法 如果两个数据元素的哈希值相同,则在哈希表中为后插入的数据元素另外选择一个表项(以刚才的哈希值为基础通过某种散列函数再产生另一个哈希值)。当程序查找哈希表时,如果没有在第一个对应的哈希表项中找到符合查找要求的数据元素,程序就会继续往后查找,直到找到一个符合查找要求的数据元素,或者遇到一个空的表项。
2)链地址法
22.hashmap为什么要自扩容?减少冲突
23.类加载双亲委派机制,一个同名类可不可以被加载两次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值