当前位置: 首页 > 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;串口是一种很常用的工…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...