什么是程序?
可执行的文件。
什么是进程?
进程是程序一次动态执行的过程,它是资源分配与管理的基本单位。
什么线程?
线程是进程创建的,它是调度和执行的基本单位。线程不拥有系统资源,只拥有一点必不可少的资源,但它可以与同一个进程的其它线程共享进程的全部资源。
什么是纤程(了解)?
- 概念:它是用户空间的线程,启动数量多,纤程之间切换资源消耗比较低。
- 线程与纤程的本质区别是一个通过内核空间(线程),一个不通过内核空间(纤程)
- 目前到JDK13并没有支持纤程。
什么是线程切换?
单核CPU设定多线程是否有意义?
有意义,线程在wait或sleep下,不适用CPU。可以被其他线程利用。
工作线程数是不是设置越大越好?
不是
工作线程数(线程池中线程数量)设置多少合适?
创建线程的方式?
- extend Thread
- implement Runnable Override run() and new Tread(Runnable r).start()
- implement Callable Override call() and FutureTask
- ThreadPool
- new Tread(lamda).start()
线程6种状态:
- NEW(新建状态) 线程刚创建,还没有启动 -> new Thread()
- RUNNABLE (可运行状态) 可运行状态,有线程调度器可以安排执行 -> new Thread().start()
- READY (准备状态)
- RUNNING (可运行状态)
- WAITING(等待状态) 等待被唤醒
- TIMED WAITING(间隔时间) 隔一段时间后自动唤醒
- BLOCKED(阻塞状态) 被阻塞,正在等待锁
- TERMINDTED(结束状态) 线程结束
interrupt”打断“线程:
- interrupt() 打断某个线程(设置标志位)
- isInterrupted() 查询某线程是否被打断过(查询标志位)
- static interrupt() 查询当前线程是否被打断过,并重置打断标识
如何优雅的结束线程:
- 自然结束
- stop()暴力停止线程;[不推荐使用,原因:i.可能使一些清理工作得不到完成;II.对锁定对象进行'解锁',数据得不到同步处理,出现数据不一致]。
- 使用volatile变量标识终止正常运行的线程 + 抛异常法/Return法 [不能准确控制停止时间,如果遇到sleep()、wait()需等待]。
- 使用interrupt()与interruptted()/isinterrupted()结合+抛异常法/Return法;[推荐异常法,异常可以上抛,异常信息可以传播,但不能准确控制停止时间]
并发编程三大特性:
可见性 :
线程之间变量的可见性,例如Volatile、Synchronized 或某些语句触发内存缓存同步刷新(System.out.println(),它底层用到了Synchronized)。
- 有序性
- 原子性
Volatile:
- 可见性:共享变量的变更能即时可见,原因:工作内存中新值能立即同步到主内存的规则
- 有序性:禁止指令重排序优化,原因:使用内存屏障。
- Volatile修饰引用类型(包括数组)只能保证引用本身的可见性, 不能保证内部字段的可见性
CPU的三级缓存:
CPU的缓存行:
- 概念:CPU读取内存数据时并非一次只读一个字节,而是会读一段64字节长度的连续的内存块(chunks of memory),这些块我们称之为缓存行(Cache line)。
- 按块读取,程序局部性原来,可以提高效率,充分发挥总线CPU针脚等一次性读取更多数据的能力
- 缓存行 64字节(B),原因:缓存行越大,局部性空间效率越高,但读写时间越长;反之..,最后折中值是64B
- 缓存对齐写法优点
- 伪共享 --> 通过缓存一致性
MESI 缓存一致性协议:
乱序:
什么会乱序?
为了提高效率
乱序存在的条件:
- as-if-serial :不管怎么重排序,(单线程)程序的执行结果不能被改变。
- 不影响单线程的最终一致性