多线程相关面试题(逐渐补充)

1) 谈谈 volatile关键字的用法?

volatile 能够保证内存可见性 . 强制从主内存中读取数据 . 此时如果有其他线程修改被 volatile 修饰的变量, 可以第一时间读取到最新的值 .

2) Java多线程是如何实现数据共享的?

JVM 把内存分成了这几个区域 :
方法区 , 堆区 , 栈区 , 程序计数器 .
其中堆区这个内存区域是多个线程之间共享的 .
只要把某个数据放到堆内存中 , 就可以让多个线程都能访问到 .

3) Java创建线程池的接口是什么?参数 LinkedBlockingQueue 的作用是什么?

创建线程池主要有两种方式 :
通过 Executors 工厂类创建 . 创建方式比较简单 , 但是定制能力有限 .
通过 ThreadPoolExecutor 创建 . 创建方式比较复杂 , 但是定制能力强 .
LinkedBlockingQueue 表示线程池的任务队列 . 用户通过 submit / execute 向这个任务队列中添加任务, 再由线程池中的工作线程来执行任务 .

4) Java线程共有几种状态?状态之间怎么切换的?

NEW: 安排了工作 , 还未开始行动 . 新创建的线程 , 还没有调用 start 方法时处在这个状态 .
RUNNABLE: 可工作的 . 又可以分成正在工作中和即将开始工作 . 调用 start 方法之后 , 并正在
CPU 上运行 / 在即将准备运行 的状态 .
BLOCKED: 使用 synchronized 的时候 , 如果锁被其他线程占用 , 就会阻塞等待 , 从而进入该状
.
WAITING: 调用 wait 方法会进入该状态 .
TIMED_WAITING: 调用 sleep 方法或者 wait( 超时时间 ) 会进入该状态 .
TERMINATED: 工作完成了 . 当线程 run 方法执行完毕后 , 会处于这个状态 .

5) 在多线程下,如果对一个数进行叠加,该怎么做?

使用 synchronized / ReentrantLock 加锁
使用 AtomInteger 原子操作 .

6) Servlet是否是线程安全的?

Servlet 本身是工作在多线程环境下 .
如果在 Servlet 中创建了某个成员变量 , 此时如果有多个请求到达服务器 , 服务器就会多线程进行操作, 是可能出现线程不安全的情况的 .

7) ThreadRunnable的区别和联系?

Thread 类描述了一个线程 .
Runnable 描述了一个任务 .
在创建线程的时候需要指定线程完成的任务 , 可以直接重写 Thread run 方法 , 也可以使用
Runnable 来描述这个任务 .

8) 多次start一个线程会怎么样

第一次调用 start 可以成功调用 .
后续再调用 start 会抛出 java.lang.IllegalThreadStateException 异常

9) synchronized两个方法,两个线程分别同时用这个方法,请问会发生什么?

synchronized 加在非静态方法上 , 相当于针对当前对象加锁 .
如果这两个方法属于同一个实例 :
线程 1 能够获取到锁 , 并执行方法 . 线程 2 会阻塞等待 , 直到线程 1 执行完毕 , 释放锁 , 线程 2 获取到
锁之后才能执行方法内容 .
如果这两个方法属于不同实例 :
两者能并发执行 , 互不干扰 .

10) 进程和线程的区别?

进程是包含线程的 . 每个进程至少有一个线程存在,即主线程。
进程和进程之间不共享内存空间 . 同一个进程的线程之间共享同一个内存空间 .
进程是系统分配资源的最小单位,线程是系统调度的最小单位。

你可能感兴趣的:(线程,java,开发语言)