并发编程
- 1.线程和进程的区别
- 2.并行和并发的区别
- 3.创建线程的4种方式
- 4.runnable 和 callable 有什么区别
- 5.线程的 run()和 start()有什么区别?
- 6.线程包括哪些状态,状态之间是如何变化的
- 7.新建T1,T2,T3三个线程,如何保证他们顺序执行
- 8.notify()和 notifyAll()有什么区别?
- 9.wait 和 sleep 方法的不同
- 10.如何停止一个正在运行的线程
- 11.对象的内存结构
- 12.synchronized关键字的底层原理
- 13.请说说你对锁升级的认识
- 14.Monitor重量级锁
- 15.轻量级锁
- 16.偏向锁
- 17.谈谈 JMM(Java 内存模型)
- 18.CAS是什么
- 19.乐观锁和悲观锁
- 20.谈谈对 volatile 的理解
- 21.什么是AQS
- 22.AQS是公平锁吗,还是非公平锁
- 23.ReentrantLock的实现原理
- 24.AQS实现的Lock与Synchronized的区别
- 25.死锁产生的条件
- 26.如何进行死锁诊断
- 27.ConcurrentHashMap是什么
- 28.导致并发程序出现问题的根本原因是什么
- 29.说一下线程池的核心参数(线程池的执行原理)
- 30.常见的拒绝策略
- 31.常见的阻塞队列
- 32.ArrayBlockingQueue的LinkedBlockingQueue区别
- 33.如何确定核心线程数
- 34.线程池的种类
- 35.为什么不建议用Executors创建线程池
- 36.线程池使用场景(es数据批量导入)
- 37.线程池使用场景(数据汇总)
- 38.线程池使用场景(异步调用)
- 39.如何控制某个方法允许并发访问线程的数量
- 40.谈谈你对ThreadLocal的理解
- 41.谈谈ThreadLocal内存泄露问题
1.线程和进程的区别
- 当一个程序被运行,从磁盘加载这个程序的代码至内存,就开启了一个进程。
- 一个进程之内可以分为一到多个线程
- 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
- 二者对比
- 进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务
- 不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间
- 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低(上下文切换指的是从一个线程切换到另一个线程)
2.并行和并发的区别
-
并发(concurrent)是同一时间应对(dealing with)多件事情的能力,多个线程轮流使用一个或多个CPU
-
并行(parallel)是同一时间动手做(doing)多件事情的能力,4核CPU同时执行4个线程
3.创建线程的4种方式
- 继承Thread类
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread...run...");
}
public static void main(String[] args) {
// 创建MyThread对象
MyThread t1 = new MyThread() ;
MyThread t2 = new MyThread() ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}
- 实现runnable接口
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable...run...");
}
public static void main(String[] args) {
// 创建MyRunnable对象
MyRunnable mr = new MyRunnable() ;
// 创建Thread对象
Thread t1 = new Thread(mr) ;
Thread t2 = new Thread(mr) ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}
- 实现Callable接口
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.pr