Java面试题(6)

28.创建线程池有哪几种方式

newFixedThreadPool(int nThreads) :创建一个固定长度的线程池,如果有线程发生错误而结束, 线程池会补充一个新线程。

newCachedThreadPool() :创建一个可缓存的线程池,会自动回收和创建空闲线程和新线程。 newSingleThreadExecutor() : 这是一个单线程的 Executor,它创建单个工作线程来执行任务,如 果这个线程异常结束,会创建一 个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执 行。

newScheduledThreadPool(int corePoolSize) :创建一个固定长度的线程池,可以延迟和定时执 行。 Executors.newSingleThreadScheduledExecutor:创建一个单线程的可以执行延迟任务的线程 池。 Executors.newWorkStealingPool:创建一个抢占式执行的线程池(任务执行顺序不确定)【JDK 1.8 添 加】。

ThreadPoolExecutor: 手动创建线程池的方式,它创建时最多可以设置 7 个参数:

1. corePoolSize:线程池中的常驻核心线程数

2. maxinumPoolSize:线程池中能够容纳同时执行的最大线程数,此值必须大于等于一

3. keepAliveTime:多余的空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间 达到keepAliveTime时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。

4. unit:keepAliveTime的单位

5. workQueue:任务队列,被提交但是尚未被执行的任务。

6. threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。

7. handler:拒绝策略,表示当队列满了并且工作线程-大于等于线程池的数量最大线程数 (maxinumPoolSize)时如何来拒绝请求执行的runnable的策略。

(1)线程池都有那些状态 Running、ShutDown、Stop、Tidying、Terminated。

Running:接受新任务、处理等待队列中的任务

ShutDown:不接受新任务、但依然处理等待队列中的任务

Stop:不接受新任务,也不处理等待队列中的任务

TIDYING:所有任务都已终止,workerCount 为零,线程转换到 TIDYING 状态将运行 terminated() 钩子方法。

TERMINATED:terminated() 已完成。

(2)线程池中submit()和execute()有什么区别

1. 接受参数不同

2. submit有返回值,而execute没有返回值

3. submit方便Exception处理

29.在java程序中如何保证多线程的运行安全

线程安全体现在三个方面

1. 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作

2. 可见性:一个线程对主内存的修改可以及时地被其他线程看到

3. 有序性:在java内存模型中说过,为了性能优化,编译器和处理器会进行指令重排序;也就是说 java程序天然的有序性可以总结为:如果在本线程内观察,所有的操作都是有序的;如果在一个线 程观察另一个线程,所有的操作都是无序的。

30.多线程锁的升级原理是什么

在java中,锁一共有四种状态,级别从低到高依次为:无状态锁-》偏向锁-》轻量级锁-》重量级锁-》, 这几个状态会随着竞争情况逐渐升级,但不可以降级。

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞现象, 若无外力作用,他们都将无法推进下去。此时系统处于死锁状态或系统产生了死锁,这些永远在互相等 待的进程称为死锁进程。是操作系统层面的一个错误,是进程死锁的简称,最早在1965年由Dijkstra在 研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。

31.怎么防止死锁

缺省死锁产生的四个必要条件就可以了。在系统设计、进程调度等方面注意如何不让这四个必要条件成 立,如何确定资源的合理分配算法,避免进程永久占据系统资源。 此外,也要防止进程在处于等待状态的情况下占用资源因此,对资源的分配要给与合理的规划。

(1)死锁的四个必要条件

1. 互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待, 直到占有该资源的进程使用完成后释放该资源。

2. 请求和保持条件:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占 有,此时请求阻塞,但又对自己获得的资源保持不放。

3. 不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完成后自己 释放。

4. 环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系。

32.ThreadLocal是什么。

是用来支持线程局部变量的一个java类,使得局部变量只属于线程自身所有,不被多个线程共享,是一 种实现线程安全的方式。

33.说一下synchronized

synchronized是java中的一个关键字,是一种同步锁,他可以修饰代码块、方法,静态方法。 synchronized可以保证该方法或代码块在运行时,同一时刻只有一个方法进入到临界区,同时他 还可以保证共享变量的内存可见性。

java中每一个对象都可以作为锁,这就是synchronized实现同步的基础

普通同步方法:锁是当前实例对象

静态同步方法:锁是当前类的class对象

同步方法块:锁是括号里面的对象

(1)synchronized和volatile的区别是什么

1. volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中 读 取; synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞 住。

2. volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别。

3. volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改 可见性和原子性。

4. volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

5. volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。

(2)synchronized于Lock有什么区别

1. synchronized是java中的一个关键字,而Lock是一个类

2. synchronized无法判断是否获取到了锁,而Lock可以判断是否获取到了锁

3. synchronized会自动释放锁,而Lock需要在finally中手动释放锁(unlock()方法)

4. synchronized适合代码少量的同步问题,而Lock适合代码大量的同步问题

(3)synchronized和ReentrantLock(可重入锁)的区别是什么

1. synchronized是java重的一个关键字,而ReentrantLock是类。

2. ReentrantLock比synchronized更灵活,可扩展。

3. 响应中断不同:ReentrantLock 可以响应中断,解决死锁的问题,而 synchronized 不能响应中 断。

4. 二者的锁机制其实也是不一样的:ReentrantLock 底层调用的是 Unsafe 的 park 方法加锁, synchronized是 JVM 层面通过监视器实现的。

34.说一下atomic的原理

  • Atomic 包中的类基本的特性就是在多线程环境下,当有多个线程同时对单个(包括基本类型 及引 用类型)变量进行操作时,具有排他性,即当多个线程同时对该变量的值进行更新时, 仅有一个 线程能成功,而未成功的线程可以向自旋锁一样,继续尝试,一直等到执行成功。
  • Atomic 系列的类中的核心方法都会调用 unsafe 类中的几个本地方法。我们需要先知道一个东 西 就是 Unsafe 类,全名为:sun.misc.Unsafe,这个类包含了大量的对 C 代码的操作,包括很多直 接内存分配以及原子操作的调用,而它之所以标记为非安全的,是告诉你这个里面大量 的方法调 用都会存在安全隐患,需要小心使用,否则会导致严重的后果,例如在通过 unsafe 分配内存的时 候,如果自己指定某些区域可能会导致一些类似 C++一样的指针越界到其他进 程的问题。

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

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

相关文章

OpenHarmony—TypeScript到ArkTS约束说明

对象的属性名必须是合法的标识符 规则:arkts-identifiers-as-prop-names 级别:错误 在ArkTS中,对象的属性名不能为数字或字符串。通过属性名访问类的属性,通过数值索引访问数组元素。 TypeScript var x { name: x, 2: 3 };c…

WWDG喂狗

3F 是0111111 40 是1000000 0X7F 127 0X5F 95 127-9532 注意:中断是在0x40,在0x40喂狗则程序不会复位 在0x5F之前喂狗会复位,减小到63以下也会复位 在0x5F与0x3F之间喂狗会继续执行,不会复位 WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄//初始化窗口看门狗…

项目解决方案:非执法视频监控系统项目设计方案

目 录 一、概述 (一)前言 (二)设计思路 (三)设计原则 1、实用性 2、可靠性 3、安全性 4、先进性 5、开放性 6、易管理、易维护 (四)设计依据 二、方案总…

【MySQL】阿里云服务器卸载MySQL流程

使用该命令查询当前安装的MySQL rpm -qa | grep mysql使用rpm -ev接上相应名称删除这些项目,推荐从下往上逐个卸载 接下来使用find / -name mysql查询系统内剩余的MySQL文件 最后使用rm -rf接对应文件目录删除 收尾再次使用find / -name mysql查询,No…

关于鸿蒙系统开源和技术细节的一些探讨

1月18日在深圳举办了“鸿蒙生态千帆启航仪式”,这也是华为鸿蒙开启生态进阶的信号。在政策的叠加下,鸿蒙未来必定是势不可挡的。我们这些程序员也得与时俱进,熟悉鸿蒙的技术和细节,别在经济寒冬里被淘汰了。 官方称 Harmony OS N…

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料: 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念,官网有详细说明,再次就不在赘述。博文相关项目…

[GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备

基于labelme的无人机语义分割数据集制备 文章目录 基于labelme的无人机语义分割数据集制备1. 数据获取2. 安装labelme3.利用labelme进行标注 1. 数据获取 数据集制备需要利用无人机飞行并采集标注。使用录制模式,镜头垂直向下进行拍摄,得到DJI_XXXX.MP4…

研发日记,Matlab/Simulink避坑指南(四)——transpose()转置函数Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结 前言 见《研发日记,Matlab/Simulink避坑指南(一)——Data Store Memory模块执行时序Bug》 见《研发日记,Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《…

32人联机自建服务器攻略【幻兽帕鲁多人游玩】

创建幻兽帕鲁服务器1分钟部署教程,阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程,4核16G和4核32G配置可选,阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程: 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

使用 Redis 的 List 数据结构实现分页查询的思路

假设有一个存储数据的 List,每个元素代表一个记录,例如 recordsList。 按页存储数据: 每页存储一定数量的记录。例如,第一页存储索引 0 到 N-1 的记录,第二页存储索引 N 到 2N-1 的记录,以此类推。 分页查…

书生·浦语大模型--第六节课笔记作业--OpenCompass大模型评测

文章目录 OpenCompass评测框架实战&基础作业安装查看支持的数据集和模型启动评测 为什么需要评测? 统一的模型评测 如何评测? 基座模型需要加上额外的提示 客观评测:只要回答包括北京就可以认为正确 主观评测:创作类问题。人工…

设计模式_访问者模式_Visitor

案例引入 要求 测评系统需求:将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(比如 成功、失败 等) 传统方案 Man和Woman里面都有“成功”、“失败”的方法 【分析】 如果系统比较小&…

springboot优雅停机

import org.springframework.context.annotation.Configuration;import javax.annotation.PreDestroy;Configuration public class DataBackupConfig {PreDestroypublic void backData(){System.out.println("开始备份..."System.currentTimeMillis());System.out.pr…

6.Toast(Android)

愿你出走半生,归来仍是少年! 环境:.NET 7、MAUI 在Maui开发中使用的Toast太丑了,在android项目中使用时不够看。通过Maui的安卓绑定库可实现将android中已有的包导入到C#项目中使用,借助这个方法就可以使用以前在android原生开发…

Python_NumPy——入门学习(概述,数据类型,创建数组)

作者:初次知晓 邮箱:lr_1052107892outlook.com 资料参考 [菜鸟教程](https://www.runoob.com/)NumPy概述 NumPy(Numerical Python)是python的一个扩展程序库,支持大量的维度数据与矩阵运算,针对数据运算提供大量的数学函数库,包…

如何降低微服务复杂度丨云栖大会微服务主题分享实录

作者:谢吉宝 本文整理自阿里云资深技术专家、中间件负责人谢吉宝在2023云栖大会《极简微服务模式,降低微服务复杂度的最佳实践》的分享 2023 云栖大会现场 当面临复杂的挑战时,"分而治之"的方法往往能取得显著的效果。微服务架构…

C++——类型转换与特殊类设计

我们在C语言中经常会使用到强制类型转换,例如指针和整形之间的转换是最为常见的,但是 在C中,C设计师认为这种强制类型转换是不安全的,所以在C标准中加入了四种强制 类型转换风格,这就是我将要介绍的强制类型转换。 在某…

VS2022联合Qt5开发学习11(QT5.12.3联合VTK在VS2022上开发医学图像项目5——qvtkWidget上显示STL三维图像并取点)

这篇博文是接着这个系列前面的博文,来讲如何实现医学图像三视图同步视图。我想到的一个思路是用Scrollbar来控制切面的改变,还有一个想法是在三维图像上取点,然后以这个点为切面中心更新三维视图。这篇博文主要介绍的就是第二个想法的三维图像…

C++ qt标题栏组件绘制

本博文源于笔者在学习C qt制作的标题栏组件,主要包含了,最小化,最大化,关闭。读者在看到这篇博文的时候,可以直接查看如何使用的,会使用了,然后进行复制粘贴源码部分即可。 问题来源 想要制作…

支持向量机(Support Vector Machines)(需要优化)

1.优化目标 一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大…