目录✨
- 1. 谈谈 volatile关键字的用法?
- 2. Java多线程是如何实现数据共享的?
- 3. Java创建线程池的接口是什么?参数 LinkedBlockingQueue 的作用是什么?
- 4 . Java线程共有几种状态?状态之间怎么切换的?
- 5. 在多线程下,如果对一个数进行叠加,该怎么做?
- 6. Servlet是否是线程安全的?
- 7. Thread和Runnable的区别和联系?
- 8. 多次start一个线程会怎么样
- 9. 有synchronized两个方法,两个线程分别同时用这个方法,请问会发生什么?
- 10. 进程和线程的区别?
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. Thread和Runnable的区别和联系?
Thread 类描述了一个线程.
Runnable 描述了一个任务.
在创建线程的时候需要指定线程完成的任务, 可以直接重写 Thread 的 run 方法, 也可以使用
Runnable 来描述这个任务.
8. 多次start一个线程会怎么样
第一次调用 start 可以成功调用.
后续再调用 start 会抛出 java.lang.IllegalThreadStateException
异常
9. 有synchronized两个方法,两个线程分别同时用这个方法,请问会发生什么?
synchronized
加在非静态方法上, 相当于针对当前对象加锁.
如果这两个方法属于同一个实例:
线程1 能够获取到锁, 并执行方法. 线程2 会阻塞等待, 直到线程1 执行完毕, 释放锁, 线程2 获取到
锁之后才能执行方法内容.
如果这两个方法属于不同实例,两者能并发执行, 互不干扰.
10. 进程和线程的区别?
-
进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
-
进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间.
-
进程是系统分配资源的最小单位,线程是系统调度的最小单位。
-
over ~