第八天并发编程篇

一、简述线程、进程、程序的基本概念?
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. 线程池的线程可以重复使用

十五、什么是死锁?

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

十六、线程池的执行流程

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab在线IDE:计算定积分上限

上一篇文章:Matlab在线IDE:MATLAB Online介绍与计算定积分案例 1、案例介绍 % 定义符号变量 x syms x;% 定义函数 f(x) x f x;% 定义定积分的值 I I 2;% 计算函数 f(x) 在 [0, x] 区间的定积分,并求其反函数 F(x) F finverse(int(f, 0, …

【hello Linux】Linux软件管理器yum

目录 1.Linux软件管理器yum 1.1 关于lrzsz 1.2 使用yum时的注意事项 1.3 查看软件包:yum list 1.4 安装软件:yum install 1.5 卸载软件:yum remove 1.6 更新yum源 1.7 实战项目 Linux🌷 1.Linux软件管理器yum 在windows系统下有应…

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

文章目录Ubuntu安装和下载页面设置安装Vmware Tools安装VSCODE用几个常用命令简单熟悉下UbuntuUbuntu 安装和下载 Ubuntu的安装和下载 看这个链接 Ubuntu安装和下载1 或者这个链接 Ubuntu安装和下载2 页面设置 安装Vmware Tools 看这个链接 VMware Tools的介绍和安装 安装…

超详细从入门到精通,pytest自动化测试框架实战-pytest插件的开发(八)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 pytest框架采用的是…

3年测试经验只会“点点点”,不会自动化即将面临公司淘汰?沉淀100天继续做测试

前段时间一个朋友跟我吐槽,说自己做软件测试工作已经3年了,可这三年自己的能力并没有得到提升,反而随着互联网的发展,自己只会“点点点”的技能即将被淘汰。说自己很苦恼了,想要提升一下自己,可不知道该如何…

简单的做一个学校毕业啊项目

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

每日一练——Day 13

前言: 小亭子正在努力的学习编程,接下来将开启编程题的练习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 第一题 题目描述: 刷…

SpringBoot基础学习之(十二):通过spring boot框架连接MySql数据库(通过idea中的工具Database连接Mysql数据库)

Springboot这个系列实现的案例:员工后台管理系统 之前讲解的内容是前后端的交互,并没有涉及到数据库。把员工信息放置在一个数组中,实现的方法则是对数组的增删改查操作,但是从今天开始,实现的功能则是在数据库的基础上…

Qt Quick - ToolTip

Qt Quick - ToolTip使用总结一、概述二、附带的ToolTip三、延迟和超时四、自定义ToolTip五、定制化一、概述 ToolTip 其实就是ToolTip,所谓ToolTip其实就是一段简短的文本,告知用户控件的功能。它通常置于父控件之上或之下。提示文本可以是任何富文本格…

为什么程序员都喜欢开源的软件?

先来感受一下开源与闭源: 当你觉得这个软件有一个缺点影响使用的时候 如果是闭源软件,你如果不想自己模仿着写一个,就只能考虑顺着网线到开发者脖子上逼着他加 但开源软件你可以自己在他的基础上改一改,你改好了还拿回馈回去让…

动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf

目录 第七章 视图技术Thymeleaf 前言 7.1 表达式 7.2 if-for 第七章 视图技术Thymeleaf 前言 Thymeleaf 是一个表现层的模板引擎, 一般被使用在 Web 环境中,它可以处理 HTML, XML、 JS 等文档,简单来说,它可以将 JSP 作…

将Mircrosoft Store下载的Ubuntu安装到指定位置方法,同时解决“你需要来自System的权限才能对此文件进行更改”问题

一、概述 最近使用到WIndows的WSL功能,需要安装ubuntu这个子系统进行仿真环境搭建,但是又不愿意使用虚拟机,不太方便。在安装过程中发现本身就岌岌可危的C盘经常突然爆满,经过检查发现是安装ubuntu位置的问题。但是在系统更改存储…

网络安全从业人员应该如何提升自身的web渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话,是非常烧脑的。 理清 web 渗透学习思路,把自己的学习方案和需要学习的点全部整理,你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词,叫 35 岁危机,&am…

利用多专家模型解决长尾识别任务

来源:投稿 作者:TransforMe 编辑:学姐 贡献 提出了RoutIng Diverse Experts(RIDE),不仅可以减少所有类别的variance,并且还可以减少尾部类的bias。同时提升了头部和尾部的性能。 思路 目前存…

nuxt.js 在IE浏览器||其他浏览不识别document/window 情况处理

1 第一步注册到nuxt.config.js文件 2 第二步建立js 文件 import Vue from vue (function(){ if(process.client){ console.log(process.client) }else{ console.log(process.client) } if (!!window.ActiveXObject || "ActiveXObject" i…

Stable Diffusion:一种新型的深度学习AIGC模型

潜在扩散模型 | AIGC| Diffusion Model 图片感知压缩 | GAN | Stable Diffusion 随着生成型AI技术的能力提升,越来越多的注意力放在了通过AI模型提升研发效率上。业内比较火的AI模型有很多,比如画图神器Midjourney、用途多样的Stable Diffusion&#…

国货之光!打工人必装的8个软件,你都用过没?|办公|效率|创作

给大家分享8款非常强大,但知名度不高的国产软件,每一个都堪称精品,喜欢的话记得点赞和关注哦~ 第一款是 火绒安全软件 火绒安全软件没有任何,具有推广性质的弹窗、没有捆绑打扰用户的行为;占用资源极少,&a…

腾讯空降测试工程师,绩效次次拿S,真是砂纸擦屁股,给我露了一手啊

​上周我们公司的绩效面谈全部结束了,每年到这个时间点就是打绩效的时候了,对于职场打工人来说绩效绝对是最重要的事情之一,原因也很简单:奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉&#xff1…

Python 操作 MongoDB 详解

嗨害大家好鸭!我是芝士❤ 一、前言 MongoDB属于 NoSQL(非关系型数据库), 是一个基于分布式文件存储的开源数据库系统。 二、操作 MongoDB 1. 安装 pymongo python 使用第三方库来连接操作 MongoDB, 所以我们首先安…

Redis的SDS、intSet、Dict、ZipList、QuickList、RedisObject及五种数据结构详解

动态字符串 我们都知道Redis中保存的key是字符串,value 往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 1.获取字符串长度需要进行计算 2.…