美文网首页
多线程篇

多线程篇

作者: markDownMan | 来源:发表于2023-03-31 11:35 被阅读0次
1 CAS
  1. 乐观锁,先修改数据再比较并交换。
  2. 自旋锁,不断循环获取锁,消耗CPU
  3. 对比Synchronized,ReentrantLock性能更高。
  4. ABA问题,只关心结果。添加版本号解决。
2. ThreadLocal的底层原理
  1. ThreadLocal线程本地存储机制,能把数据缓存再某一个线程内,该线程可以在任意时刻,方法中获取缓存的数据。
  2. ThreadLocal底层是通过ThreadLocalMap来实现,在Thread对象中存在一个ThreadLocalMap,key->ThreadLocal对象,value->需要缓存的值
  3. 使用不当会造成内存溢出。使用后,需要手动remove ThreadLocalMap对应的Entry对象。
  4. ThreadLocal 应用场景-事务,数据库连接。(一个线程持有一个连接)
3 Synchrouozed和ReentranWriteReadLock的区别?
  1. synchronized-关键词;ReentrantLock-类
  2. synchronized-jvm实现;ReentranLock-API实现
  3. synchronized-自动加解锁;ReentranLock-手动加解锁。
  4. synchronized-非公平锁;ReentranLock-可公平/非公平锁。
  5. synchronized-锁信息存在对象头;ReentranLock-锁中的state表示锁的标识。
  6. synchronized底层有一个锁升级的过程。
4 线程有哪些状态?
  1. 新建
  2. 就绪。Thread.start()
  3. 运行
  4. 阻塞
  5. 等待。Object.wait()
  6. 超时等待.超时自动返回
  7. 死亡


    image.png
5 新开线程的三种方式?
  1. Runnable接口
  2. Thread类
  3. Callable
  4. 线程池
6 Volatile为什么不能保证原子性?
  1. 保证可见性
  2. 禁止指令重排(执行顺序不变)
  3. 不保证原子性
7 ConcurrentHashMap底层实现原理?

jdk1.7 数组+链式存储
jdk1.8 数组+链表+红黑树

8 并发,并行,串行 区别?
  1. 串行:线程排队执行。
  2. 并行:2个任务同时执行。
  3. 并发:2个任务看着是一起执行,由CPU切换执行线程1一部分,再切换上下文执行线程2一部分,来回切换,看着是一起执行。
9 死锁如何避免?

造成死锁的4个要素:
1.一个资源每次只能被一个线程使用。

  1. 一个线程阻塞等待资源时,不释放已占有资源。
  2. 一个线程获取资源,且未使用完前,不能被强行剥夺。
  3. 若干线程头尾相接在等待资源。
    只要破坏以上4个要素之一即可。
  4. 加锁顺序。保持统一顺序。
  5. 加锁时间。超时时间。
  6. 死锁检查。
10 线程池的底层工作原理?
  1. 线程数量<corePoolSize,即使线程池的线程处于空闲,也创建新线程处理。
  2. 线程数量>=corePoolSize,缓冲队列workQueue未满,那么任务放到缓冲队列中。
  3. 如果无法加入workQueue,且线程数<maxPoolSize,创建新线程执行任务。
    如果线程数>=maxPoolSize,拒绝执行策略。
11 ConcurrentHashMap扩容?

jdk1.7 基于segment分片实现。segment也是新增数组拷贝。
jdk1.8 多线程同时扩容,先生成新的数组。每一个线程分组转移数组。

12 synchronized偏向锁,轻量锁,重量锁,自旋锁

1.偏向锁:线程获取对象锁后,会把线程id存到对象头,下次可以直接获取
2.轻量级:线程a获取对象锁后,线程b等待获取对象锁。此时偏向锁升级为轻量级锁。不阻塞,自旋。
3.重量级:在轻量级锁的基础上,不断自旋,但却无法竞争到锁,升级成重量级锁。
4.自旋锁,不阻塞,通过CAS乐观锁,不断循环获取预期的标记,若获取了则也获取到锁。

13 sleep,wait,join,yield的区别?
  1. sleep,Thread静态方法,不释放锁,释放cpu的执行权。
  2. wait,Object方法,释放锁,进去等待池,需要被唤醒。
  3. join,在B线程执行A.join(),B进入阻塞状态,等待A的结束。
  4. yield,释放cpu的执行权,之后重新竞争cpu执行权。
14 AQS的理解?
  1. AbstractQueuedSynchronizer,抽象队列同步器
  2. AQS是java线程同步的组件,是jdk很多锁工具的核心实现组件。
  3. AQS维护了一个信号量state和一个线程组成的双向队列。
    线程队列-排队,信号量-红绿灯,控制线程的执行和阻塞。
  4. 在可重入锁的场景下,state表示加锁的次数,0表示无锁,加锁+1,释放锁-1.
15

相关文章

  • iOS多线程篇:NSThread

    iOS多线程篇:NSThread iOS多线程篇:NSThread

  • iOS面试备战-多线程篇

    iOS面试备战-多线程篇iOS面试备战-多线程篇

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • iOS - Multi-Thread

    概念篇 进程 线程 多线程 单核多线程 & 多核多线程 并行 & 并发 同步 & 异步 队列 队列 & 任务 的执...

  • Python 主线程捕获子线程异常

    多线程异常 接上一篇Python手动中断(Ctrl-C)多线程程序,这一篇来探讨多线程程序中另一个问题:主线程捕获...

  • 多线程

    上一篇:协议当前篇:多线程 随着多核多线程处理器的出现,多线程编程技术也已经普及,我们之前写的代码都是在单一线程中...

  • Java多线程系列目录(共43篇)-转

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 Java多线程系列--“基础篇”0...

  • 多线程(三)-为主线程减负的多线程方案

    再梳理一篇多线程的文章,正好续上之前的多线程章节,完善下这个章节内容。 一、多线程方案: ThreadPool: ...

  • IOS 多线程知识学习

    学习多线程,转载两篇大神的帖子,留着以后回顾!第一篇:关于iOS多线程,你看我就够了 第二篇:GCD使用经验与技巧...

  • 有个人催牛b

    Java多线程看着一篇足够了

网友评论

      本文标题:多线程篇

      本文链接:https://www.haomeiwen.com/subject/bmrhddtx.html