【java面试】多线程

并发和并行有什么区别?

并发强调的是同一时间间隔,并行强调的是同一时间发生。并发指的是同一台处理器在同一时间间隔下处理多个程序。而并行则是多个处理器同一时间处理多个程序

线程和进程有什么区别呢?

1.进程是运行中的一段程序。而进程中的执行的每个任务都可以作为一个线程。
2.进程拥有独立的内存单元。而线程共享内存资源。
3.线程的开销比进程的开销要小。
4.影响力不同,子进程无法影响父进程。但是子线程可以影响父线程。

创建线程有哪几种方式

继承 Thread 类创建线程类,调用线程对象的 start() 方法来启动该线程。
通过 Runnable 接口创建线程类。
通过 Callable 和 Future 创建线程,

线程安全的解决方案?

• 数据不共享,单线程可见,比如 ThreadLocal 就是单线程可见的;
• 使用线程安全类,比如 StringBuffer 和 JUC(java.util.concurrent)下的安全类
• 使用同步代码或者锁。

守护线程是什么

守护线程(即 daemon thread),是个服务线程,准确地来说就是服务其他的线程。

线程有哪些状态???

新建,就绪,运行,阻塞,死亡。
新建:在生成线程对象,还没有调用该对象的 start 方法,这是属于创建状态
就绪:有资格分到 cpu 但还没有轮到
运行:分到 cpu,能真正执行线程内代码
阻塞:没资格分到 cpu 时间的
死亡:一个线程的 run 方法结束或者调用 stop 方法后,该线程就会死亡

导致线程阻塞的方法

sleep,suspend,wait 都可以使线程进入阻塞状态
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。

wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

当前线程调用 suspend() 后后立即挂起,线程状态还是 RUNNABLE, 不会释放锁资源,这就会很容导致死锁(这也是弃用它的原因);

请描述一下线程池?

简单来说就是创建一些线程放入一个池子中,来任务了有空闲线程就分配线程,如果没有的话任
务进入队列进行等待其它任务使用后释放线程,如果队列满了的话我们就在创建一个线程,如果
创建这个线程大于最大线程数限制那么就会触发拒绝策略!(这个过程体现复用的原理)

线程池的优点

  • 线程池可以实现少量线程复用执行大量任务,提高线程的利用率
  • 不用重复的创建销毁,提高程序的响应速度
  • 放在同一个池子中,方便统一管理
  • 可以控制最大并发数

线程池的参数

(1)corePoolSize:线程池中常驻核心线程数

(2)maximumPoolSize:线程池能够容纳同时执行的最大线程数

(3)keepAliveTime:多余的空闲线程存活时间

(4)unit:keepAliveTime的时间单位

(5)workQueue:任务队列,被提交但尚未执行的任务

(6)threadFactory:表示生成线程池中的工作线程的线程工厂

(7)handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何拒绝

谈一下悲观锁和乐观锁的区别

悲观锁的代表分别是 synchronized 和 Lock 锁
核心思想是线程占了锁才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程需要停下来等待线程从运行到阻塞,再从阻塞到唤醒涉及到上下文切换影响性能。实际上,线程在获取synchronized 锁和 Lock 锁时,如果锁已被占用,都会做几次重试操作,减少阻塞机会。

乐观锁的代表时 AtomicInteger,使用 cas 来保证原子性核心思想是无需加锁,每次只有一个线程能修改共享变量,其它失败线程不需要停止,不断重试直至成功。由于线程一直运行,不需要阻塞因此不涉及到线程的上下文切换但是它需要多核 cpu 的支持且线程数不应超过 cpu 核数。

lock 与 synchronized 的区别

语法不同:synchronized 是关键字,源码在 jvm 中,用 c++ 实现。Lock 是接口,源码由 jdk 提供,用 java 语言实现。使用 synchronized,退出同步代码块会自动释放,而使用 Lock 则需要手动调用 unlock 方法释放
功能方面: 两者都属于悲观锁,都具备基本的互斥,同步,锁重入功能。Lock 提供了许多 synchronized 不具备的功能,例如获取等待状态,公平锁等等。
性能方面:在没有竞争的时候,synchronized 提供了很多优化比如偏向锁,轻量锁,性能不赖。在竞争激烈时,Lock 的实行通常会提供更好的性能

请描述一下 cas(cas 是一个什么样的同步机制)

CAS 即 compare and swap ,直译就是比较并交换。当要对变量进行修改时,先会将内存位置的值与预期的变量原值进行比较,如果一致则将内存位置更新为新值,否则不做操作,无论哪种情况都会返回内存位置当前的值!

compareAndSwap(V,A,B):(注意:三个参数也是个考点)
CAS 包含了三个参数:内存值 V,旧的预期值 A,要更新的值 B。当且仅当内存值 V 等于旧的预期值 A 时,才会将内存值 V 修改为新值 B,否则什么都不干;

cas 存在的缺陷

1.循环时间长,开销大:如果 cas 操作失败的话则要循环进行 cas 操作,如果长时间不成功的话则会造成 cpu 极大的开销。

2.只能保证一个共享变量的原子操作

3.ABA 问题:CAS 在检查值的时候,只会比较预期值 A 与内存位置的值是否相同,如果内存位置值经过若干次修改又变回了 A (A -> B -> A),CAS 检查依旧会通过,但是实际上这个值已经修改过了。

解决方案:解决的思路就是引入类似乐观锁的版本号控制,不止比较预期值和内存位置的值,还要比较版本号是否正确。

synchronized用法

  • 修饰代码块
  • 修饰方法

Reentrantlock

ReentrantLock 基于 AQS,在并发编程中它可以实现公平锁和非公平锁来对共享资源进行同步。Sync可以说是 ReentrantLock 的亲儿子,它寄托了全村的希望,完美的继承了 AbstractQueuedSynchronizer,是 ReentrantLock 的核心,后面的 NonfairSync 与 FairSync 都是基于 Sync 扩展出来的子类, 亦即通过二者实现了公平锁和非公平锁。new ReentrantLock() 默认创建的为非公平锁,如果要创建公平锁可以使用 new ReentrantLock(true)。

Reentrantlock 有哪些优势

  • ReentrantLock 具备非阻塞方式获取锁的特性,使用 tryLock() 方法。
  • 可以中断获得的锁,使用 lockInterruptibly() 方法当获取锁之后,如果所在的线程被中断,则会抛出异常并释放当前获得的锁(lock() 和 lockInterruptibly() 的区别在于获取线程的途中如果所在的线程中断,lock() 会忽略异常继续等待获取线程,而 lockInterruptibly() 则会抛出InterruptedException 异常)。
  • ReentrantLock 可以在指定时间范围内获取锁,使用 tryLock(long timeout,TimeUnit unit) 方法

synchronized 和 ReentrantLock 有什么区别?

•ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;
•ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等;
•ReentrantLock 性能略高于 synchronized。

AQS

AQS 是一个抽象类,它定义了一套多线程访问共享资源的同步器框架。通俗解释,AQS 就像是一个队列管理员,当多线程操作时,对这些线程进行排队管理。

AQS 主要通过维护了两个变量来实现同步机制的

  • state
    AQS 使用一个 volatile 修饰的私有变量来表示同步状态,当 state=0 表示释放了锁,当 state>0 表示获得锁
  • FIFO 同步队列
    AQS 通过内置的 FIFO 同步队列,来实现线程的排队工作。如果线程获取当前同步状态失败,AQS会将当前线程的信息封装成一个 Node 节点,加入同步队列中,并且阻塞该线程,当同步状态释放,则会将队列中的线程唤醒,重新尝试获取同步状态。

公平锁和非公平锁

公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,最前面的线程总是最先获取到锁。
非公平锁:每个线程获取锁的顺序是随机的,并不会遵循先来先得的规则,所有线程会竞争获取锁。

自旋锁,非自旋锁

自旋锁: 是指当一个线程在获取锁失败时将一直循环等待,不断重新获取锁,直到获取到锁才会退出循环, 自旋锁会让线程一直处于用户态, 不会发生上下文切换

非自旋锁: 获取锁失败会进入阻塞状态, 从而进入内核态

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

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

相关文章

音视频开发—MediaCodec 解码H264/H265码流视频

使用MediaCodec目的 MediaCodec是Android底层多媒体框架的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,可以编码H264、H265、AAC、3gp等常见的音视频格式 MediaCodec工作原理是处理输入数据以产生输出数据 MediaCodec工作流程 Med…

SpringBoot整合Flink(施耐德PLC物联网信息采集)

SpringBoot整合Flink(施耐德PLC物联网信息采集)Linux环境安装kafka前情:施耐德PLC设备(TM200C16R)设置好信息采集程序,连接局域网,SpringBoot订阅MQTT主题,消息转至kafka&#xff0c…

计算机网络体系结构——“计算机网络”

各位CSDN的uu们你们好呀,今天小雅兰来学习一个全新的知识点,就是计算机网络啦,下面,开始虚心学习。 计算机网络的概念 计算机网络的功能 计算机网络的组成 计算机网络的分类 标准化工作 计算机网络的性能 计算机网络的概念 …

Hadoop集群环境配置搭建

一、简单介绍 Hadoop最早诞生于Cutting于1998年左右开发的一个全文文本搜索引擎 Lucene,这个搜索引擎在2001年成为Apache基金会的一个子项目,也是 ElasticSearch等重要搜索引擎的底层基础。 项目官方:https://hadoop.apache.org/ 二、Linux环…

SpringBoot 结合RabbitMQ与Redis实现商品的并发下单【SpringBoot系列12】

SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 1 项目准备 SpringBoot 整合 RabbitMQ 消息队…

【前端八股文】浏览器系列:性能优化——HTML、CSS、JS、渲染优化

文章目录HTMLCSSCSS加载会造成阻塞吗JavaScript渲染优化参考本系列目录:【前端八股文】目录总结 是以《代码随想录》八股文为主的笔记。详情参考在文末。 代码随想录的博客_CSDN博客-leecode题解,ACM题目讲解,代码随想录领域博主 性能优化,从以下几个方…

【C++】STL容器、算法的简单认识

几种模板首先认识一下函数模板、类模板、栈模板。函数模板函数模板就是一个模型&#xff0c;而模板函数是函数模板经过类型实例化的函数。如下template<class T>是一个简单的函数模板&#xff1a;template<class T> T Max(T a, T b) {return a > b ? a : b; } …

Joomla未授权访问漏洞CVE-2023-23752

1、前言Joomla是一套全球知名的内容管理系统&#xff08;CMS&#xff09;&#xff0c;其使用PHP语言加上MySQL数据库所开发&#xff0c;可以在Linux、Windows、MacOSX等各种不同的平台上运行。2月16日&#xff0c;Joomla官方发布安全公告&#xff0c;修复了Joomla! CMS中的一个…

cjson文件格式介绍

cjson是一种轻量级的JSON解析库&#xff0c;它支持将JSON格式的数据转换为C语言中的数据结构&#xff0c;同时也支持将C语言中的数据结构转换为JSON格式的数据。cjson的文件格式是指在使用cjson库时&#xff0c;将JSON格式的数据存储在文件中&#xff0c;然后通过cjson库读取文…

C++ 学习笔记(十)(继承、抽象篇)

前言&#xff1a;主要是自己学习过程的积累笔记&#xff0c;所以跳跃性比较强&#xff0c;建议先自学后拿来作为复习用。 文章目录1 定义父类和子类1.1 定义父类访问说明符 protected1.2 定义子类1.3 子类向父类的转换1.4 转换的例外1.5 子类的构造函数1.6 静态成员不能继承1.7…

clip精读

开头部分 1. 要点一 从文章题目来看-目的是&#xff1a;使用文本监督得到一个可以迁移的 视觉系统 2.要点二 之前是 fix-ed 的class 有诸多局限性&#xff0c;所以现在用大量不是精细标注的数据来学将更好&#xff0c;利用的语言多样性。——这个方法在 nlp其实广泛的存在&…

2023年ACM竞赛班 2023.3.20题解

目录 瞎编乱造第一题 瞎编乱造第二题 瞎编乱造第三题 瞎编乱造第四题 瞎编乱造第五题 不是很想编了但还是得编的第六题 不是很想编了但还是得编的第七题 还差三道题就编完了的第八题 还差两道题就编完了的第九题 太好啦终于编完了 为啥一周六天早八阿 瞎编乱造第一题…

【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)

MATLAB求解一维线性函数问题前言正文函数实现可视化处理可视化结果前言 一维线性函数&#xff0c;也称为一次函数&#xff0c;是指只有一个自变量xxx的函数&#xff0c;且函数表达式可以写成yaxbyaxbyaxb的形式&#xff0c;其中aaa和bbb是常数。具体来说&#xff0c;aaa称为斜…

typedef uint8_t u8;(stm32数据类型)

在stm32单片机的库文件里有这么一段u8和u16的定义 typedef uint8_t u8; typedef uint16_t u16&#xff1b; 而uint8_t和uint16_t的定义是这样的 typedef unsigned char uint8_t; typedef unsigned short int uint16_t; 意味着u8就是就是指代的unsigned char …

linux简单入门

目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff0…

【Nginx二】——Nginx常用命令 配置文件

Nginx常用命令 配置文件常用命令启动和重启 Nginx配置文件maineventshttp常用命令 安装完成nginx后&#xff0c;输入 nginx -&#xff1f;查询nginx命令行参数 nginx version: nginx/1.22.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix][-e filename] [-c filename] [-…

[数据结构]直接插入排序、希尔排序

文章目录排序的概念和运用排序的概念排序运用常见的排序算法常见的排序算法直接插入排序希尔排序性能对比排序的概念和运用 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操…

FastApi快速构建一个web项目

FastApi快速构建一个web项目 已经使用FastApi很久了。这个一个非常优秀的框架。和flask一样能够快速构建一个web服务。开发效率非常之高。今天我一个Demo来介绍一下这个框架的使用。供大家学习参考。 项目介绍 本项目主要介绍fastapi快速编写web服务&#xff0c;通过案例分别…

贪心算法(一)

一、概念 贪心算法的核心思想是&#xff0c;在处理一个大问题时&#xff0c;划分为多个局部并在每个局部选择最优解&#xff0c;并且认为在每个局部选择最优解&#xff0c;那么最后全局的问题得到的就是最优解。 贪心算法可以解决一些问题&#xff0c;但是不适用于所有问题&a…

音乐制作:Ableton Live 11 Suite Mac

Ableton Live 11 Suite Mac是一款非常专业的音乐制作软件&#xff0c;Live 是用于音乐创作和表演的快速、流畅和灵活的软件。它带有效果、乐器、声音和各种创意功能;制作任何类型的音乐所需的一切。以传统的线性排列方式进行创作&#xff0c;或者在 Live 的 Session 视图中不受…
最新文章