第八天并发编程篇

news2024/11/17 11:26:29

一、简述线程、进程、程序的基本概念?
1.进程: 我们把运行中的程序叫做进程,每个进程都会占用内存与CPU资源,进程与进程之间互相独立.
2.线程: 线程就是进程中的一个执行单元,负责当前进程中程序的执行。一个进程可以包含多个线程。多线程可以提高程序的并行运行效率。
3.程序:是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

二、创建线程的几种方法
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口

三、线程有什么优缺点?

优点:
1. 在多核CPU中,通过并行计算提高程序性能. 比如一个方法的执行比较耗时,现在把这个方法逻辑拆分,分为若干个线程并发执行,提高程序效率。
2. 可以解决网络等待、io响应导致的耗时问题。
3. 提高CPU的使用率.提高网络资源的利用率

缺点:
1. 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
2. 线程之间对共享资源的访问会造成资源安全问题;
3. 多线程存在上下文切换问题CPU 通过时间片分配算法来循环执行任务,所以本身就会占用cpu资源

四、start 和 run 方法有什么区别?
调用start方法方可启动线程,而run方法只是thread类中的一个普通方法调用,还是在主线程里执行。

五、可以直接调用Thread类的run()方法吗
可以直接调用,但是只是执行了一个普通的run方法而已,并没有真正的启动线程

六、Thread类的 sleep 方法和对象的 wait 方法都可以让线程暂停执行,它们有什么区别?
1、方法归属不同
sleep()方法是属于Thread类中的,而wait()方法,则是属于Object类中的。

2、sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,当指定的时间到了又会自动恢复运行状态。
所以在调用sleep()方法的过程中,线程不会释放对象锁。

3、调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,
只有针对此对象调用notify()方法后该线程才准备获取对象锁进入运行状态。
七、notify 和 notifyAll 有什么区别?
notify方法只能唤醒一个线程,notifyall可以唤醒所有线程,通常与wait()方法搭配使用。

七、sleep、join、yield 方法有什么区别?

1.sleep是暂停当前线程,把cpu的给其他线程使用
2.join是当前线程等待指定的线程执行完成。
如果线程A执行了线程B的join()方法,并且线程B还没有执行完成,线程A将会被阻塞,直到线程B执行完成。
3.yield
thread.yield()  让CPU的时间片,尽量切换其他线程去执行,但不会释放它持有的锁

八、线程的生命周期(状态)
1.新建状态
2.就绪状态
3.阻塞状态
4.等待状态
5.死亡状态

九、Java关键字volatile作用
1、保证变量的可见性
当一个变量被声明为volatile时,它的值会被存储在主内存中,而不是线程的本地内存中。
每次读取该变量时,都会从主内存中读取最新的值
2、防止指令重排序
在多线程并发下,线程之间是通过主内存来共享数据的,
当一个线程修改了某个变量的值时,这个新值会被写入该线程的本地内存,并不会立即写入主内存。
如果没有使用volatile关键字来修饰该变量,其他线程可能无法及时看到这个变量的最新值,从而导致并发问题。
十、为什么代码会重排序?
提高效率
为了提高程序的执行效率,编译器和CPU都可能会对程序进行指令重排序。
指令重排序是指在不改变程序执行结果的前提下,重新安排指令的执行顺序,以提高程序的执行效率。
十一、Java关键字synchronized作用以及原理?

1.Java关键字synchronized是用于实现多线程同步的机制,确保多个线程在访问共享资源时不会产生竞争和冲突,从而避免数据不一致的情况。
其主要原理是基于Java对象的内部锁,即监视器锁(Monitor Lock),确保在同一时刻只有一个线程可以访问被保护的代码块或方法。

2.当一个线程尝试获取被synchronized关键字保护的资源时,
如果该资源已被其他线程占用,该线程就会进入等待状态。
当占用资源的线程释放该资源时,等待队列中的线程会竞争获取该资源,
并且只有一个线程会成功获取到该资源,其他线程继续等待。

3.synchronized关键字保证了可见性和原子性,可见性是通过JVM底层的内存屏障来实现的,原子性则是通过监视器锁的互斥性来实现的。
在synchronized块内,线程获得了锁,它将会清空工作内存,从而使得该线程使用的变量能够从主内存中重新读取,同时也会把工作内存中的变量写回到主内存中。
这样,其他线程就可以读取到最新的值,从而保证了可见性。


十二、请你描述一下怎么使用lock锁的?
Lock lock  = new ReentrantLock();
try{
      lock.lock();
//可能会出现线程安全的操作
  }finally{
    //尽量在finally中释放锁
    
    lock.unlock();
  }
十三、Lock和synchronized区别

1.语法层面:
1.1.synchronized是关键字,源码在jvm中,用c++ 语言实现

1.2.Lock 是接口,源码由jdk 提供,用java语言实现

1.3.使用 synchronized 时,退出同步代码块锁会由jvm自动释放,而使用Lock时,需要手动调用unlock方法释放锁
,否则可能会导致死锁等问题

2.功能层面
相同点:
2.1都可以用来控制多个线程访问共享资源的互斥性。
2.2都支持可重入锁机制,即同一个线程在已经获得锁的情况下能够再次获取该锁。
2.3都支持在发生异常或者代码执行完毕时自动释放锁资源,避免死锁等问题。
不同点:
2.4 Lock 提供了更多的锁机制选择,例如公平锁、非公平锁、可重入锁、读写锁等多种类型;而 synchronized 只有一种类型,即独占锁(排他锁)。
2.5 Lock 应该优先考虑在高并发场景下使用,可以获得更好的性能和灵活性;而 synchronized 关键字则更适合用于简单的线程同步场景,易于使用和维护


十四、线程池的优点
1. 避免创建线程和销毁线程的性能开销
2. 提高响应速度
3. 线程池的线程可以重复使用

十五、什么是死锁?

死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。

十六、线程池的执行流程

 

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

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

相关文章

【电子秤方案】LCD口袋秤芯片方案

LCD高精度口袋电子秤方案,即便携式称重仪,是一种应用于生活中的称重设备。便珠宝秤具有体积小、重量轻、功耗低、结构紧凑等特点。 LCD高精度口袋电子秤方案产品简介 口袋电子秤是一种体积小、重量轻、功耗低,可用于多种场合的电子秤。它通常…

如何检查 Linux 内存使用量是否耗尽?这5个命令堪称绝了!

在 Linux 操作系统中,内存是一个关键资源,用于存储正在运行的程序和操作系统本身的数据。如果系统的内存使用量过高,可能会导致性能下降、应用程序崩溃或者系统崩溃。因此,了解如何检查 Linux 内存使用量是否耗尽是非常重要的。下…

【网络安全】文件上传绕过思路

引言 分享一些文件上传绕过的思路,下文内容多包含实战图片,所以打码会非常严重,可多看文字表达;本文仅用于交流学习, 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人…

什么是划分子网?网络工程师划分子网有啥技巧?

随着互联网的快速发展,越来越多的组织和企业在其内部建立了复杂的网络系统来满足日常的信息传输和资源共享需求。而在这些网络系统中,划分子网(也称为子网划分)作为一种常见的网络管理方法,为组织和企业提供了更加灵活…

【面试】记一次安恒面试及总结

文章目录SQL 注入sql注入的原理?如何通过SQL注入判断对方数据库类型?补充一下其他方法判断数据库类型时间盲注的函数XPath注入抓不到http/https包,怎么办?app无自己的ssl证书app有自己的ssl证书-证书绑定(SSL pinning)逻辑漏洞有哪…

【学习笔记】滑动窗口

acwing.滑动窗口https://www.acwing.com/problem/content/156/ 给定一个大小为 n≤106≤106 的数组。 有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: …

Python使用Opencv进行图像人脸、眼睛识别实例演示

效果展示 下面使用 haarcasecade_eye.xml 进行人眼识别的效果图: 人脸识别是一种可以自动检测图像或视频中存在的人脸的技术。它可以用于各种应用,例如安全控制,自动标记照片和视频,以及人脸识别解锁设备等。在这篇博客中&#…

水声功率放大器模块基于通道接收和发射的水声通信机的应用

实验名称:基于多通道接收和发射的水声通信机 研究方向:水声通信 测试设备:数模转化器、ATA-ML180水声功率放大器模块、示波器、接收换能器、发射换能器等。 图:实验原理 一、发射机的双通道发送实验: 实验过程&#xf…

Redis与本地缓存组合使用(IT枫斗者)

Redis与本地缓存组合使用 前言 我们开发中经常用到Redis作为缓存,将高频数据放在Redis中能够提高业务性能,降低MySQL等关系型数据库压力,甚至一些系统使用Redis进行数据持久化,Redis松散的文档结构非常适合业务系统开发&#xf…

探索六西格玛在医疗行业的应用,提升医疗企业的市场竞争力

六西格玛是一种基于数据的管理方法,旨在通过对医疗流程和服务进行量化分析和改进,以优化医疗企业的运营和管理。它能够有效地解决医疗企业面临的各种问题和挑战,提高医疗服务的质量和效率,降低医疗成本和风险,增强医疗…

Linux: 性能分析之内存增长和泄漏

文章目录1. 前言2. 背景3. 内存增长和泄漏分析方法3.1 跟踪 malloc(), free() 等接口3.1.1 用 perf 采样3.1.2 用 ebpf 来跟踪3.2 跟踪 brk() 调用3.2.1 使用 perf 跟踪 brk()3.2.2 使用 ebpf 跟踪 brk()3.3 跟踪 mmap() 调用3.3.1 使用 perf 跟踪 mmap()3.3.2 使用 ebpf 跟踪 …

【FPGA】多功能ALU

目录 实验要求 源代码 顶层模块 数据输入模块 ALU运算模块 结果处理模块 扫描数码管模块 扫描数码管顶层 分频器 数码管显示 仿真代码 结构层图 管脚配置 实验板卡:xc7a100tlc sg324-2L,共20个开关 实验要求 通过高低位控制,实现32位数…

74-快速排序——一路快排

快速排序是影响二十世纪最伟大的排序算法之一。 JDK的双轴快速排序就是对快排的优化,本质还是快排。 从待排序区间选择一个数,作为基准值/分区点(pivot),此时默认选择数组的第一个元素作为比较的基准值。partition&a…

【 SpringBoot 配置⽂件 】

文章目录一、配置⽂件作⽤二、配置文件格式2.1 特殊说明2.2 为配置⽂件安装提示插件三、properties 配置⽂件说明3.1 properties 基本语法3.2 读取配置⽂件3.3 解决 properties 中文乱码3.4 properties 缺点分析四、yml 配置⽂件说明4.1 yml 基本语法4.2 yml 配置读取4.3 yml 使…

前后端分离——SpringBoot+Vue——3天速成企业级项目

前后端分离——SpringBootVue使用到的技术:vue3(区别vue2)前言vue2 vs vue3双向绑定更新实例化生命周期获取props数据和方法的定义watchEffect那么什么是 watchEffect ?组件通信注意attrs和listeners路由vue3路由写法:…

ROS学习——艰辛的环境安装之路一VMware

文章目录VMware 安装下载安装VMware 安装 一些没用的介绍: VMware Workstation中文版是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比,VMWare 采用了完全不同的概念。多启动系统在一…

《Web前端应用开发》考试试卷(模拟题)

一、产品搜索页面 打开“考试文件夹”中的input.html,完成以下步骤: 注意:本题仅能在input.html的(1)为产品名称所在的div添加样式属性,使得产品名称保持在文本框的左边; (2&#xf…

PPT NO.1【用ppt如何做一张海报+字体】

PPT做得好的人,一定是站在观众的角度思考的人。 1、设置幻灯片尺寸大小: 设置完成后如下: 2、加载一张自己喜欢的图片进来:【图片越高清越好】 将图片铺满空白的地方,调整好自己喜欢的区域: 做裁剪&#xf…

数据结构修炼第一篇:时间复杂度和空间复杂度

系列文章目录 第一章 时间复杂度和空间复杂度 第二章 顺序表,列表 第三章 栈和队列 第四章 二叉树 第五章 排序 目录 系列文章目录 🏆文章目录 🏆前言 🏆一、算法的复杂度 🏆二、时间复杂度的概念 大0渐进 作…

【Go语言从入门到精通系列-基础篇】Go安装 + 语言特性,以及开启你人生中的第一个go程序

系列文章 【Go语言从入门到精通系列-基础篇】Go安装 语言特性,以及开启你人生中的第一个go程序 【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。 Go语言从入门到精通系列-基础篇系列文章前言第一章 Go语言开发基础1.1 Go语言的优势1.2 Go语…