博客
关于我
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/

    你可能感兴趣的文章
    NPOI初级教程
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NPOI在Excel中插入图片
    查看>>
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>
    nrm报错 [ERR_INVALID_ARG_TYPE]
    查看>>
    NS3 IP首部校验和
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSError 的使用方法
    查看>>
    NSGA-Ⅲ源代码
    查看>>
    nsis 安装脚本示例(转)
    查看>>
    NSJSON的用法(oc系统自带的解析方法)
    查看>>
    nslookup 的基本知识与命令详解
    查看>>
    NSNumber与NSInteger的区别 -bei
    查看>>