美文网首页Java面试篇
面试题之IO&并发编程

面试题之IO&并发编程

作者: TZX_0710 | 来源:发表于2020-09-09 18:29 被阅读0次
    1. 什么是IO?

    Java中IO是以流为基础进行数据的输入输出的,所有数据被串行化写入输出流。简单来说就是java通过io流和设备交互。

    1. 同步与异步,阻塞与非阻塞的区别?
    1. 同步,一个任务完成之前不能做其他操作
    2. 异步,一个任务完成之前,可以进行其他操作
    3. 阻塞,是相对于CPU来说的,挂起当前线程,不能做其他操作
    4. 非阻塞 无须挂起当前线程,可以去执行其他操作
    1. 什么是BIO?

    同步并阻塞 服务器实现一个连接一个线程,客户端有请求时服务器端就要启动一个线程进行处理,不能做其他操作,应用场景:连接数量小且固定的架构

    1. 什么是NIO ?

    同步非阻塞,NIO方式使用连接数比较多且连接比较短的架构

    1. 什么是AIO?

    AIO 异步非阻塞,AIO方式适用于连接数目比较多且连接比较长的架构。

    1. 什么是Netty?

    一个JBoss开源框架基于NIO的客户、服务器端变成框架。Netty是能够更好的使用NIO

    1. BIO和NIO、AIO的区别?

    BIO是阻塞的 NIO是非阻塞的
    BIO是面向读写的 只能单向读写 NIO是面向缓冲的 可以双向读写
    BIO做socket连接时,单向链接,没有数据的时候挂起线程。浪费资源。NIO进行BIO多路复用,使用一个线程监听所有的socket链接,使用本线程或其他线程处理连接

    1. 为什么要使用并发编程?
    1. 提高CPU使用率
    2. 方便业务拆分、提升应用性能
    1. 多线程应用场景?

    迅雷多线程下载、数据库连接池、分批发送短信

    1. 并发编程有什么缺点?

    内存泄漏、上下文切换、线程死锁、线程安全问题

    1. 并发编程三个必要因素是什么?
    1. 原子性:一个操作要么都成功要么全部失败
    2. 可见性 一个线程共享变量的修改 另一个线程能够立刻看到
    3. 有序性: 程序执行的顺序按照代码的先后顺序执行
    1. 在Java程序怎么保证多线程的运行安全?
    1. 线程切换带来的原子性问题,使用多线程之间的同步synchronized或使用锁lock
    2. 缓存导致的可见性问题: synchronized volatile Lock都可以解决
    3. 编译优化带来的有序性问题 Happens-Before规则解决
    1. 并发和并行有什么区别?
    1. 并发:多个任务在同一个CPU上,按细分的时间片轮流执行,逻辑上是同时执行
    2. 并行:多个处理器同时处理多个任务
    3. 串行:有n个任务。由一个线程按顺序执行,由于任务、方法都在一个线程执行 所以不存在线程不安全的情况
    1. 什么是多线程?

    多线程是指程序中包含多个执行流、即在一个程序中可以同时运行多个不通的线程来执行不同的任务。

    1. 多线程的好处?

    提高CPU的利用率。

    16 .多线程的劣势?

    线程越多占用的内存也越多
    多线程需要协调和管理,所以需要CPU时间跟踪线程
    线程之间对共享资源访问会影响,所以要解决抢占资源的问题

    1. 线程和进程的区别?
      一个程序 一个进程 、进程当中一个执行任务就是一个线程
    1. 什么是上下文切换?

    当一个线程的时间片用完的时候重新处于就绪状态让其他线程使用,这个过程就属于一次切换.

    1. 如何避免线程死锁?
    1. 避免一个线程同时获得多个锁
    2. 避免一个线程在锁内同时占用多个资源,尽量保证一个锁一个资源
    3. 尝试使用定时所,使用lock.tryLock代替使用内部锁机制
    1. 什么是callable和Future?

    Callable有返回结果,被线程执行之后可以有返回值
    Future 接口表示异步任务 ,是一个可能还没有完成的异步任务的结果。所以说Callable用于产生结果,Future用于获取结果

    1. 什么是FutureTask?
      FutureTask表示一个异步运算任务,可以传入一个Callable的具体实现类
    1. sleep和wait的区别?

    sleep是Thread的方法,wait是object方法
    sleep不释放锁 wait释放锁
    wait用于线程交互通信,sleep被用于暂停执行
    wait 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify或者notifyall方法。sleep方法执行完成后,线程会自动苏醒。

    1. 在Java中怎么保证多线程的运行安全?
    1. 使用原子类
    2. 使用synchronized
    3. 使用手动锁 lock
    1. Java垃圾回收有什么目的?什么时候进行垃圾回收?
    1. 内存中存在没有引用的对象,或者对象超过作用域
    2. 垃圾回收的目的是识别丢弃应用不再使用的对象来释放和重用资源。
    1. volatile变量和atomic变量有什么不同?
    1. volatile变量可以确保先行关系,即写操作会发生后续的读操作之前,但它不能保证原子性
    2. AtomicInteger 类提供的atomic方法可以让这种操作具有原子性方法会原子性进行增量把当前值加一
    1. 什么是线程池?
    1. 降低资源消耗,重复利用已创建的线程
    2. 提高响应速度 。当任务到达时不需要创建线程可以立即执行
    3. 提高线程的管理性,线程池可以统一分配、调优和监控
    1. 经常使用的并发容器?
    1. Vector ConcurrentHashMap HastTable、Collections.SynchronizedSet
    1. SynchronizedMap和ConcurrentHashMap有什么区别?

    SynchronizedMap 一次性锁住正常表来保证线程安全
    ConcurrentHashMap 使用分段锁来保证在多线程下的性能

    相关文章

      网友评论

        本文标题:面试题之IO&并发编程

        本文链接:https://www.haomeiwen.com/subject/mukjektx.html