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

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...