Java基础面试重点-3

41. 简述线程生命周期(状态)

  • 其它参考《多线程重点》中的说法。
  • 三种阻塞:
    • 等待阻塞:
      • 运行的线程执行o.wait()方法(该线程已经持有锁),JVM会把该线程放入等待队列中。
    • 同步阻塞:
      • 运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,JVM会把该线程放入锁池中。
    • 其他阻塞 -> 原地等待,不进入等待队列或者锁池:
      • 运行的线程执行Thread.sleep(long ms)或 t.join()方法,或者发出了 I/O 请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行状态。

42. 终止线程4种方式:

  • 程序运行结束,线程自动结束;
  • 使用interrupt()与interruptted()/isinterrupted()结合+抛异常法/Return法;[推荐异常法,异常可以上抛,异常信息可以传播]。
  • 使用volatile变量标识终止正常运行的线程 + 抛异常法/Return法。
  • stop()暴力停止线程;[不推荐使用,原因:i.可能使一些清理工作得不到完成;II.对锁定对象进行'解锁',数据得不到同步处理,出现数据不一致]。

43. 线程与任务的区别(认知上重要概念):

  • new Thread直接就是创建一个线程对象,重写run方法 -> 线程的任务和线程对象合并到一起。
  • new Runnable和new Callable创建一个任务对象,再将任务对象放到一个线程对象中执行 -> 它将任务和线程对象分开。

44. yield()和join()的区别?

  • yield():放弃当前的CPU资源,将它让给其他的任务去占用CUP执行时间。表明该线程没有在做一些紧急的事情。
  • join():等待线程对象销毁,然后才让其它线程执行;主要作用是同步,使线程之间的并行执行变为串行执行(排队运行)。

join(long)与sleep(long)的区别:*

join(long)内部使用wait(long)方法实现的,它具有释放锁的特点,但sleep(long)不会释放锁。

45. Condition类和Object类锁方法区别:

  • Condition.awiat() 与Object.wait() 等效。
  • Condition.signal() 与Object.notify() 等效。
  • Condition.signalAll() 与Object.notifyAll() 等效。
  • Tips:
    • ReentrantLock类可以唤醒指定条件的线程,而Object的唤醒是随机的。

46. lock、tryLock、lockInterruptibly的区别:

  • lock ():能获得锁返回 true,不能就等待获得锁。
  • tryLock():能获得锁返回 true,不能就返回 false。
  • tryLock(long timeout,TimeUnit unit):可以增加时间限制,如果超过该时间段还没获得锁,返回false。
  • lock()与lockInterruptibly():如果两个线程分别执行这两个方法,此时中断这两个线程,lock()不会抛出异常,而 lockInterruptibly() 会抛出异常。(@&@)

47. Semaphore(信号量)与锁的区别?

Semaphore作用:

  • 用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。
  • 单值(信号量只有1个),相当于是一个互斥锁;
  • 多值(信号量多余1个),主要用于控制并发数。

Semaphore与锁的区别:

它解决了锁一次只能让一个线程访问资源的问题,信号量可以指定多个线程,同时访问一个资源。

48. CountDownLatch和CyclicBarrier的区别?

  • CDL的作用:使一个线程等待其他线程完成各自的工作后再执行;
  • CB的作用:让一组线程到达一个屏障点的时候被阻塞,直到最后一个线程到达屏障点才开启,继续往下执行。
  • CDL与CB的区别:
  • CDL允许一个或多个线程等待一组事件的产生;CB用于等待其他线程运行到栅栏位置。
  • CDL的计数器只能使用一次,减计数方式;CB的计数器可以使用reset()方法重置,可以使用多次(它能够处理更为复杂的场景),减计数方式。
  • CB提供了更多的方法,getNumberWaiting()获得阻塞的线程数量,isBroken()了解阻塞的线程是否被中断。

49. 什么是ForkJoin框架?适用场景:

Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果得到大任务结果的框架。利用了现在CUP是多核的特点。

分而治之:

工作窃取算法(work-stealing) :

一个大任务拆分成多个小任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列中,并且每个队列都有单独的线程来执行队列里的任务,线程和队列一一对应。

但是会出现:A线程处理完了自己队列的任务,B线程的队列里还有很多任务要处理。

A去帮忙B,但是如果两个线程访问同一个队列,会产生竞争。如果A从双端队列的尾部拿任务执行。B永远是从双端队列的头部拿任务执行,就可以减少竞争。

优点:利用了线程进行并行计算,减少了线程间的竞争。

缺点: 任务争夺问题。

用法:

ForkJoinPool pool = new ForkJoinPool(); CutTask cutTask = new CutTask(0, 200, ...); pool.execute(cutTask); public class CutTask extends RecursiveTask<T> { ... ... @Override protected T compute() { // 本批数据小于每批次数据数据量 if (end - start <= 20) { // 执行具体逻辑 } else { // 本批数据大于每批次数据数据量,二分一下 int middle = start + (end - start) / 2; CutTask task1 = new CutTask(start, middle); CutTask task2 = new CutTask(middle, end); task1.fork(); task2.fork(); } } }

50. JAVA的内存模型(JMM):

主要目标:

定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。

作用:

定义Java 内存模型(Java Memory Model)来屏蔽掉各层硬件和操作系统的内存访问差异。

模型图:

  • 所有的变量都存储在主内存(Main Memory)中,位于物理硬件的内存中;
  • 每条线程自己的工作内存(Working Memory),工作内存中保存了被该线程使用的变量(主内存拷贝的副本),线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量,存优先存储于寄存器和高速缓存中。
  • 线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

内存间交互操作:

  • 主内存相关操作:lock(锁定)、unlock(解锁)、read(读取)、write(写入)。
  • 工作内存相关操作:load(载入)、store(存储)、use(使用)、assign(赋值)。
  • 举例:
    • 变量从主内存复制到工作内存,要顺序地执行read和load操作,反之顺序地执行store和write操作。Java要求上述操作按顺序执行,但没有保证是连续执行。此外Java内存模型还规定一些规则(省略)。

51. Java中四种引用关系:

  • 强引用:new一个对象,只要强引用还存在,GC永远不会回收掉被引用的对象。
  • 软引用:使用SoftReference类来实现软引用。内存空间足够,GC就不会回收它;内存空间不足,GC就会回收这些对象的内存。
  • 弱引用:使用WeakReference类来实现弱引用,它只能生存到下一次垃圾收集发生之前。
  • 虚引用:使用PhantomReference类来实现虚引用,主要用来跟踪对象被垃圾回收器回收的活动。

52. 对象的内存布局:

组成:

对象头,实例数据和对齐填充。

Tips:对象的大小总是8字节的整数倍。

对象头:

对象在运行期间,对象头的Mard Word中存储的数据会随着锁标志位的变化而变化。对象头(非数组类型对象,32位的JVM)的数据结构如下:

53. 为什么不把基本类型放堆中呢?

  • 基本类型占用空间比较小(1~8个字节)。
  • 长度固定不会出现动态增长的情况。

54. 堆中存什么?栈中存什么?

堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。

55. Tomcat为什么要重写类加载器?

  • 首先简单解释一下双亲委派机制。
  • 然后,说一下双亲委派机制的问题:
    • 无法实现隔离性:使用默认的类加载器机制,无法加载两个相同类库的不同版本。但是一个web容器可能要部署多个应用程序,不同的应用程序,可能会依赖同一个第三方类库的不同版本,因此要保证每一个应用程序的类库都是独立、相互隔离的。
    • 无法实现热替换:类被加载之后,就无法被替换。
  • 所以需要打破双亲委派机制,自定义类加载器。

Tomcat自己定义的类加载器:

  • CommonClassLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat和各个webapp访问。
  • CatalinaClassLoader:Tomcat私有的类加载器,webapp不能访问其加载路径下的class,即对webapp不可见。
  • SharedClassLoader:各个webapp共享的类加载器,对Tomcat不可见。
  • WebappClassLoader:webapp私有的类加载器,只对当前webapp可见,即每个Web程序都对应一个WebappClassLoader。对应目录:/WEB-INF/*。

Tomcat自定类加载器的工作原理:

  • CommonClassLoader能加载的类都可以被CatalinaClassLoader和SharedClassLoader使用,从而实现了公有类库的共用。
  • CatalinaClassLoader和SharedClassLoader自己能加载的类则与对方相互隔离。
  • WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离,多个WebAppClassLoader是同级关系。
  • JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的HotSwap功能。

60. 设计模式:**

概念:

一套被反复使用的代码设计经验的总结。

分类:

  • 创建模式:对类的实例化过程的抽象化(工厂、单例、多例、创建等)。
  • 结构模式:描述如何将类或对象结合在一起形成更大的结构(适配器、装饰、代理、门面等)。
  • 行为模式:对在不同的对象之间划分责任和算法的抽象化(不变、模板、观察者等)。

61. 工厂模式 -创建模式:

概念:

工厂类可以根据条件生成不同产品的实例;

好处:

工厂模式的好处是解耦,降低代码重复(多处new创建实例,修改要修改多处,而工厂只修改一处),使用者不知道具体创建过程。

分类:

简单工厂模式、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)

应用场景:

框架中随处可见,Spring中BeenFactory、Mybatis中SqlSessionFactory等

62. 配器模式(Adapter)- 构造模式:

概念:

将某个类的接口转换成客户端能接受的另一个接口,让不匹配而不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

形式:

类的适配器模式和对象的适配器模式

  • 类的适配器模式:通过继承来实现适配器功能

  • 对象的适配器模式:通过委派关系来实现适配器功能

应用场景:

  • 系统需要使用现有的类,而这些类的接口不符合系统的需要;
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

63. 模板模式(Template)-行为模式:

概念:

准备一个抽象类,将部分逻辑以及具体方法以及具体构造的形式实现,然后声明一下抽象方法来迫使子类实现剩余的逻辑。

相关概念:

模版方法、钩子方法

应用场

Spring中JDBC模板、事务模板、JMS模板;Java的AQS的使用

64. 责任链模式 -行为模式:

责任链模式,它是一种行为模式。它由每一个对象对其下家的引用而连接起来形成一条链。

责任链的2种实现:

  • 节点传递方式:责任链中当前节点处理完成之后,自己传递给下一个处理节点继续处理(如上类图)
  • 统一传递方式:所有节点放入集合中,一个for循环顺序调用,即责任链中处理节点不传递给下一个节点,由统一的传递逻辑进行传递。

65. 设计模式的应用:

《业务上第一次使用多个设计模式的组合(策略模式+缺省适配器模式+模板方法模式+简单工厂模式)》

业务上第一次使用多个设计模式的组合(策略模式+缺省适配器模式+模板方法模式+简单工厂模式)_运用多种设计模式做一个系统-CSDN博客

《集成分布式锁架包(MySQL、Redis、Zookeeper)》

https://blog.csdn.net/huantai3334/article/details/127762378

66. 正则的使用:

  • 语法、常用的正则
  • 手机号码验证:^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

u-boot(三) - 编译

一&#xff0c;u-boot编译过程总结 编译时的Makefile log&#xff1a; //链接得到ELF格式的u-boot arm-buildroot-linux-gnueabihf-ld.bfd -pie --gc-sections -Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o --start-group arch/arm/c…

【杂谈】-不同种类放大器及其区别

不同种类放大器及其区别 文章目录 不同种类放大器及其区别1、概述2、放大器种类2.1 如何衡量保真度2.2 如何测量放大器的效率 3、放大器分类3.1 A类放大器3.2 B 类放大器3.3 AB类放大器3.4 C类放大器3.5 其他放大器类别 1、概述 放大器是电子产品中最常用的电路之一。有几种类…

联邦学习论文阅读:2018 Federated learning with non-IID data

介绍 这是一篇2018年挂在arXiv上的文章&#xff0c;是一篇针对FL中数据Non-IID的工作。 作者发现&#xff0c;对于高度Non-IID的数据集&#xff0c;FedAvg的准确性下降了55%。 作者提出了可以用权重散度&#xff08;weight divergence&#xff09;来解释这种性能下降&#xff…

创新入门|生成式AI创新赋能优势解析,获取生成式AI知识的10大方法

生成式AI技术对员工和企业影响深远。对于员工而言&#xff0c;生成式AI能够提升工作效率&#xff0c;简化重复性任务&#xff0c;并为创意和决策提供支持。对于企业而言&#xff0c;生成式AI在产品创新、市场营销、客户服务和运营优化等方面发挥重要作用&#xff0c;帮助预测市…

亚信安慧AntDB数据库与云信达eCloud Data Master 云数据管理系统软件V4完成兼容性互认证

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;与南京云信达科技有限公司&#xff08;简称&#xff1a;云信达&#xff09;&#xff0c;完成了AntDB数据库产品与云信达eCloud Data Master云数据管理系统软件V4的兼容性互认证。 双…

git clone 项目报“鉴权失败”的解决办法

#问题展示# git clone https://gitee.com/soaringsoft/.....git 正克隆到...... Username for https://gitee.com:...... Password for https://.....gitee.com:...... remote: [session-1440f183] Unauthorized fatal: git clone https://gitee.com/soaringsoft/.....gi…

ARM-V9 RME(Realm Management Extension)系统架构之功耗管理

安全之安全(security)博客目录导读 目录 一、系统功耗管理 1、功耗状态 2、PE功耗管理 3、系统和PE集群功耗管理 4、系统功耗状态 二、RME组件功耗管理 本节规定了RME系统的功耗管理规则。 功耗管理流程定义了系统及其组件如何在各种电源状态之间进行转换&#xff0c;以…

ansible-Role角色批量按照node_export节点,并追加信息到Prometheus文件中

文章目录 剧本功能 inventory.yaml文件定义deploy.yaml角色定义node_exporter_lock角色定义任务角色main.yamlnode_exporter_tasks.yml角色触发任务notifyextra_tasks.yml角色prometheus_node_config.j2模板文件 执行命令查看变量 剧本功能 功能1&#xff1a; 批量执行node_ex…

记一次 .NET某工厂报警监控设置 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友在微信上丢了一个崩溃的dump给我&#xff0c;让我帮忙看下为什么出现了崩溃&#xff0c;在 Windows 的事件查看器上显示的是经典的 访问违例 &#xff0c;即 c0000005 错误码&#xff0c;不管怎么说有dump就可以上windbg开干了。…

Python图像处理——基于Pytorch框架ResNet152特征提取的MNIST手写数字识别

1. 数据集介绍 MNIST手写数字数据集&#xff1a; http://yann.lecun.com/exdb/mnist/ MNIST 数据集一共有 7 万张图片&#xff0c;其中 6 万张是训练集&#xff0c; 1 万张是测试集。每张图片是 28 28 的 0−9 的手写数字图片组成。每个图片是黑底白字的形式&#xff0c;黑底…

前端技术回顾系列 10|TS 泛型在类和接口中的应用

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供动力。 上文回顾:约束泛型(Generic Constraints) 上一篇文章我们回顾了 泛型 在 TypeScript 中的高级用法 —— 泛型…

uniapp开发微信小程序预加载分包

微信小程序分包是一种优化小程序项目结构和性能的方式。它允许开发者将小程序代码包拆分成多个子包&#xff0c;在用户需要时动态加载这些子包&#xff0c;从而减少小程序的首次加载时间和主包的体积。&#xff08;总体积不得大于20M&#xff0c;主包&#xff08;共同文件静态资…

nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1,因为在此系统上禁止运行脚本。

完整报错&#xff1a; nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkI D135170 中的 about_Execution_Policies。 问题原因&#xff1a; …

Ubuntu基础-vim编辑器

目录 前言: 一. 安装 二. 配置 三. 基本使用 1.使用 Vim 编辑文本文件 2.代码编辑 3.多窗口编辑 四. 总结 前言: Vim 是从 VI 发展出来的一个文本编辑器&#xff0c;具有代码补充、错误跳转等功能&#xff0c;在程序员中被广泛使用。它的设计理念是命令的组合&#xff…

Django后台忘记管理员的账号

使用命令启动项目&#xff1a; python manage.py runserver输入后缀/admin&#xff0c;进入后台管理员&#xff0c;如果此时忘记你先前设置的用户名与密码怎么办&#xff1f; 终端输入&#xff1a; python manage.py shell 输入以下内容&#xff0c;并查看返回结果&#xff…

ASM字节码插桩实现点击防抖

思路&#xff1a;在点击事件onclick的时候&#xff0c;将view的onclick在给定的时间给拦截掉。以前我们可能都是用一个util来拦截&#xff0c;这样在每个点击事件都得去判断&#xff0c;那么这里就用字节码插桩的形式来实现一下。 ASM的引入 dependencies {implementation gr…

【因果推断python】31_合成控制1

目录 一个了解无从知晓事情的超酷数学技巧 我们有时间 一个了解无从知晓事情的超酷数学技巧 当我们审视双重差分法时&#xff0c;我们有来自 2 个不同城市的多个客户的数据&#xff1a;阿雷格里港和弗洛里亚诺波利斯。数据跨越 2 个不同的时间段&#xff1a;在阿雷格里港进行…

关于头条项目经验面试题的总结

文章目录 前言一、论坛项目经典话术二、请你介绍一下你最近的项目吧2.1 话术1 三、你的公司的开发环境是怎么搭建的&#xff1f;四、登录你们是怎么做的&#xff1f;4.1 账号密码登录4.2 手机验证码发送4.2.1 手机验证码发送4.2.2 手机验证码登录 五、用户行为限流是怎么做的&a…

oracle 删除当前用户下所有表

荆轲刺秦王 通常呢 我们将正式环境的 oracle 数据库 导出成 dmp 文件&#xff0c;然后导入到测试环境或者本地环境&#xff0c;期间可能会出现各种问题。那么如何使错误的导入数据全部删除呢。可以这样做&#xff1a; 1. 本地虚拟机启动 oracle 服务 2. sqldeveloper 连接 o…

数据桥梁:无缝连接信息孤岛与分析前沿

在数字化浪潮席卷全球的今天&#xff0c;数据已成为推动社会进步和经济发展的重要力量。然而&#xff0c;在实际应用中&#xff0c;我们常常遇到的一个挑战是如何将分散、孤立的数据资源进行有效整合&#xff0c;打破“信息孤岛”&#xff0c;实现数据的无缝连接和高效利用。本…