Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题(持续更新中)

  • 线程与线程池
    • 线程
    • 线程池
  • Java锁机制
    • java线程模型
    • java锁分类
    • 轻量级锁
    • 重量级锁
    • ReentrantLock 底层原理与源码深度解析
    • ReentrantReadWriteLock 深入理解读写锁
    • CountDownLatch
    • semaphore 实现公平锁与非公平锁
    • 线程死锁与避免死锁
  • Java 容器(Collection、Map)

线程与线程池

线程

一、线程的状态
在这里插入图片描述
二、 sleep、wait、join、yield 方法的区别

1、sleep 与 wait 方法的区别
(1)sleep 是 Thread 类的静态本地方法;wait 则是 Object 类的本地方法。
(2)sleep 方法不会释放 lock;但是 wait 会释放,而且会加入到等待队列中。
(3)sleep 方法不依赖于同步器 synchronized;但是 wait 方法需要依赖 synchronized关键字。
(4)sleep 不需要被主动唤醒(休眠时间结束后退出阻塞);但是 wait 方法需要(不指定时间时,需要被别人中断)。
(5)sleep 方法一般用于当前线程休眠,或者轮询暂停操作;wait 方法则多用于线程之间的通信(得益于wait会释放锁)。
(6)sleep 会让出 CPU 执行时间且强制上下文切换;而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行。

2、yield 方法
yield 方法执行后线程直接进入就绪态,马上释放CPU的执行权,但是依然保留了CPU的执行资格,所以有可能CPU下次进行线程调度时,还会让这个线程获取到执行权继续执行。

3、join 方法
线程执行 join 方法后会进入阻塞状态。例如在线程B中调用线程A的 join 方法,那么线程B就会进入阻塞队列中,直到线程A结束或者中断。

三、线程的创建方式
1、继承 Thread 类;
2、实现 Runnable 接口,不带返回值;
3、实现 Callable 接口,带返回值,阻塞式获取返回值;

public static void main(String[] args) {
     System.out.println("===开始===");
     //通过结合FutureTask类实现
     FutureTask<String> futureTask = new FutureTask<>(() -> {
         String result = "";
         //结果处理过程......
         result = "Hello world!";
         return result;
     });
     Thread thread = new Thread(futureTask);
     thread.start();
     try {
         //阻塞主线程并获取返回值
         String result = futureTask.get();
         System.out.println("result = " + result);
     } catch (InterruptedException | ExecutionException e) {
         e.printStackTrace();
     }
     System.out.println("===结束===");
}

4、通过线程池创建线。注意:Java原生线程池(阿里官方不推荐使用Executors),原因如下:
在这里插入图片描述

线程池

1、线程池的核心参数
(1)corePoolSize:核心线程数。
(2)maxinumPoolSize:最大线程数。
(3)keepAliveTime:空闲线程存活时间。
(4)unit:时间单位(秒、分钟等)。
(5)workQueue:任务队列,存放任务的容器。
(6)threadFactory:线程工厂,可以使用默认的,或自定义的,通常使用默认。
(7)handler:拒绝策略,顾名思义,拒绝线程访问,JKD自带共有四种策略,如下表:

拒绝策略名称描述
new ThreadPoolExecutor.AbortPolicy()丢弃任务,并抛出RejectedExecutionException异常
new ThreadPoolExecutor.DiscardPolicy()丢弃任务,但是不抛出异常
new ThreadPoolExecutor.DiscardOldestPolicy()丢弃队列最前面的任务,然后重新提交被拒绝的任务
new ThreadPoolExecutor.CallerRunsPolicy()该任务被线程池拒绝,由调用 execute() 方法的线程执行该任务。如果执行程序已关闭,则会丢弃该任务

2、如何设置线程池参数

public static void main(String[] args) {
    //计算CPU核数
    int cpuCores = Runtime.getRuntime().availableProcessors();
    ThreadPoolExecutor threadPool = new ThreadExecutor(
            corePoolSize,   //核心线程数
            maxinumPoolSize,  //最大线程数,CPU密集型即高并发(一般为CPU核数),IO密集型(一般为:CPU核数*2)
            keepAliveTime,  //空闲线程的存活时间
            unit,  //超时时间单位
            workQueue,  //工作队列:new LinkedBlockingDeque<>(3),阻塞队列
            threadFactory,  //Executors.defaultThreadFactory(),默认创建线程的工厂,一般不动
            handler  //拒绝策略:ThreadPoolExecutor.AbortPolicy(),队列满了还有任务直接抛出异常
    );
}

3、线程池的状态及说明
线程池的状态及说明
4、线程池中的提交优先级和执行优先级
参考文章:https://blog.51cto.com/u_15891990/5908010
(1)提交优先级: 核心线程 > 工作队列 > 非核心线程
(2)执行优先级: 核心线程 > 非核心线程 > 工作队列

Java锁机制

视屏地址:B站讲的最好的Java锁机制

java线程模型

一、java线程模型,参考文章:https://www.cnblogs.com/songgj/p/15390160.html

java锁分类

参考文章:
方式一、彻底理解Java中的21种锁
方式二、彻底理解Java中的21种锁

轻量级锁

一、CAS(Compare And Swap):比较并交换。也被称为:乐观锁、自旋锁。参考文章:https://blog.csdn.net/weixin_43715214/article/details/128255225

重量级锁

一、synchronized 关键字(非公平锁) 参考如下文章:

1、深入理解 synchronized(一):https://blog.csdn.net/weixin_43715214/article/details/128608153

2、深入理解 synchronized(二):https://blog.csdn.net/weixin_43715214/article/details/128628524

3、synchronized 锁升级过程:
在这里插入图片描述
4、分段式CAS:LongAdder。参考文章:https://www.ngui.cc/el/1845495.html?action=onClick

ReentrantLock 底层原理与源码深度解析

1、参考视屏:B站讲的最好的Java锁机制【P8 - P13】
2、参考文章:深入ReentrantLock实现原理和源码分析

一、ReentrantLock 公平锁与非公平锁

1、ReentrantLock 公平锁与非公平锁,参考文章:https://zhuanlan.zhihu.com/p/45305463

2、ReentrantLock 中的 lock() 与 tryLock() 方法的区别

public class Test {

    private static ReentrantLock reentrantLock = new ReentrantLock();

    public static void main(String[] args) {

        //阻塞式加锁,业务代码不会执行
        reentrantLock.lock();

        //非阻塞式加锁,可以根据尝试加锁是否成功来决定执行逻辑。通常结合while实现自旋
        boolean tryLockResult = reentrantLock.tryLock(); 
        /*
            业务代码 .....
        */
    }
}

ReentrantReadWriteLock 深入理解读写锁

参考文章:深入理解读写锁ReentrantReadWriteLock
参考案例:https://blog.csdn.net/wujian_csdn_csdn/article/details/114385796

CountDownLatch

CounDownLatch 表示计数器,可以给 CountDownLatch 设置一个数字,一个线程调用 CountDownLatch 的 await() 方法将会阻塞,其他线程可以调用 CountDownLatch 的 countDown() 方法来对这个共享计数器中的数字减一,当数字被减成 0 后,所有的 await 的线程都将被唤醒。对应的底层原理就是,调用 await() 方法的线程就会领用AQS排队,一旦数字被减为 0 ,则会将 AQS 中排队的线程依次唤醒。(建议参考源码

semaphore 实现公平锁与非公平锁

Semaphore 表示信号量,可以设置许可的个数,表示同时允许最多多少个线程使用改信号量,通过 acquire() 来获取许可,如果没有许可可用则线程阻塞,并通过 AQS 来排队,可以通过 release() 方法来释放许可,当某个线程释放了许可后,会从 AQS 中正在排队的第一个线程开始一次唤醒,直到没有空闲许可。(其中公平与非公平两种方式建议参考源码

线程死锁与避免死锁

一、如何查看线程死锁:https://blog.csdn.net/fengsheng5210/article/details/123576559

二、MySQL如何查看死锁:https://blog.csdn.net/wufagang/article/details/125554792

三、java如何避免死锁,造成死锁的四个必要条件如下:
1、互斥:一个资源每次只能被一个进程使用。
2、请求且保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3、资源不可剥夺:进程已获得的资源,在末使用完之前,不能强行剥夺。
4、循环等待:若干进程之间形成一种头尾相接的循环等待资源关系。
注意:避免死锁只需要破坏其中一个条件就可以避免死锁,而其中前 3 个条件是作为锁要符合的必要条件,所以避免死锁就需要打破第 4 个条件(循环等待)
在开发过程中的注意事项:
1、注意加锁的顺序,保证每个线程按同样的顺序进行加锁。
2、加锁的时间,可以针对锁设置超时时间。
3、检查锁循环等待,避免死锁。

Java 容器(Collection、Map)

Java容器知识点:建议参考源码及网络资料深入理解。

在这里插入图片描述

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

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

相关文章

Android 9.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在9.0的系统rom定制化开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能,接下来就来具体实现这个功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 framework…

第六十八天 APP攻防-XposedFridaHook证书校验反代理代理转发

第68天 APP攻防-Xposed&Frida&Hook&证书校验&反代理&代理转发 知识点&#xff1a; 1、APP防代理绕过-应用&转发 2、APP证书校验类型-单向&双向 3、APP证书校验绕过-Frida&XP框架等 章节点&#xff1a; 1、信息收集-应用&资产提取&权…

蓝桥杯-标题统计

知识点: 关键是考察getline的作用 #include <iostream> using namespace std; int main() { string a; int t0; getline(cin,a);//每次读取一整行并把Enter键生成的换行符抛弃 for(int i0;i<a.length();i){ if(a[i]! )t; } cout<<t; return …

【LTSPICE】宏模型中的语法分析(持续更新)

本篇文章用来总结模型文件、仿真文件中的语法&#xff0c;写给自己看的&#xff0c;格式和内容上比较随意 上图是在安森美官网上下载的一款二极管的spice模型文件。 * 字符串&#xff1a;注释&#xff0c;能看到这篇文章的应该都懂啥叫注释.model&#xff1a;.一个词是命令…

如何修改图片尺寸大小不变形?简单的图片改大小的方法

在平时工作或者学习时&#xff0c;有时候需要将图片的大小进行修改&#xff0c;以便于存储、分享或打印&#xff0c;很多人都习惯性的去下载一些图片处理软件&#xff0c;比较麻烦&#xff0c;这里推荐大家使用图片在线处理工具&#xff0c;打开浏览器直接将图片尺寸修改&#…

【Flink】Flink 中的时间和窗口之窗口(Window)

1. 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流&#xff0c;数据流的数据是一直都有的&#xff0c;等待流结束输入数据获取所有的流数据在做聚合计算是不可能的。为了更方便高效的处理无界流&#xff0c;一种方式就是把无限的流数据切割成有限的数…

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…

消息中间件之RocketMQ源码分析(十八)

Broker CommitLog索引机制中的构建过程 1.创建ConsumeQueue和IndexFile。 ConsumeQueue和IndexFile两个索引都是由ReputMessageService类创建的 RequestMessageService类图 ReputMessageService服务启动后的执行过程。 doReput()方法用于创建索引的入口&#xff0c;通常通过…

Redis 管道详解

Redis 管道 关键词&#xff1a;Pipeline Pipeline 简介 Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下&#xff0c;一个 Redis 命令的请求、响应遵循以下步骤&#xff1a; 客户端向服务端发送一个查询请求&#xff0c;并监听 Socket 返回&#xff08…

3 easy 26. 删除有序数组中的重复项

双指针&#xff1a; //给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 //一致 。然后返回 nums 中唯一元素的个数。 // // 考虑 nums 的唯…

PreMaint CMS系统:数字化驱动起重机远程管理的智能未来

在港口起重机领域&#xff0c;数字化解决方案正成为提高效率、降低停机时间的关键。PreMaint CMS作为起重机核心可视化系统&#xff0c;融合了操作人员、维护团队和管理者的需求&#xff0c;通过智能化的方式&#xff0c;将复杂的数据转化为简洁的信息&#xff0c;实现对起重机…

Node.js中的错误处理和日志记录

在Node.js应用程序中&#xff0c;错误处理和日志记录是非常重要的方面。正确的错误处理和日志记录可以帮助我们更好地跟踪问题、排查 bug&#xff0c;并提供更好的用户体验。在本篇博客中&#xff0c;我将为大家介绍在Node.js中如何进行错误处理和日志记录&#xff0c;以及一些…

BIO实战、NIO编程与直接内存、零拷贝深入辨析

BIO实战、NIO编程与直接内存、零拷贝深入辨析 长连接、短连接 长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁&#xff0c;点对点的通讯&#xff0c;避免频繁socket创建造成资源浪费&#xff0c;比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…

基于JSP的毕业设计选题系统的设计与实现

基于JSP的毕业设计选题系统的设计与实现 (源代码论文) A. 项目简介 毕业设计选题系统就是能够使学生通过互联网完成毕业设计课题的选定&#xff0c;它采用Web方式&#xff0c;同时适用于局域网和Internet&#xff0c;它要实现审核&#xff0c;权限管理&#xff0c;邮件通知…

Spring6学习技术|IoC|基于注解管理bean

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; IoC注解 首先这是最常用的方法。&#xff08;在学Java基础的时候明明是非常不起眼的知识点啊&#xff01;&#xff01;&#xff01;&#xff09; 从 Java…

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…

RabbitMQ服务启动失败

报错信息&#xff1a; 在服务中启动RabbitMQ服务显示&#xff1a; RabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。 系统出错。 发生系统错误 1067。 进程意外终止 报错原因&#xff1a; 1.Erlang与RabbitMQ是否匹配 2.Erlang与RabbitMQ安装路径是否存在中文或空格 3.电…

解决谷歌浏览器,每次重启都重置所有设置的问题

一、问题&#xff1a; 修改谷歌浏览器的设置 关闭浏览器再打开设置页面后&#xff0c;会显示&#xff08;部分设置已重置Chrome检测到您的部分设置被其他程序篡改了&#xff0c;因此已将这些设置重置为原始默认设置。了解详情&#xff09; 之前的设置被重置了 二、解决 创建—…

VS2022调试技巧(一)

什么是bug&#xff1f; 在1945年&#xff0c;美国科学家Grace Hopper在进行计算机编程时&#xff0c;发现一只小虫子钻进了一个真空管&#xff0c;导致计算机无法正常工作。她取出虫子后&#xff0c;计算机恢复了正常&#xff0c;由此&#xff0c;她首次将“Bug”这个词用来描…

跳房子 Ⅰ(C语言)

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏。 游戏参与者需要分多个回…