文章目录
线程基础知识复习
JUC是什么?
java.util.concurrent在并发编程中使用的工具包
为什么学习并用好多线程极其重要?
硬件方面
摩尔定律:
它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。其内容为:
当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。
换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。
可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。
摩尔定律失效了。。。
在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到并行或并发编程。
软件方面
面试B格可以高一点点
充分利用多核处理器
提高程序性能,高并发系统
提高程序吞吐量,异步+回调等生产需求
弊端及问题
线程安全性问题,例如:i++是非原子操作、集合类安全否
线程锁问题,例如:synchronized锁,但是是重量级锁
线程性能问题,例如:了解偏向锁、轻量级锁
start线程开启源码分析
package com.fastech.juc;
public class ThreadBaseDemo {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
}, "t1");
t1.start();
}
}
查询start()方法源码
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
// native表示JNI本地接口调用,调的是第三方C语言编写的底层函数,或者是操作系统的底层代码
// JNI代表Java native interface,Java本地接口
private native void start0();
Java语言本身底层就是C++语言,OpenJDK就是指C++源语级别对Java语言的描述,OpenJDK源码网址:https://openjdk.org/
start0()方法具体做了哪些操作,其实就是OpenJDK源码里面的openjdk8\jdk\src\share\native\java\lang\thread.c、openjdk8\hotspot\src\share\vm\prims\jvm.cpp、openjdk8\hotspot\src\share\vm\runtime\thread.cpp三个类
OpenJDK和JNI一般是一一对应的,Thread.java对应就是thread.c,start0其实就是JVM_StartThread。此时查看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现
thread.c