Java并发篇面试总结
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
摘要
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()释放资源。
如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!
想要了解更多内容?