GitHub:https://github.com/JDawnF
前言:这一模块可以参照徐刘根大佬的博客。
目录
四.说说 CountDownLatch、CyclicBarrier 原理和区别
七.ThreadLocal 原理分析,ThreadLocal为什么会出现OOM,出现的深层次原理
一.线程和进程的概念、并行和并发的概念
1.进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统 进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
2.线程:是程序执行流的 最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度 的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在 单个程序中同时运行多个线程完成不同的工作,称为多线程。
3.两者区别:
- 1、进程是资源分配的最小单位,线程是程序执行的最小单位。
- 2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空 间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是 共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比 进程要小很多,同时创建一个线程的开销也比进程要小很多,线程的上下文切换 的性能消耗要小于进程。
- 3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数 据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互 斥是编写多线程程序的难点。
- 4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉 了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地 址空间。
二.创建线程的方式及实现
创建线程的方法有三种:
(1)继承Thread类,重写run方法;
public class MyThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println(this.currentThread().getName());
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); //线程启动的正确方式
}
}
启动线程的是start()方法而不是run()方法,run()方法只是一个普通的方法执行了,也就是只是会执行一次,
(2)实现Runnable接口,并将对象实例例作为参数传递给Thread类的构造方法;
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("123");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable, "t1");
thread.start();
}
}
Thread类本身实现了Runnable接口,并且持有run方法,但Thread类的run方法主体是空的,Thread类的run方法通常是由
子类的run方法重写。
(3)实现callable接口,并实现call方法,并且线程执行完毕后会有返回值。
三.线程间通信的方式
参看:https://blog.youkuaiyun.com/striveb/article/details/83542145
四.说说 CountDownLatch、CyclicBarrier 原理和区别
五.说说 Semaphore 原理
六.说说 Exchanger 原理
七.ThreadLocal 原理分析,ThreadLocal为什么会出现OOM,出现的深层次原理
关于ThreadLocal 可以看这个:https://blog.youkuaiyun.com/striveb/article/details/83412848
八.讲讲线程池的实现原理
九.线程池的几种实现方式
十.线程的生命周期,状态是如何转移的
十一.什么是synchronized及其特性
参照下面这三个:
- https://blog.youkuaiyun.com/striveb/article/details/83415182
- http://www.cnblogs.com/pureEve/p/6421273.html
- https://blog.youkuaiyun.com/xlgen157387/article/details/78005352
十二.什么是lock对象和ReentrantLock?
https://blog.youkuaiyun.com/striveb/article/details/83421107
十三.什么是volatile,有什么作用?
https://blog.youkuaiyun.com/striveb/article/details/83537133
十四.什么是死锁?怎么避免?
十五.锁的优缺点对比
徐刘根大佬的多线程专栏:https://blog.youkuaiyun.com/column/details/17790.html
《Java并发编程的艺术》、《Java多线程编程核心技术》