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

本文共 1994 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    nodejs下的express安装
    查看>>
    nodejs与javascript中的aes加密
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs中express的使用
    查看>>
    Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
    查看>>
    Nodejs中的fs模块的使用
    查看>>
    NodeJS使用淘宝npm镜像站的各种姿势
    查看>>
    NodeJs入门知识
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs在Liunx上的部署生产方式-PM2
    查看>>
    nodejs基于art-template模板引擎生成
    查看>>
    nodejs字符与字节之间的转换
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    NodeJs学习笔记002--npm常用命令详解
    查看>>
    nodejs学习笔记一——nodejs安装
    查看>>
    vue3+Element-plus icon图标无法显示的问题(已解决)
    查看>>