多线程篇

Java面试_周阳_Jujuxiaer的博客-CSDN博客

1 CAS
  1. 乐观锁,先修改数据再比较并交换。
  2. 自旋锁,不断循环获取锁,消耗CPU
  3. 对比Synchronized,ReentrantLock性能更高。
  4. ABA问题,只关心结果。添加版本号解决。
    CAS具有原子性、无锁、自旋等待和无阻塞的特点
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. 初始化:线程池会在启动时创建一定数量的线程,并将它们置于等待状态,直到有任务分配给它们。
  2. 任务分配:当有任务需要执行时,线程池会从线程池中取出一个空闲线程,并将任务分配给它。如果所有线程都正在执行任务,那么任务会被放入任务队列中等待执行。
  3. 任务执行:线程会执行任务,并在任务完成后返回线程池,并变成空闲状态。如果线程在执行任务时发生异常,则线程会被标记为死亡,并重新创建一个新线程替代它。
  4. 线程回收:当线程池不再需要某个线程时(例如由于线程空闲时间过长),线程会被回收并从线程池中移除。

扩容缩容:如果任务量较大,线程池可能需要动态扩容以适应负载。反之,如果任务量较少,线程池可能需要缩容以节省系统资源。

总体来说,线程池通过管理线程资源,使得多个并发任务可以在同一时刻进行执行,从而提高了程序的并发性能。

  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.
AbstractQueuedSynchronizer(简称AQS)是Java并发包中一个很重要的类,它提供了一种基于FIFO等待队列实现阻塞锁和相关同步器的机制。AQS是实现Lock接口、ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock、FutureTask等类的基础。

AQS的主要作用是为导致供了一系列的方法,可以用于实现各种不同类型的同步器,如独占式锁、共享式锁等。

AQS的设计思路是将同步状态(state)与线程(Thread)构成一个双向链表,当多个线程同时争夺资源时,AQS会将这些线程放入一个FIFO的等待队列中,等待队头的线程获取到资源后,其他线程才有机会继续争夺资源。这种方式避免了“饥饿”情况的出现,确保了线程获取资源的公平性。

在具体实现中,AQS类提供了acquire()和release()两个核心方法,其中acquire()方法用于尝试获取锁或者同步状态,如果获取失败则将当前线程加入到等待队列中;而release()方法用于释放锁或者同步状态,并唤醒等待队列中的下一个线程。

因此,通过继承AQS类,我们可以实现一个可靠的同步工具,如锁、信号量、计数器和队列等,这些同步工具可以用于协调多个线程之间的执行顺序和资源访问,从而提高程序的并发性能和可靠性。
15 线程池中空闲的线程属于哪种状态?

等待或者超时等待

16 线程池的优点?
  1. 降低线程创建和销毁的开销
  2. 提高了系统资源的利用
  3. 控制并发数,避免过多的线程竞争导致系统崩溃。
  4. 提高代码的可维护性,将线程管理和任务处理逻辑分开。
17 线程池的缺点?
  1. 增加系统的复杂度
  2. 短时间大量任务的处理率不如直接使用线程。(执行线程数量>线程数)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容