当前位置:网站首页>1、线程基础知识
1、线程基础知识
2022-06-11 12:07:00 【施小赞】
1、Doug Lea(道哥.利)

2、JUC四大口诀
2.1、高内聚低耦合前提下,封装思想
线程 操作 资源类
2.2、判断、干活、通知
2.3、防止虚假唤醒,wait方法要注意使用while判断
2.4、注意标志位flag,可能是volatile的
3、为什么多线程极其重要???
3.1、硬件方面:摩尔定律失效
摩尔定律:
它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。其内容为:
当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。
换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。
可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。
摩尔定律失效。
在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到 并行或并发编程。
3.2、软件方面
高并发系统,异步+回调等生产需求
4、从start一个线程说起
4.1、Java线程理解以及openjdk中的实现
private native void start0();
Java语言本身底层就是C++语言
OpenJDK源码网址
源码位置:openjdk8\hotspot\src\share\vm\runtime
4.2、更加底层的C++源码解读
4.2.1、openjdk8\jdk\src\share\native\java\lang
thread.c
java线程是通过start的方法启动执行的,主要内容在native方法start0中 ,
Openjdk的写JNI一般是一一对应的,Thread.java对应的就是Thread.c
start0其实就是JVM_StartThread。此时查看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。
4.2.2、openjdk8\hotspot\src\share\vm\prims
jvm.cpp


4.2.3、openjdk8\hotspot\src\share\vm\runtime
thread.cpp

5、Java多线程相关概念
5.1、进程
是程序的⼀次执⾏,是系统进⾏资源分配和调度的独⽴单位,每⼀个进程都有它⾃⼰的内存空间和系统资源
5.2、线程
在同⼀个进程内⼜可以执⾏多个任务,⽽这每⼀个任务我们就可以看做是⼀个线程
⼀个进程会有1个或多个线程的
5.3、面试题:何为进程和线程?









5.4、管程
Monitor(监视器),也就是我们平时所说的锁
Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。
JVM中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象,
Object o = new Object();
new Thread(() -> {
synchronized (o) {
}
}, "t1").start();Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。

JVM第3版

6、用户线程和守护线程
6.1、Java线程分为用户线程和守护线程,线程的daemon属性为true表示是守护线程,false表示是用户线程
6.2、守护线程
是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程
6.3、用户线程
是系统的工作线程,它会完成这个程序需要完成的业务操作
package com.atguigu.juc.bashthread;
import java.util.concurrent.TimeUnit;
/**
* @auther zzyy
* @create 2021-03-08 15:12
*
* 演示守护线程和用户线程
*/
public class DaemonDemo
{
public static void main(String[] args)
{
Thread a = new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" come in:\t"
+(Thread.currentThread().isDaemon() ? "守护线程":"用户线程"));
while (true)
{
}
}, "a");
a.setDaemon(true);
a.start();
//暂停几秒钟线程
try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName()+"\t"+" ----task is over");
}
}6.4、重点
当程序中所有用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出
如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以当系统只剩下守护进程的时候,java虚拟机会自动退出
设置守护线程,需要在start()方法之前进行
边栏推荐
- InputStream读取文件OutputStream创建文件
- Adjust the array order so that odd numbers precede even numbers (C language)
- flink GROUPING SETS多维度聚合、设置Table state 到期时间
- 纯数据业务的机器打电话进来时回落到了2G/3G
- 9、聊聊ThreadLocal
- ftp服务器:serv-u 的下载及使用
- Error occurred when MySQL imported the database data in pagoda as 0000-00-00 and enum as null
- What is a Gerber file? Introduction to PCB Gerber file
- Problems encountered recently when using nodejs Pinyin package
- 近期使用nodejs pinyin包时遇到的问题
猜你喜欢

解决Splunk kvstore “starting“ 问题

你管这破玩意儿叫 MQ?

Flink physical partition (random partition, polling partition, rescaling partition, broadcast, global partition, custom partition)

flink 物理分区( 随机分区、 轮询分区、重缩放分区、 广播、 全局分区、自定义分区 )

Serveur FTP: téléchargement et utilisation de Serv - U

When the security engineer finds a major vulnerability in the PS host, the CD can execute arbitrary code in the system

Generate statement is not synthesized

(recommended) how many splunks are appropriate? Search head

【LeetCode】494. Objective and (2 wrong questions)

Flink window table valued function
随机推荐
9. Parler de threadlocal
大数相加(C语言)
flink GROUPING SETS多维度聚合、设置Table state 到期时间
数据如何在 Splunk 中老化?
ObjectInputStream读取文件对象ObjectOutputStream写入文件对象
JVM优化
14. Course summary and review
12、AbstractQueuedSynchronizer之AQS
flink 时间语义、水位线(Watermark)、生成水位线、水位线的传递
调整数组顺序使奇数位于偶数前面(C语言)
Let you understand bubble sorting (C language)
反射真的很耗时吗,反射 10 万次,耗时多久。
ftp服务器:serv-u 的下载及使用
14、课程总结与回顾
8. 18 arhat enhancements for atomic operations
微信授权获取手机号码
Notes on brushing questions (13) -- binary tree: traversal of the first, middle and last order (review)
合并两个有序数组(C语言)
Is reflection really time-consuming? How long does it take to reflect 100000 times.
Take you to know about direct insertion sorting (C language)