Java面试题(每天10题)-------连载(28)

目录

多线程篇

1、线程和进程有什么区别?

2、线程实现的方式有几种?

3、高并发、任务执行时间短的业务怎么使用线程池?并发布高、任务执行时间长的业务怎么使用线程池?并发高业务执行时间长的业务怎么使用线程池?

4、如果你提交任务时,线程池队列已满,只是会发生什么?

5、锁的等级:方法锁、对象锁、类锁

6、如果同步块内的线程抛出异常会发生什么?

7、并发线程(concurrency)并发编程(parallellism)有什么区别?

8、如何保证多线程下i++结果正确?

9、一个线程如果出现了运行时异常会怎么样?

10、如何再两个线程之间共享数据?


多线程篇

1、线程和进程有什么区别?

1. 进程是系统进⾏资源分配的基本单位,有独⽴的内存地址空间
2. 线程是 CPU 独⽴运⾏和独⽴调度的基本单位,没有单独地址空间,有独⽴的栈,局部变量,寄存器, 程序计数器等。
3. 创建进程的开销⼤,包括创建虚拟地址空间等需要⼤量系统资源。

4. 创建线程开销⼩,基本上只有⼀个内核对象和⼀个堆栈。
5. ⼀个进程⽆法直接访问另⼀个进程的资源;同⼀进程内的多个线程共享进程的资源。
6. 进程切换开销⼤,线程切换开销⼩;进程间通信开销⼤,线程间通信开销⼩。
7. 线程属于进程,不能独⽴执⾏。每个进程⾄少要有⼀个线程,成为主线程。

2、线程实现的方式有几种?

1. 继承 Thread 类,重写 run ⽅法
2. 实现 Runnable 接⼝,重写 run ⽅法,实现 Runnable 接⼝的实现类的实例对象作为 Thread 构造函数的 target
3. 实现Callable接⼝通过FutureTask包装器来创建Thread线程
4. 通过线程池创建线程
    public class ThreadDemo03 {public static void main(String[] args) {Callable<Object> oneCallable = new Tickets<Object>();FutureTask<Object> oneTask = new FutureTask<Object>(oneCallable);Thread t = new Thread(oneTask);System.out.println(Thread.currentThread().getName());t.start();}}class Tickets<Object> implements Callable<Object>{//重写call⽅法@Overridepublic Object call() throws Exception {// TODO Auto-generated method stubSystem.out.println(Thread.currentThread().getName()+"-->我是通过实现Callable接⼝通过FutureTask包装器来实现的线程"return null;}}

3、高并发、任务执行时间短的业务怎么使用线程池?并发布高、任务执行时间长的业务怎么使用线程池?并发高业务执行时间长的业务怎么使用线程池?

1. ⾼并发、任务执⾏时间短的业务:线程池线程数可以设置为 CPU 核数 +1 ,减少线程上下⽂的切换。
2. 并发不⾼、任务执⾏时间⻓的业务要区分开看:
a. 假如是业务时间⻓集中在 IO 操作上,也就是 IO 密集型的任务,因为 IO 操作并不占⽤ CPU ,所以不要让所有的 CPU闲下来,可以加⼤线程池中的线程数⽬,让CPU 处理更多的业务
b. 假如是业务时间⻓集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)⼀样吧,线程池中的线程数设置得少⼀些,减少线程上下⽂的切换
3. 并发⾼、业务执⾏时间⻓,解决这种类型任务的关键不在于线程池⽽在于整体架构的设计,看看这些业务⾥⾯某些数据是否能做缓存是第⼀步,增加服务器是第⼆步,⾄于线程池的设置,设置参考(2)。最后,业务执⾏时间⻓的问题,也可能需要分析⼀下,看看能不能使⽤中间件对任务进⾏拆分和解耦。

4、如果你提交任务时,线程池队列已满,只是会发生什么?

1、如果你使⽤的 LinkedBlockingQueue ,也就是⽆界队列的话,没关系,继续添加任务到阻塞队列中等待执⾏,因为LinkedBlockingQueue可以近乎认为是⼀个⽆穷⼤的队列,可以⽆限存放任务;
2 、如果你使⽤的是有界队列⽐⽅说 ArrayBlockingQueue 的话,任务⾸先会被添加到 ArrayBlockingQueue 中,ArrayBlockingQueue满了,则会使⽤拒绝策略 RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy。

5、锁的等级:方法锁、对象锁、类锁

1. ⽅法锁( synchronized 修饰⽅法时)
a. 通过在⽅法声明中加⼊ synchronized 关键字来声明 synchronized ⽅法。
b. synchronized ⽅法控制对类成员变量的访问:
c. 每个类实例对应⼀把锁,每个 synchronized ⽅法都必须获得调⽤该⽅法的类实例的锁⽅能执⾏,否则所属线程阻塞,⽅法⼀旦执⾏,就独占该锁 ,直到从该⽅法返回时才将锁释放,此后被阻塞的线程⽅能获得该锁,重新进⼊可 执⾏状态。这种机制确保了同⼀时刻对于每⼀个类实例,其所有声明为 synchronized 的成员函数中⾄多只有⼀个处于可执⾏状态,从⽽有效避免了类成员变量的访问冲突。
2. 对象锁( synchronized 修饰⽅法或代码块)
a. 当⼀个对象中有 synchronized method synchronized block 的时候调⽤此对象的同步⽅法或进⼊其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调⽤者占⽤,则需要等待此锁被释放。(⽅法锁也是对象锁)
b. java 的所有对象都含有 1 个互斥锁,这个锁由 JVM ⾃动获取和释放。线程进⼊ synchronized ⽅法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized ⽅法正常返回或者抛异常⽽终⽌,JVM 会⾃动释放对象锁 。这⾥也体现了⽤ synchronized 来加锁的 1 个好处,⽅法抛异常的时候,锁仍然可以由JVM来⾃动释放。 
3. 类锁( synchronized 修饰静态的⽅法或代码块)
a. 由于⼀个 class 不论被实例化多少次,其中的静态⽅法和静态变量在内存中都只有⼀份。所以,⼀旦⼀个静态的⽅法被申明为synchronized 。此类所有的实例化对象在 调⽤此⽅法 ,共⽤同⼀把锁,我们称之为类锁。
4. 对象锁是⽤来控制实例⽅法之间的同步,类锁是⽤来控制静态⽅法(或静态变量互斥体)之间的同步。

6、如果同步块内的线程抛出异常会发生什么?

 synchronized⽅法正常返回或者抛异常⽽终⽌,JVM会⾃动释放对象锁

7、并发线程(concurrency)并发编程(parallellism)有什么区别?

1. 解释⼀:并⾏是指两个或者多个事件在同⼀时刻发⽣;⽽并发是指两个或多个事件在同⼀时间间隔发⽣。
2. 解释⼆:并⾏是在不同实体上的多个事件,并发是在同⼀实体上的多个事件。
3. 解释三:在⼀台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如 hadoop 分布式集群。
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

8、如何保证多线程下i++结果正确?

1. volatile 只能保证你数据的可⻅性,获取到的是最新的数据,不能保证原⼦性;
2. AtomicInteger 保证原⼦性。
3. synchronized 既能保证共享变量可⻅性,也可以保证锁内操作的原⼦性。

9、一个线程如果出现了运行时异常会怎么样?

1、如果这个异常没有被捕获的话,这个线程就停⽌执⾏了。
2.、 另外重要的⼀点是:如果这个线程持有某个对象的监视器,那么这个对象监视器会被⽴即释放。

10、如何再两个线程之间共享数据?

通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAllawait/signal/signalAll进⾏唤起和等待,⽐⽅说阻塞队列BlockingQueue就是为线程之间共享数据⽽设计的。

1、 卖票系统:
public class Ticket implements Runnable {private int ticket = 10;public void run() {while (ticket > 0) {ticket--;System.out.println("当前票数为:" + ticket);}}
}package 多线程共享数据;public class SellTicket {public static void main(String[] args) {Ticket t = new Ticket();new Thread(t).start();new Thread(t).start();}
}

2、银行存取款 

public class MyData {private int j = 0;public synchronized void add() {j++;System.out.println("线程" + Thread.currentThread().getName() + "j为:" + j);}public synchronized void dec() {j--;System.out.println("线程" + Thread.currentThread().getName() + "j为:" + j);}public int getData() {return j;}
}public class AddRunnable implements Runnable {MyData data;public AddRunnable(MyData data) {this.data = data;}public void run() {data.add();}
}public class DecRunnable implements Runnable {MyData data;public DecRunnable(MyData data) {this.data = data;}public void run() {data.dec();}
}public class TestOne {public static void main(String[] args) {MyData data = new MyData();Runnable add = new AddRunnable(data);Runnable dec = new DecRunnable(data);for (int i = 0; i < 2; i++) {new Thread(add).start();new Thread(dec).start();}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂面试题-MySQL的binlog有几种格式?分别有什么区别

Binlog有三种格式&#xff1a;statement&#xff0c;row和mixed。 1、statement&#xff1a;记录的是SQL的原文。好处是&#xff0c;不需要记录每一行的变化&#xff0c;减少了binlog日志量&#xff0c;节约了IO&#xff0c;提高性能。由于sql的执行是有上下文的&#xff0c;因…

【STM32】STM32的Cube和HAL生态

1.单片机软件开发的时代变化 1.单片机的演进过程 (1)第1代&#xff1a;4004、8008、Zilog那个年代&#xff08;大约1980年代之前&#xff09; (2)第2代&#xff1a;51、PIC8/16、AVR那个年代&#xff08;大约2005年前&#xff09; (3)第3代&#xff1a;51、PIC32、Cortex-M0、…

selenium等待元素加载、元素操作、执行js、切换选项卡、登录cnblogs(chrome)、抽屉半自动点赞

selenium等待元素加载 代码操作非常快 ⇢ \dashrightarrow ⇢ 有的标签还没加载 ⇢ \dashrightarrow ⇢ 找就找不到 ⇢ \dashrightarrow ⇢ 就会报错 设置等待&#xff1a;显示等待&#xff0c;隐士等待 # 找某个标签&#xff0c;如果找不到&#xff0c;最多等待10s bro.…

解决IDEA使用卡顿的问题

*问题&#xff1a;使用IDEA的时候卡顿 原因&#xff1a;IDEA默认分配的内存有上限 **可以查看内存分配情况及使用情况__ 解决&#xff1a; 设置JVM的启动参数&#xff1a; 进入idea的安装目录的bin文件夹 -Xms1024m -Xmx2048m -XX:ReservedCodeCacheSize1024m -XX:UseG1G…

IP-guard WebServer RCE漏洞复现

0x01 产品简介 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件&#xff0c;旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 0x02 漏洞概述 漏洞成因 在Web应用程序的实现中&#xff0c;参数的处理和验证是确保应用安全的关键环节…

springboot中定时任务cron不生效,fixedRate指定间隔失效,只执行一次的问题

在调试计算任务的时候&#xff0c;手动重置任务为初始状态&#xff0c;但是并没有重新开始计算&#xff0c;检查定时任务代码&#xff1a; 从Scheduled(fixedRate 120000)可以看到&#xff0c;应该是间隔120秒执行一次该定时任务&#xff0c;查看后台日志&#xff0c;并没有重…

Uniapp实现多语言切换

前言 之前做项目过程中&#xff0c;也做过一次多语言切换&#xff0c;大致思想都是一样的&#xff0c;想了解的可以看下之前的文章C#WinForm实现多语言切换 使用i18n插件 安装插件 npm install vue-i18n --saveMain.js配置 // 引入 多语言包 import VueI18n from vue-i18n…

OpenGL_Learn08(坐标系统与3D空间)

目录 1. 概述 2. 局部空间 3. 世界空间 4. 观察空间 5. 剪裁空间 6. 初入3D 7. 3D旋转 8. 多个正方体 9. 观察视角 1. 概述 OpenGL希望在每次顶点着色器运行后&#xff0c;我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说&#x…

关于 国产系统UOS系统Qt开发Tcp服务器外部连接无法连接上USO系统 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134254817 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

Termius for Mac:掌控您的云端世界,安全高效的SSH客户端

你是否曾经在Mac上苦苦寻找一个好用的SSH客户端&#xff0c;让你能够远程连接到Linux服务器&#xff0c;轻松管理你的云端世界&#xff1f;现在&#xff0c;我们向你介绍一款强大而高效的SSH客户端——Termius。 Termius是一款专为Mac用户设计的SSH客户端&#xff0c;它提供了…

this.$message提示内容添加换行

0 效果 1 代码 let msgArr [只允许上传doc/docx/xls/xlsx/pdf/png/jpg/bmp/ppt/pptx/rar/zip格式文件,且单个文件大小不能超过20MB,已过滤无效的文件] let msg msgArr.join(<br/>) this.$message({dangerouslyUseHTMLString: true,message: msg,type: warning })

安卓 车轮视图 WheelView kotlin

安卓 车轮视图 WheelView kotlin 前言一、代码解析1.初始化2.初始化数据3.onMeasure4.onDraw5.onTouchEvent6.其他 6.ItemObject二、完整代码总结 前言 有个需求涉及到类似这个视图&#xff0c;于是在网上找了个轮子&#xff0c;自己改吧改吧用&#xff0c;拿来主义当然后&…

ArcGIS属性表导出时中文为乱码的解决办法

ArcGIS属性表导出时中文为乱码的解决办法 最近换了新电脑&#xff0c;装了ArcGIS&#xff0c;在导出矢量数据的属性时&#xff0c;发现竟然是乱码。这个在老电脑上也出现过这个问题&#xff0c;当时从网上找了解决办法&#xff0c;也是花了一些时间。但是&#xff0c;时间太久就…

6 Hive引擎集成Apache Paimon

更多Paimon数据湖内容请关注&#xff1a;https://edu.51cto.com/course/35051.html 在实际工作中&#xff0c;我们通查会使用Flink计算引擎去读写Paimon&#xff0c;但是在批处理场景中&#xff0c;更多的是使用Hive去读写Paimon&#xff0c;这样操作起来更加方便。 前面我们…

物联网中的毫米波雷达:连接未来的智能设备

随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;连接设备的方式和效能变得越来越重要。毫米波雷达技术作为一种先进的感知技术&#xff0c;正在为物联网设备的连接和智能化提供全新的可能性。本文将深入探讨毫米波雷达在物联网中的应用&#xff0c;以及它是如…

高防CDN与高防服务器:为什么高防服务器不能完全代替高防CDN

在当今的数字化时代&#xff0c;网络安全已经成为企业不容忽视的关键问题。面对不断增长的网络威胁和攻击&#xff0c;许多企业采取了高防措施以保护其网络和在线资产。然而&#xff0c;高防服务器和高防CDN是两种不同的安全解决方案&#xff0c;各自有其优势和局限性。在本文中…

Apache APISIX Dashboard 未经认证访问导致 RCE(CVE-2021-45232)漏洞复现

漏洞描述 Apache APISIX 是一个动态、实时、高性能的 API 网关&#xff0c;而 Apache APISIX Dashboard 是一个简单易用的前端界面&#xff0c;用于管理 Apache APISIX。 在 2.10.1 之前的 Apache APISIX Dashboard 中&#xff0c;Manager API 使用了两个框架&#xff0c;并在…

Mysql数据库 12.SQL语言 触发器

一、触发器&#xff08;操作日志表&#xff09; 1.介绍 不需要主动调用的一种储存过程&#xff0c;是一个能够完成特定过程&#xff0c;存储在数据库服务器上的SQL片段。 对当前表中数据增删改查的一种记录<日志表>&#xff0c;根据触发器自动执行&#xff0c;记录当前…

图解三傻排序 选择排序、冒泡排序、插入排序

&#xff08;1&#xff09;选择排序 // 交换 void swap(int arr[], int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; }// 选择排序 void selectionSort(int arr[],int len) {if (len < 2) return;for (int minIndex, i 0; i < len - 1; i) {minIndex i;f…

【11】使用透视投影建立一个3D空间的测试

核心操作&#xff1a; 1.proj view model 这三个矩阵 glm::mat4 mvp m_Proj * m_View * model; m_Shader->Bind(); m_Shader->SetUniformMat4f("u_MVP", mvp);着色器里面就&#xff1a; proj:投影矩阵&#xff0c;可以选择正交投影&#xff0c;或者透视投影…