目录
1、硬件方面
摩尔定律失效,在主频不再提高且核数在不断增加的情况下,要想程序更快就要用到并行或并发编程
2、软件方面
通过代码层面实现对cpu性能的极致使用,重分利用多核处理器
提高程序的性能,高并发系统
提供程序吞吐量,异步+回调等生产需求
3、弊端
线程安全问题 -> i++,集合类安全否
线程锁问题
线程性能问题
一、线程基础知识复习
1、单个线程创建
.start() 方法,翻看源码发现 调用了本地的方法 start0方法,而 native 方法是底层C语言的函数方法,C语言可以直接调用操作系统的start0方法,而start0实际调用的jvm层面的方法 JVM_startThread 方法,Jvm就是介于操作系统和硬件之间的方法,由这个方法完成线程的调度
Java语言本身底层就是C++语言
OpenJDK源码网址(对java源码的)
2、Java多线程相关概念
一把锁
synchronized 第四章深度讲解
两个并
并发(concurrent)、并行(parallel)
并发:一对多
同一个实体上的多个事件,是在一台处理器上同事处理多个任务,同一时刻,其实是只有一个事件在发生
并行:多对多
是在不同实体上的多个事件,是在多台处理器上同事处理多个任务,同一时刻,大家真的都在做事情,各做各的
三个程
进程、线程、管程
进程:
简单的说,在系统中运行的一共应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源
线程:
也被称为轻量级进程,在同一个进程内会由一个或多个线程,是大多数操作系统进行时序调度的基本单位
管程:
monitor(监视器)也就是我们平时所说的锁
monitor其实是一种同步机制,他的义务是保证同一时间只有一个线程访问被保护的数据和代码,JVM中同步是基于进入和退出监视器对象(monitor管程对象)来实现的,每个对象实例都会有一个monitor对象
monitor对象会和java对象一同创建并销毁,底层是由C++语言实现的
Object o = new Object();
Thread thread1 = new Thread(() -> {
synchronized (o){
}
},"t2");
thread1.start();
jvm中关于管程的描述
3、用户线程和守护线程
- 一般不做特别说明,默认都是用户线程
- 用户线程(User Thread)->是系统的工作线程,它会完成中国程序需要完成的业务操作
- 守护线程(Daemon Thread)
->是一种特殊的线程为其他线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程就是典型的例子;
->守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了,所以假如当系统只剩下守护线程的时候,java虚拟机会自动退出
判断线程是否为守护线程
//false -> 用户线程
//true -> 守护线程
Thread threadIsDaemon = new Thread(()->{
System.out.println("一个简单的线程启动咯..."+" \t "+Thread.currentThread().getName()+" \n "
+(Thread.currentThread().isDaemon() ? "守护线程":"用户线程"));
while (true){
}
},"t1");
threadIsDaemon.setDaemon(false);
threadIsDaemon.start();
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\n"+"end 主线程");
如果用户线程全部结束意味着程序需要程序完成的业务操作已经全部结束,守护线程会随着JVM一同结束工作