当前位置: 首页 > news >正文

Java实习生------JUC并发编程(多线程)10道面试题打卡⭐⭐⭐

目录

并行和并发有什么区别?

线程和进程有什么区别?

创建线程有哪几种方式?

runnable和callable有什么区别?

线程的状态及转换?

sleep()和wait()的区别?

run()和start()有什么区别? 

在Java程序中怎么保证多线程的运行安全?

什么是悲观锁?

什么是乐观锁?常见的两种实现方式?有什么缺点?


无泪的憋屈缝成了一张隐形披风偶而还能抵挡酷寒,无用的大喊苦苦等到的回声只是力气放尽的绝望🌹

话不多说,发车!

并行和并发有什么区别?

  • 并行是指两个或多个事件在同一时刻发生,在不同的实体上
  • 并发是指两个或多个事件在同一时间间隔发生,在同一个实体上

线程和进程有什么区别?

  • 进程是资源分配的基本单位,进程有独立的内存单元,一个进程中可以有多个线程
  • 线程是CPU调度的基本单位,多个线程之间可以共享资源,同一个进程中的多个线程可以并发执行
  • 线程相比进程能够减少开销:线程的创建快于进程;线程的终止快于进程;同一个进程内的多个线程切换比进程快 

创建线程有哪几种方式?

1、继承thread类,重写run方法

package juc.thread;public class MyThread extends Thread{@Overridepublic void run(){int i = 0;while (true){if(i == 100) break;i++;}System.out.println(i);}public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}

2、实现runnable接口,重写run方法

package juc.thread;public class MyThread implements Runnable{@Overridepublic void run() {int i = 0;while (true){if(i == 100) break;i++;}System.out.println(i);}public static void main(String[] args) {MyThread myThread = new MyThread();Thread thread = new Thread(myThread);thread.start();}}

3、使用callable和futureTask:实现callable接口,再使用future类来包装callable对象

package juc.thread;import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;public class MyThread {public static void main(String[] args) {MyThread myThread = new MyThread();FutureTask<Integer> futureTask = new FutureTask<>((Callable<Integer>)()->{return 1;});new Thread(futureTask,"有返回值的线程").start();   }}

4、使用线程池:Excutor框架

runnable和callable有什么区别?


@FunctionalInterface
public interface Runnable {/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the object's* <code>run</code> method to be called in that separately executing* thread.* <p>* The general contract of the method <code>run</code> is that it may* take any action whatsoever.** @see     java.lang.Thread#run()*///返回值是voidpublic abstract void run();
}
@FunctionalInterface
public interface Callable<V> {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/V call() throws Exception;
}
  • runnable接口中的run方法没有返回值,callable接口中的call方法有返回值
  • runnable接口中run方法的异常必须在内部处理,不能抛出;callable接口中的call方法的异常可以在内部处理,也可以向上抛出

线程的状态及转换?

  • new:初始状态,线程被构建,但是还没有调用start方法
  • runnable:运行状态
  • blocked:阻塞状态,表示线程阻塞于锁
  • waiting:等待状态,进入该状态的线程需要其他线程做出一些特定动作,通知或中断
  • time_waiting:超时等待状态,但是可以在指定的时间内自行返回
  • terminated:终止状态,线程已经执行完毕 

sleep()和wait()的区别?

  • 都可以暂停线程的执行
  • sleep方法在睡眠指定时间后,可以自动苏醒;wait方法需要notify和notifyAll来唤醒 
  • sleep是Thread类的静态方法;wait是Object的方法
  • sleep不会释放锁;wait会释放锁

run()和start()有什么区别? 

  • 当调用start方法时,start会启动一个线程,此时线程处于就绪状态,只有当得到时间片以后才会运行run()中的代码,此时无需等待run方法中的代码执行完即可执行下面的代码,所以说start真正的实现了多线程
  • 当调用run方法时,程序中依然只有主线程这一个线程,只有等到run方法中的代码执行完之后才能继续执行下面的代码,所以说run方法只是一个普通方法

在Java程序中怎么保证多线程的运行安全?

  • 原子性:在同一时刻只能有一个线程对数据进行修改
  • 可见性:线程对主内存的修改要及时地被其他线程看到
  • 有序性:遵循happens-before原则:如果一个操作happens-before另一个操作,那么第一个操作的执行结果对于第二个操作来说是可见的,而且第一个操作的执行顺序排在第二个操作之前;两个操作存在happens-before关系,并不意味着Java平台的具体实现按照这个顺序来执行,如果重排序之后的结果不会被改变,这种排序就是合法的 

什么是悲观锁?

它认为多线程同时修改资源的概率比较高,很容易出现冲突,所以它在访问资源之前需要先加锁,synchronized就是基于这种思想;主要用于写比较多的情况

什么是乐观锁?常见的两种实现方式?有什么缺点?

它会先修改资源,再验证这段时间内有没有其他线程正在修改资源,如果没有,那么操作完成;如果有,就放弃本次操作;因为它全程没有加锁,所以又叫无锁编程;主要用于多读或者加锁成本比较高的场景

实现方式:

  • 版本号机制:在数据表中添加了version字段,表示数据被修改的次数。当数据被修改时,version加1。当提交更新时,如果之前读到的version值和数据库中的version值一致,则提交更新。否则进行重试,直到成功。
  • CAS算法:compare and swap。该算法涉及到三个值:需要读写的内存值V,进行比较的值A,拟写入的值B,当且仅当V=A时,才会进行原子方式将V更新为B,否则就会重新尝试

缺点:

  • 如果一个变量V在初次读取到的时候是A值,在准备赋值的时候仍然是A值,那么CAS操作就会误认为该值中间没有被更新过
  • 自旋CAS如果长时间不成功,会对CPU带来非常大的开销
  • CAS只对单个共享变量有效,即只能保证对一个变量的原子操作,对多个共享变量无效

 

整理面经不易,觉得有帮助的小伙伴点个赞吧~感谢收看! 

相关文章:

Java实习生------JUC并发编程(多线程)10道面试题打卡⭐⭐⭐

目录 并行和并发有什么区别&#xff1f; 线程和进程有什么区别&#xff1f; 创建线程有哪几种方式&#xff1f; runnable和callable有什么区别&#xff1f; 线程的状态及转换&#xff1f; sleep()和wait()的区别&#xff1f; run()和start()有什么区别&#xff1f; 在…...

ChatGPT和百度文心一言写用例,谁更强?

文心一言发布的第一时间&#xff0c;就排队申请了邀请码&#xff0c;昨晚看了下&#xff0c;邀请码已经到手&#xff0c;索性就拿一个例子试了一下&#xff0c;看看哪个能够真正意义上的提高生产力&#xff0c;最简单的录制了个GIF动画如下&#xff1a;问题&#xff1a;你是一个…...

设计模式总结

设计模式的六大原则 开放-封闭原则(OCP) (总原则) Open-Close Principle&#xff1a;该对扩展开放&#xff0c;对修改关闭。 目的就是保证程序的扩展性好&#xff0c;易于维护和升级。 开放-封闭原则是面向对象设计的核心所在, 开闭原则是Java世界里最基础的设计原则。 开闭…...

【K8S系列】深入解析Pod对象(一)

目录 序言 1.问题引入 1.1 问题描述 2 问题解答 2.1 pod 属性 2.1.1 NodeSelector 2.1.2 HostAliases 2.1.3 shareProcessNamespace 2.1.4 NodeName 2.1.5 其他pod属性 2.2 容器属性 2.2.1 ImagePullPolicy 2.2.2 Lifecycle 3 总结 4. 投票 序言 任何一件事情&am…...

JVM学习.02 内存分配和回收策略

1、前言《JVM学习.01 内存模型》篇讲述了JVM的内存布局&#xff0c;其中每个区域是作用&#xff0c;以及创建实例对象的时候内存区域的工作流程。上文还讲到了关于对象存货后&#xff0c;会被回收清理的过程。今天这里就着重讲一下对象实例是如何被清理回收的&#xff0c;以及清…...

logstash+elasticsearch+Kibana(ELK)日志收集

文章目录一.安装ELK 7.17二.为Elasticsearch设置密码三.配置logstash四.springboot整合logstash五.spring整合Elastic Search一.安装ELK 7.17 不要一股脑执行以下语句,请观察修改要修改的地方 安装logstash # logstash安装docker run -d --name logstash \-p 5043:5043 -p 5…...

今天面试了一个2年Java经验的

今天去面试了一个26岁的程序员&#xff0c;看了简历&#xff0c;2年经验&#xff0c;本科&#xff0c;写得很牛叉。 Spring cloud alibaba全家桶、redis&#xff0c;分布式锁&#xff0c;服务调用&#xff0c;数据库事务&#xff0c;线程&#xff0c;Zookeeper、Dubbo 、Rabbi…...

逻辑覆盖测试用例设计

逻辑覆盖测试用例设计 实验目标 能够依据程序画出程序流程图理解常用覆盖方法的内涵理解常用覆盖方法的强弱关系能够使用常用覆盖方法设计测试用例 背景知识 白盒测试通常采用静态测试方法和动态测试方法开展。动态测试是参照系统需求或测试规则&#xff0c;通过预先设计一…...

面试官:说一下MySQL中的锁机制吧

5. 1MySQL有哪些锁&#xff1f; 为保证数据的一致性&#xff0c;需要对并发操作进行控制&#xff0c;因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。 锁冲突 也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要&#xff0c;也更加…...

STL库中list的迭代器实现痛点分析

前文本篇文章准备换个模式&#xff0c;之前都是先详解模拟实现&#xff0c;但是模拟实现的基本逻辑大多数老铁都是明白的&#xff0c;所以我们这次主要讲解STL库中list的独特性&#xff0c;也就是模拟实现中的重难点文末有模拟实现的源码一&#xff0c;list实现的特殊类list实现…...

字符编码对比(GBK、Unicode、UTF-8)

摘要我们在网上能看到各种文字和符号&#xff0c;那么它们是怎么存储和转化的&#xff0c;还有我们常常提及的UTF-8&#xff0c;为什么都要设置这种编码方式&#xff0c;这里就探讨下。字符集字符集&#xff1a;就是各国文字、符号、数字的集合。常见的字符集有&#xff1a;ASC…...

【百面成神】Redis基础11问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;纯手打总结面试题&#xff0c;自用备用 &#x1f330; 文章简介&#xff1a;Redis最基础、重要的11道面试题 文章目录…...

十大排序算法极简汇总篇

说明 十大排序算法可以说是每个程序员都必须得掌握的了&#xff0c;如果你们像从 0 详细学习每一篇&#xff0c;那么你们可以看前面的文章。 但是呢&#xff0c;有些人可能已经学过&#xff0c;想要快速复习一下&#xff0c;看看代码怎么写的&#xff0c;那么可以看这篇十大排…...

数据结构笔记

文章目录第一章&#xff1a;数据结构与算法第二章&#xff1a;稀疏数组和队列一 、稀疏sparsearray 数组&#xff08;一&#xff09;案例需求&#xff08;二&#xff09;稀疏数组介绍&#xff08;三&#xff09;应用实列&#xff08;四&#xff09;代码实现二、队列&#xff08…...

web前端框架——Vue的特性

目录 前言&#xff1a; 一.vue 二.特性 1.轻量级 2.数据绑定 3.指令 4.插件 三.比较Angular 、React 、Vue 框架之间的比较 1. Angular Angular的优点&#xff1a; 2. React React 的优点&#xff1a; 3.vue 3.Vue的优点&#xff1a; 前言&#xff1a; 本篇文章…...

提权工具推荐(PEASS-ng、linpeas_linux_amd64、winPEASany_ofs)

介绍 在这里,您可以找到适用于Windows、Linux/Unix*和MacOS的权限提升工具。 这些工具搜索您可以利用的可能的本地权限提升路径,并用漂亮的颜色打印给您,这样您就可以很容易地识别错误配置。 查看book.hacktricks.xyz中的本地Windows权限提升检查表WinPEAS-Windows本地权限…...

Spark - 继承 FileOutputFormat 实现向 HDFS 地址追加文件

目录 一.引言 二.源码浅析 1.RDD.saveAsTextFile 2.TextOutputFormat 3.FileOutputFormat 三.源码修改 1.修改文件生成逻辑 - getRecordWriter 2.允许目录存在 - checkoutputSpecs 3.全部代码 - TextOutputFormatV2 四.追加存储代码实战 五.总结 一.引言 Output d…...

树莓派编程控制继电器及继电器组

目录 一&#xff0c;继电器说明 ● 继电器接口说明 ① 继电器输入端: ② 继电器输出端: 二&#xff0c;树莓派控制继电器 三&#xff0c;树莓派控制继电器组 一&#xff0c;继电器说明 通俗点讲&#xff0c;可以把继电器理解成是一些功能设备的控制开关。 ● LOW&#…...

oracle和mysql的区别

Oracle与MySQL的区别以及优缺点 MySQL的特点 1、性能卓越&#xff0c;服务稳定&#xff0c;很少出现异常宕机&#xff1b; 2、开放源代码无版本制约&#xff0c;自主性及使用成本低&#xff1b; 3、历史悠久&#xff0c;社区和用户非常活跃&#xff0c;遇到问题及时寻求帮助…...

<Linux开发> linux应用开发-之-uart通信开发例程

一、简介 串口全称叫做串行接口&#xff0c;串行接口指的是数据一个一个的按顺序传输&#xff0c;通信线路简单。使用两条线即可. 实现双向通信&#xff0c;一条用于发送&#xff0c;一条用于接收。串口通信距离远&#xff0c;但是速度相对会低&#xff0c;串口是一种很常用的工…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…...

rk3506上移植lvgl应用

本文档介绍如何在开发板上运行以及移植LVGL。 1. 移植准备 硬件环境:开发板及其配套屏幕 开发板镜像 主机环境:Ubuntu 22.04.5 2. LVGL启动 ​ 出厂系统默认配置了 LVGL,并且上电之后默认会启动 一个LVGL应用 。 LVGL 的启动脚本为/etc/init.d/pre_init/S00-lv_demo,…...

【芯片仿真中的X值:隐藏的陷阱与应对之道】

在芯片设计的世界里&#xff0c;X值&#xff08;不定态&#xff09;就像一个潜伏的幽灵。它可能让仿真测试顺利通过&#xff0c;却在芯片流片后引发灾难性后果。本文将揭开X值的本质&#xff0c;探讨其危害&#xff0c;并分享高效调试与预防的实战经验。    一、X值的本质与致…...