博客
关于我
Java 并发基础常见面试题总结
阅读量:462 次
发布时间:2019-03-06

本文共 1986 字,大约阅读时间需要 6 分钟。

Java 并发基础常见面试题总结

1. 进程与线程的基础知识

1.1 进程

进程是程序的一次执行过程,是操作系统运行程序的基本单位。进程在创建、运行到终止的整个过程中,独占系统资源,如内存、CPU等。每个进程都有自己的虚拟地址空间、堆栈等资源。

在Java中,启动一个JVM时,主类的main方法会启动一个进程。这个进程中的线程称为主线程。我们可以通过任务管理器查看正在运行的进程列表。

1.2 线程

线程是比进程更小的执行单位。一个进程可以产生多个线程,这些线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。线程是轻量级进程,因其切换成本较低,被广泛用于并发编程。

Java程序天生支持多线程编程。通过JMX工具可以查看当前JVM中运行的线程信息。以下是获取所有线程信息的示例代码:

public class MultiThread {    public static void main(String[] args) {        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);        for (ThreadInfo threadInfo : threadInfos) {            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());        }    }}

运行结果可能包括main线程和其他系统线程,如信号分发线程、最终化线程等。

1.3 线程与进程的关系

从JVM角度看,一个进程可以包含多个线程。线程共享进程的堆和方法区资源,但有自己的程序计数器、虚拟机栈和本地方法栈。线程是进程划分成更小的执行单位的方式。

1.4 Java内存区域

JVM的内存区域包括:堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器。线程私有的是虚拟机栈和本地方法栈,共享的是堆和方法区。

2. 并发与并行的区别

  • 并发:单位时间内,多个任务可以执行,但不一定同时。
  • 并行:单位时间内,多个任务同时执行。

并发可以利用多核CPU的优势,提升系统性能。

3. 使用多线程的意义

  • 资源利用率:尤其是在多核系统中,多线程可以更好地利用CPU资源。
  • 响应时间:可以让长耗时任务在多个线程中并行执行,减少用户等待时间。
  • 系统扩展性:支持更高并发需求,适应业务增长。

4. 多线程可能带来的问题

  • 资源竞争:线程之间可能抢夺资源,导致性能问题。
  • 上下文切换:线程切换频繁,增加系统开销。
  • 资源泄漏:不正确使用共享资源可能导致内存泄漏。

5. 线程的生命周期与状态

线程在生命周期中可能处于以下状态:

  • 新建 (NEW):线程刚被创建。
  • 就绪 (READY):线程可获得CPU执行。
  • 运行 (RUNNABLE/RUNNING):线程正在执行CPU任务。
  • 等待 (WAITING):线程等待I/O操作完成。
  • 阻塞 (BLOCKED):线程等待共享资源。
  • 终止 (TERMINATED):线程执行完成或被中断。

线程状态转换依赖于执行的操作,如wait()sleep()、同步 BLOCK等。

6. 上下文切换

上下文切换是操作系统为多线程任务轮转而执行的操作。每个线程切换到执行状态前,需要保存当前上下文(如程序计数器、寄存器等),切换到下一个线程后恢复原上下文。

上下文切换开销较大,会影响系统性能。

7. 线程死锁

线程死锁是指多个线程在访问共享资源时发生互相等待的情况。四个必要条件:

  • 互斥条件:资源只能由一个线程占用。
  • 请求与保持:一个线程占有资源后不愿意释放。
  • 不剥夺:资源只能在使用完毕后释放。
  • 循环等待:线程之间形成资源依赖关系。
  • 常见解决方法:

    • 破坏循环等待条件:按序申请资源,按序释放资源。

    8. sleep()与wait()方法

    • sleep():线程暂停执行,占用CPU资源。调用后自动苏醒。
    • wait():线程暂停执行,不占用CPU资源。需要其他线程通知才会苏醒。

    wait()方法适合线程间通信,sleep()适合暂停执行。

    9. start()方法与run()方法

    • start():启动线程,执行run()方法。线程进入就绪状态,等待CPU执行。
    • run():线程方法,不能在主线程执行。

    调用start()方法才能让线程真正并发执行,直接调用run()方法会在主线程执行。


    以上内容涵盖了Java并发编程的基础知识,适合作为面试准备或入门学习参考。

    转载地址:http://iidbz.baihongyu.com/

    你可能感兴趣的文章
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm上传自己的项目
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>