【面试:并发编程】java如何开启线程?怎么保证线程安全?

问题分析

  • 题目很简单,属于并发的入门问题。所以回答的时候要全面!
  • 回答之前可以引入问题:线程与进程的区别。
  • 根据回答进行扩展内容,引导面试官的思路!

回答的第一步(基本内容):线程与进程的区别。

  • 线程和进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。

回答的第二步(基本内容):如何开启线程?

  • (必须回答的内容)继承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!
  • 这个公众号,无广告!!!每日更新!!!
    【面试:并发编程】java如何开启线程?怎么保证线程安全?
上一篇:面试突击24:为什么wait和notify必须放在synchronized中?


下一篇:微信小程序 部署腾讯云 出现502 bad gateway 新解决方案