Java并发(1)--线程,进程,以及缓存

线程和进程是什么?

进程

进程是程序的一次执行过程,系统程序的基本单位。有自己的main方法,并且主要由主方法运行起来的基本上就是进程。

线程

线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

线程的状态

新建,就绪,运行,等待,阻塞,死亡。

当两个线程分别thread.start()时,只是将线程变成了就绪态,不是运行态,所以运行的顺序,还不一定。

线程与进程的关系,区别及优缺点?

图解关系

下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。

图片来自JavaGuide

Java 运行时数据区域(JDK1.8 之后)

从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的方法区 (JDK1.8 之后的元空间)*资源,但是每个线程有自己的*程序计数器虚拟机栈本地方法栈

一句话简单了解堆和方法区

堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (几乎所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

总结

线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。

高速缓存存在的意义?多级缓存的作用?

高速缓存

结论:支持了多核CPU的发展

相当于在CPU 内部再开辟了一个区域,用于连接CPU中的核心和内存。也就是原先是CPU和内存交互,这样占据总线,其他核心就不能再次与内存进行交互。有了高速缓存之后,核心可以与高速缓存交互,然后高速缓存和内存交互,(相当于把高速缓存变成单核,整体速度提升),这样释放总线,不会有被占用的情况。

如果需要对一个变量累加50次,但是不一定高速缓存全加完才更新返回到内存区,实际是可能是累加两次就返回,之后再进入高速缓存区进行累加,所以更新多少次进行返回是不确定的

如果变量或数据更新完毕,那么传入内存后,高速缓存中的数据就会消失。

在高速缓存中,进程的切换与时间片有关,如果数据处理量很大的话,多线程可能会发生覆盖的问题,例如两个线程都给a累加5000次,那么a的极端情况可能会是2,可能导致线程1和线程2的累加操作互相覆盖,第一个线程刚累加第一次,a变成2,然后进程切换,返回给内存,a又变成1。如果数据量很小的话,时间片够,那就不会进行切换。

多级缓存

相当于50个人接力 打水。站在一起,把水传递给下一个人。让传递速度加快,效率更高。

并发与并行的区别

  • 并发:两个及两个以上的作业在同一 时间段 彼此互相干扰 内执行。

  • 并行:两个及两个以上的作业在同一 时刻 互不干扰的执行。

最关键的点是:是否是 同时 执行,和是否互相干扰。

如果能同时执行,那证明一定是互不干扰的。在同一时间段内,细分时间,一个时间内不能两个作业同时进行,那么证明一定是互相干扰的。

同步和异步的区别

  • 同步:发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。

  • 异步:调用在发出之后,不用等待返回结果,该调用直接返回。

例如:a调用一个资源,但是资源被其他作业占用,那么我需要一直等着就是同步,调用完我继续做我自己的事,不傻等着就是异步。

为什么要使用多线程?

先从总体上来说:

  • 从计算机底层来说: 线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。

  • 从当代互联网发展趋势来说: 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。

再深入到计算机底层来探讨:

  • 单核时代:在单核时代多线程主要是为了提高单进程利用 CPU 和 IO 系统的效率。 假设只运行了一个 Java 进程的情况,当我们请求 IO 的时候,如果 Java 进程中只有一个线程,此线程被 IO 阻塞则整个进程被阻塞。CPU 和 IO 设备只有一个在运行,那么可以简单地说系统整体效率只有 50%。当使用多线程的时候,一个线程被 IO 阻塞,其他线程还可以继续使用 CPU。从而提高了 Java 进程利用系统资源的整体效率。

  • 多核时代: 多核时代多线程主要是为了提高进程利用多核 CPU 的能力。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,不论系统有几个 CPU 核心,都只会有一个 CPU 核心被利用到。而创建多个线程,这些线程可以被映射到底层多个 CPU 上执行,在任务中的多个线程没有资源竞争的情况下,任务执行的效率会有显著性的提高,约等于(单核时执行时间/CPU 核心数)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net textbox滚动显示到最后一行

调用: Private Sub TextBox18_TextChanged(sender As Object, e As System.EventArgs) Handles TextBox18.TextChanged show_textbox_endline(TextBox18) End Sub 函数: 显示textbox最后一行 Public Sub show_textbox_endline(Tbx As TextB…

MVCC(解决MySql中的并发事务的隔离性)

MVCC 如何保证事务的隔离性? 1.排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取改行的其他锁。 2.MVCC:多版本并发控制。 MVCC: 1.隐藏字段 1.DB_TRX_ID:最近修改事务的id。默认值从0开…

Selenium自动填写验证码(偏小白版本OCR)

OCR基础示例 我直接 上代码 from PIL import Image import pytesseract# 0 Orientation and script detection (OSD) only. # 1 Automatic page segmentation with OSD. # 2 Automatic page segmentation, but no OSD, or OCR. # 3 Fully automatic page segmentation, but n…

【MYSQL】索引机制概述

由于MySQL是作为存储层部署在业务系统的最后端,所有的业务数据最终都要入库落盘,但随着一个项目在线上运行的时间越来越久,数据库中的数据量自然会越来越多,而数据体积出现增长后,当需要从表查询一些数据时&#xff0c…

symfony框架

Symfony框架是一种流行的PHP框架,用于快速开发高质量的Web应用程序。它是一个开源框架,遵循MVC(模型-视图-控制器)设计模式,提供了一套强大的工具和组件,帮助开发人员更轻松地构建复杂的Web应用程序。 Sym…

Apache Storm的详细配置

Apache Storm的详细配置主要涉及以下几个方面: Zookeeper配置:Apache Storm使用Zookeeper来进行协调和配置管理。你需要配置Zookeeper集群的连接信息,包括Zookeeper服务器的主机和端口。 Storm Nimbus配置:Nimbus是Storm的主节点,负责分配任务给各个工作节点。你需要配置N…

javaScript设计模式之简单工厂模式

简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。 场景一 假设我们需要计算圆形和矩形的面积 function Circle(radius) {this.radius radius;}Circle.prototype.getArea function() {re…

C++猫和老鼠有多重(友元函数初步)

定义猫和老鼠&#xff1a;Cat与Mouse两个类&#xff0c;二者都有weight属性&#xff0c;定义二者的一个友元函数totalweight()&#xff0c;计算二者的重量和。 裁判测试程序样例&#xff1a; #include <iostream> using namespace std;/* 请在这里填写答案 */int main(…

第六周学习笔记DAY.4-方法与方法重载

如何创建和使用对象 创建对象 类名 对象名 new 类名(); 引用对象成员&#xff1a;使用“.”进行以下操作 引用类的属性&#xff1a;对象名.属性 用类的方法&#xff1a;对象名.方法名() 学完本次课程后&#xff0c;要求能够&#xff1a; 方法的参数传递 会使用构造方法…

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb &#xff0c;双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错&#xff0c;执行其他命令也报错。 安装环境&#xff1a;ubuntu18.04 dpkg: 处理软件包 code-insiders (…

火绒安全软件:程序员的网络守护天使

目录 前言 系统防护 网络防护 隐私保护 高级设置 软件安全 响应速度 持续更新 总结 前言 在这个充满机遇与挑战的数字时代&#xff0c;程序员们如同探险家&#xff0c;不断探索着代码的新大陆。然而&#xff0c;网络世界也充斥着各种未知的风险和威胁。火绒安全软件&a…

riscv-gnu-toolchain 交叉编译器如何构建?

安装依赖工具 sudo apt-get install git autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf patchutils bc libexpat-dev libglib2.0-dev ninja-build zlib1g-dev pkg-config libboost-all-dev…

基于java+springboot+vue实现的药品管理系统(文末源码+Lw)23-297

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;药品信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

Linux命令-dpkg-query命令(Debian Linux中软件包的查询工具)

说明 dpkg-query命令 是Debian Linux中软件包的查询工具&#xff0c;它从dpkg软件包数据库中查询并辨识软件包的信息。 语法 dpkg-query(选项)(参数)选项 -l&#xff1a;列出符合匹配模式的软件包&#xff1b; -s&#xff1a;查询软件包的状态信息&#xff1b; -L&#xff1…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用本文为 llama-factory SFT系列教程的第二篇&#xff1b; 支持的模型列表 模型名模型…

Composer安装与配置

Composer&#xff0c;作为PHP的依赖管理工具&#xff0c;极大地简化了PHP项目中第三方库的安装、更新与管理过程。本文将详细介绍Composer的安装步骤、基本配置方法&#xff0c;以及一些实用的操作示例&#xff0c;帮助读者快速上手并熟练运用Composer。 一、Composer安装 环…

C++内存分布

C代码编译过程 预处理 宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法编译检查语法&#xff0c;将预处理后文件编译生成汇编文件汇编将汇编文件生成目标文件(二进制文件)链接将目标文件链接为可执行程序 进程的内存分布 程序运行起来(没有结束前)就是一个…

mysql开启慢日志mysqld: File ‘xxx‘ not found (Errcode: 13 - Permission denied)

问题描述: mysql版本:5.74 开启mysql慢日志 一直报错 慢日志文件手动创建 并把慢日志文件权限给mysql:mysql 还是不行,于是找方案,找了几个都不行,后来发现是系统安全设置 解决方案 前提是日志文件存在且授权给用户mysql以及组mysql 具体如何关闭selinux&#xff1a; v…

CSS单位选择的艺术:何时何地选用何种单位

CSS单位作为网页样式设计的基石&#xff0c;直接影响着元素尺寸、间距、字体大小等视觉呈现。选择合适的单位对于构建响应式、跨设备兼容且易于维护的界面至关重要。本文将深入分析各类CSS单位&#xff0c;并探讨在不同场景下应选用何种单位&#xff0c;同时揭示各单元的优缺点…