线程基础知识复习

1、线程基础知识复习

1.1 Doug Lea(道格.利)

1.2 java.util.concurrent在并发编程中使用的工具包

1.3 摩尔定律失效

  • 摩尔定律:它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。其内容为:
    当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。 换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。
  • 可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。摩尔定律失效了,在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到并行或并发编程。

1.4 Thread.c

  • java线程是通过start的方法启动执行的,主要内容在native方法start0中,openjdk的写JNI一般是一一对应的,Thread.java对应的就是Thread.c。start0其实就是JVM_StartThread。此时查看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。

1.5 jvm.cpp

1.6 thread.cpp

1.7 并发 vs 并行

1.8 Monitor(监视器)

  • Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。

  • JVM中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。

    1
    2
    3
    4
    5
    new Thread(()->{
    synchronized (o){

    }
    },"t1").start();

1.9 JVM第3版

1.10 源码解读

1.11 code演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class DaemonDemo {
public static void main(String[] args)//一切方法运行的入口
{
Thread t1 = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t 开始运行, " +
(Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
while (true) {

}
}, "t1");
t1.setDaemon(true);
t1.start();

//暂停几秒钟线程
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println(Thread.currentThread().getName() + "\t ----end 主线程");
}
}

1.12 why?

  • setDaemon(true)方法必须在start()之前设置,否则报llegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。