扫码阅读
手机扫码阅读

Java并发篇面试总结

101 2024-07-17

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:Java并发篇面试总结
文章来源:
springboot葵花宝典
扫码关注公众号
Article Summary

摘要

1. 线程状态

Java线程有六种状态:新建、可运行、终结、阻塞、等待和有时限等待。线程在创建后未调用start()方法时处于新建状态。调用start()后进入可运行状态,等待操作系统调度。代码执行完毕后进入终结状态。获取锁失败时进入阻塞状态,等待锁的释放。wait()方法会使线程进入等待状态,而wait(long)或sleep(long)会让线程进入有时限等待状态。interrupt()、park/unpark方法可以打断等待或有时限等待状态的线程。

2. 线程池

核心线程池参数包括:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory和handler,它们分别定义了线程池的基本工作原理,如线程数量、生存时间、任务队列、线程创建方式和拒绝策略。

3. wait vs sleep

wait()和sleep()都会使线程放弃CPU使用权,但wait()属于Object方法且会释放锁,而sleep()是Thread的静态方法不会释放锁。wait()可以通过notify()被唤醒,而sleep()不依赖于锁。

4. lock vs synchronized

synchronized是关键字,而Lock是接口。synchronized自动释放锁,Lock则需手动释放。Lock比synchronized提供了更多功能,如公平锁和条件变量。在竞争激烈时,Lock通常性能更佳。

5. volatile

volatile主要解决可见性和有序性问题,不能保证原子性。使用volatile修饰的共享变量能确保线程间的可见性和防止指令重排序。

6. 悲观锁 vs 乐观锁

悲观锁如synchronized和Lock,保证每次只有一个线程操作共享资源。乐观锁如CAS操作,允许多个线程同时操作共享资源,通过重试保证操作的成功。

7. Hashtable vs ConcurrentHashMap

Hashtable与ConcurrentHashMap都是线程安全的Map,但Hashtable并发度低,而ConcurrentHashMap采用分段锁提高并发度。ConcurrentHashMap在1.8中进行了重大改进,采用Node数组加链表或红黑树结构,提高了并发性和扩容效率。

8. ThreadLocal

ThreadLocal通过为每个线程提供独立的变量副本实现线程隔离,避免线程安全问题。其内存释放依赖于GC对弱引用key的回收,推荐主动使用remove()释放资源。

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

想要了解更多内容?

查看原文:Java并发篇面试总结
文章来源:
springboot葵花宝典
扫码关注公众号