【JUC】不可不知的Java多线程的基础概念

Java多线程的相关概念

并发和并行有什么区别?

进程、线程和管程有什么区别?

......

不知道有没有面试的小伙伴被问到这些问题,我前不久参加的一个面试就恰好问到了这些,今天这篇文章,我们就介绍下一些Java多线程的基础概念。

并发 concurrent

  • 同一实体上的多个事件
  • 同一台机器上交替处理多个任务
  • 同一时刻,只有一个事件在发生

并行 parallel

  • 不同实体上的多个事件
  • 是在多个处理器上同时处理多个任务
  • 同一时刻,真的有多个事情在发生

并发 vs. 并行

并发和并行的主要区别在于:并发任务在不同的时间点上交替执行,而并行任务在同一时间点上同时执行;并发是通过在不同时间点上共享资源来处理多个任务来提升效率的,而并行则是通过利用多个资源(如多个 CPU 核心)同时处理任务来提升效率的。

进程

在系统中运行一个应用程序就是一个进程,每一个进程都有自己的内存空间和系统资源,所以进程是CPU进行资源分配的最小单位

线程

也称轻量级进程,一个进程中会有一个或者多个线程,是CPU调度的最小单位

管程

Monitor(监视器),是一种同步机制,也就是我们平时所说的"锁",他的任务是确保同一时间只有一个线程可以访问被保护的数据和代码。JVM紫红的同步是基于进入和退出Monitor来实现的,每个对象都会有一个Monitor对象(会和Java对象一起创建和销毁,底层由C++实现的)。

JVM虚拟机支持方法级别 以及方法内部一段指令序列的同步(都是通过管程即Monitor实现的),方法级的同步是隐式的(无需字节码指令控制),是在方法的调用和返回操作中,虚拟机可以从方法常量池中的方法表结构中是否有"ACC_SYNCHRONIZED"这个访问标志来判断该方法是否被声明为同步方法。在调用方法时,会先判断是否设置了"ACC_SYNCHRONIZED"访问标志,如果设置了,就要求执行线程先成功持有管程,然后才能执行方法,最后的在方法完成时释放管程(无论方法执行成功与否,如果方法抛出了异常,也会在异常抛到同步方法边界之外时自动释放)。

而对于一段指令集序列的同步通常是Java中的synchronized语句块来表示(monitorentermonitorexit),实现synchronized关键字需要Java编译器和Java虚拟机两者共同协作支持。

用户线程和守护线程

一般不做特殊说明配置,默认都是用户线程

用户线程 User Thread

系统的工作线程,完成某个程序需要完成的业务操作

守护线程 Daemon Thread

  • 是一种特殊的线程,是为其他线程服务的,在后台默默地完成一些系统性的服务(比如垃圾回收)
  • 守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了,所以当系统只剩下守护线程的时候,Java虚拟机就会自动退出

线程的daemon属性

源码解读

  • 返回true表示守护线程
  • 返回false表示用户线程

总结

  • 如果用户线程全部结束,就意味着程序需要完成的业务操作已经结束了,守护线程随着JVM一同结束工作。

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

相关推荐
virus59457 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
计算机毕设VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
没差c8 小时前
springboot集成flyway
java·spring boot·后端
三水不滴8 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
时艰.9 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
编程彩机9 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
笨蛋不要掉眼泪9 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
Yvonne爱编码9 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
像少年啦飞驰点、10 小时前
零基础入门 Spring Boot:从“Hello World”到可上线微服务的完整学习指南
java·spring boot·微服务·编程入门·后端开发
眼眸流转11 小时前
Java代码变更影响分析(一)
java·开发语言