基础问题千万不要直接回答:继承Thread类,实现Runnable接口;使用Synchronized关键字。
回答好了可以引导面试官的思路!
问题分析
- 题目很简单,属于并发的入门问题。所以回答的时候要全面!
- 回答之前可以引入问题:线程与进程的区别。
- 根据回答进行扩展内容,引导面试官的思路!
回答的第一步(基本内容):线程与进程的区别。
- 线程和进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。
回答的第二步(基本内容):如何开启线程?
- (必须回答的内容)继承Thread类,重写run方法。
- (必须回答的内容)实现Runnable接口,实现run方法。
- (加分项)实现Callable接口,实现call方法。通过FutureTask创建一个线程,获取到线程执行的返回值。
- (加分项)通过线程池来开启线程。
- (加分项)本质上创建线程只有一种方式:在Thread类中传一个Runnable的对象,执行run方法!
回答的第三步(基本内容):怎么保证线程安全?
- 多个线程操作同一个共享变量的时候会出现线程安全问题!解决的核心思路是加锁。
- (必须回答的内容)JVM提供的锁:也就是Synchronized关键字。
- (加分项)JDK提供的各种锁:Lock。
回答的第四步(扩展内容):为什么JDK要设计这么这4种开启线程的方式?
- 由于java的类类是单继承,多实现的。所以提供了实现实现Runnable接口的方式开启线程。
- 由于继承Thread类和实现Runnable接口开启的线程没有返回值,所以提供了Callable来获取返回值。
- 开启新的线程会消耗资源,为了减少新线程的开启,所以提供了线程池。
回答的第五步(扩展内容):线程的状态有哪些?
- 在操作系统层面有5种,java中有6种。
- 操作系统中的线程状态:初始状态、可运行状态、运行状态、休眠状态和终止状态。
- java中的线程状态:初始化状态、可运行状态+运行状态、阻塞状态、无时限等待、有时限等待、终止状态。
- Java线程中的 BLOCKED、WAITING、TIMED_WAITING 是一种状态,即操作系统的休眠状态。这三种状态永远没有CPU的使用权!
- Java线程中的 RUNNABLE 状态,在操作系统中分为:可运行(就绪)状态、运行状态。
回答的第六步(扩展内容):start方法与run方法的区别是什么?
- start方法是真正的开启一个线程!
- run方法是java中方法的调用,不开启线程!
- 新线程开启会先调用start方法,然后在start方法开启的新线程上调用run方法。
- 在线程池中线程只进行一次start方法,后续会多次的调用run方法。
回答的第七步(扩展内容):Synchronized的锁实现
- JDK1.5之前是基于重量级锁(Monitor)实现。
- JDK1.5开始加入了偏向锁、轻量级锁、重量级锁。
回答的第八步(扩展内容):Lock锁的各种实现类型
- 重入锁
- 公平锁,非公平锁
- 独占锁、互斥锁
- 共享锁
- 读写锁
- 自旋锁
结束语
- 获取更多本文的前置知识文章,以及新的有价值的文章,让我们一起成为架构师!
- 关注公众号,可以让你对MySQL、并发编程、spring源码有深入的了解!
- 关注公众号,后续持续高效的学习JVM!
- 这个公众号,无广告!!!每日更新!!!