Java中关于线程池的几道面试题
Java中关于线程池的几道面试题
一、介绍
以前就讲过线程池的使用,本文中介绍深挖线程池中的几道面试题
Java线程池 | 半月无霜 (banmoon.top)
在上面可以找到
线程池的核心参数都有什么,代表什么含义?
线程池的拒绝策略有哪些?
二、线程池
1)任务添加流程
当一个线程池在添加一个任务时,它是怎么分配线程去执行这个任务的
12345678910111213141516171819202122232425262728293031323334353637383940414243public class ThreadPoolExecutor extends AbstractExecutorService { public void execute(Runnable command) { // 判断是否为空 if (command == null) throw new NullPointerException(); // 判断当前正在运行的线程数是否小于 ...
Java中锁的分类
Java中锁的分类
一、介绍
在Java中的锁可以分为以下这四类
可重入锁、不可重入锁
乐观锁、悲观锁
公平锁、非公平锁
互斥锁、共享锁
二、详解
1)可重入锁、不可重入锁
当一个线程持有一个锁后,又想再持有这个锁时,发生的情况。
可重入锁:允许再次持有,多少次都没问题。
不可重入锁:不允许再次持有,已经持有了锁后,再次去获取时,会造成死锁的情况。
没必要给自己增加负担,所以Java中的锁基本都是可重入锁
2)乐观锁、悲观锁
他们两之间的区别主要体现在访问资源时,要不要进行上锁
乐观锁:假定多个线程同时访问同一个资源时,并不会彼此产生干涉和冲突,因此在多线程并发时,每个线程都可以自由访问共享资源,只在更新时检查数据是否被其他线程修改。如果数据未被修改,乐观锁会直接进行更新。常见的乐观锁实现包括版本号机制和CAS机制。Java中的Atomic相关的类,底层正是使用的CAS。
悲观锁:每个线程在访问,都要先进行上锁,这样其他线程就无法访问。悲观锁适用于对数据更新操作比较频繁的场景。当锁被别人占用时,线程只能进入等待阻塞阶段了。在Java中,synch ...
关于Java中引用的面试题
关于Java中引用的面试题
一、介绍
在Java中,有以下四种类型的引用:强软弱虚
强引用(Strong Reference):最常见的引用类型,也是默认的引用类型。如果一个对象具有强引用,那么垃圾回收器就不会回收这个对象。
软引用(Soft Reference):如果一个对象具有软引用,那么当系统内存不足时,垃圾回收器会尝试回收该对象。软引用通常用于缓存中,以便在内存紧张时释放一些缓存。
弱引用(Weak Reference):如果一个对象具有弱引用,那么它的生命周期更短,它在任何时候都可能被垃圾回收器回收。弱引用通常用于外部引用内部对象时使用,以免内存泄漏。
虚引用(Phantom Reference):虚引用是所有引用类型中最弱的一种。如果一个对象具有虚引用,那么它就像没有被引用一样,随时会被垃圾回收器回收。虚引用主要用于跟踪对象被回收的状态。
上面属于Java的面试八股文,那么在面试之中,我们该如何进行理解输出呢?
二、引用
1)强引用(Strong Reference)
在日常开发中最为平常的引用,因为我们直接new出来的对象就属于强引用。
那么,如果一个 ...
红黑树详解
红黑树详解
一、介绍
作为一颗红黑树,它是一颗特殊的AVL树,也就是一颗特殊的平衡二叉树。
对于平衡二叉树而言,它的定义是,对于任何二叉树的任何一个节点,它的左子树和右子树的高度差不能大于1。
而为什么红黑树比较特殊,它除了满足平衡二叉树的特点之外,还有以下的几个特征
每一个节点都有一个状态,红色或者黑色
根节点是黑色
红黑树的叶子节点默认都是空引用的对象,默认都是黑色
==红色==节点的两个子节点都是黑色,也就是说**红色**节点不能相连
从任意节点,到叶子节点,其经过的路径上,黑色节点的个数都是一致的
AVL树是通过自旋转来完成的平衡
但是红黑树却不全是这样,它虽然有自旋,但主要是节点特性,加上任意节点到叶子节点经过的黑色节点数量来保证了树的子平衡。
出发点不同,则实现的方式完全不同
二、示例
首先,我们针对以上五个特性,先画一个红黑树
再次讲解一下特性
不是黑就是红,没什么好说的
根节点是黑的,也没什么好说的
叶子节点都是null节点,这我认为是模拟出来的节点,仅作为第5点平衡计算使用
红色节点的子节点一定是黑的,也就是说不能出现红红相 ...
Neo4j入门
Neo4j入门
一、介绍
Neo4j是一个开源的图形数据库管理系统,它基于Java语言开发。与传统的关系型数据库不同,Neo4j使用图形结构来存储和查询数据,这使得它在处理复杂关系时更加高效和灵活。
Neo4j的核心特性包括:
1. 图形结构:Neo4j的数据模型是基于图的,每个节点表示一个实体,每个边表示两个实体之间的关系。这种结构使得Neo4j非常适合处理复杂的关系问题,例如社交网络、推荐系统等。
2. 快速查询:由于Neo4j采用基于路径的查询方式,因此它的查询速度非常快。相比之下,传统的关系型数据库需要遍历整个表才能找到所需的数据,这会导致性能问题。
3. 灵活性:Neo4j支持动态模式,这意味着它可以轻松地适应不断变化的数据模式。此外,Neo4j还支持ACID事务,确保数据的一致性和可靠性。
4. 可扩展性:Neo4j可以通过添加更多的节点和边来扩展其数据模型,这使得它非常适合处理大规模数据集。此外,Neo4j还支持集群部署,以提高可扩展性和容错能力。
总之,Neo4j是一个功能强大、灵活、高效的图形数据库管理系统,适用于处理各种复杂的关系问题。
Neo4j的优点和缺 ...
Docker入门学习
Docker入门学习
一、介绍
Docker是一个开源的容器化平台,可以将应用程序及其依赖以容器的形式封装,使其可以在任何环境中运行。Docker可以改善开发流程、提高应用程序的可移植性、简化系统配置、更易于维护等等。
Docker的优点包括:
快速构建、部署和迭代
与多种编程语言和框架兼容
节省资源和成本
增强安全性
Docker的官网为 https://www.docker.com/
二、基础
1)安装
我是在centos7上安装的docker,提供一个安装思路,可以安装下面的步骤进行安装
123456789101112131415161718192021# 在终端中输入以下命令以确保yum软件包管理器是最新的:sudo yum update# 安装必要的依赖项:sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker存储库:sudo yum-config-manager --add-repo https://download.docker.com/linux/cento ...
分享一下我是怎么使用枚举的
分享一下我是怎么使用枚举的
一、介绍
对于java枚举不陌生了,直接上代码
二、代码
使用了一个接口,用来规定一下里面的字段,统一下好处理
123456789package com.banmoon.test.enums;public interface MyEnum<T> { T getCode(); String getMsg();}
12345678910111213141516171819202122232425262728293031323334package com.banmoon.test.enums;import lombok.AllArgsConstructor;import lombok.Getter;import java.util.Arrays;@Getter@AllArgsConstructorpublic enum EnableStatusEnum implements MyEnum<Integer>{ ZERO(0, "禁用"), ONE(1, "正常 ...
SpringSecurity入门
Spring Security入门
一、介绍
Spring Security是一套权限框架,此框架可以帮助我们为项目建立丰富的角色与权限管理。
他的前身是Acegi Security,在以前SpringBoot还未出现的时候,它以繁琐臃肿的配置被人嫌弃。
当 Acegi Security 投入 Spring 怀抱之后,先把这个名字改了,这就是大家所见到的Spring Security了,然后配置也得到了极大的简化。对比同样为权限框架的shiro,相对繁琐的配置依旧让许多开发者望而却步。
直到Springboot出现后,Spring Security重新回到了大众的视野,尤其是SpringCloud出现后,Spring Security的存在感又再次提高。
核心功能:认证和授权
认证:authentication
介绍:简单说就是你是谁,比如说你是哪个用户,在系统中使用用做登录
授权:authorization
介绍:简单说就是能干什么,比如说我是管理员,我能删除别人的评论
二、入门使用
创建SpringBoot项目,这里使用的版本为2.4.5,引入相关依赖
1234 ...
什么是闭包,Java中有闭包吗?
什么是闭包,Java中有闭包吗?
一、介绍
闭包是什么?我学习Java以来,虽然听过这个名词,但我今天才第一次了解它。
所谓闭包,就是在函数中有另一个函数,这个内部函数可以作为参数,外部通过传递的方式,将函数传递进来。从而内部函数可以访问到外部函数的局部变脸。
二、演示
我们使用groovy来演示闭包的使用,它是一门由java优化而来的语言,底层正是class,可以运行再JVM虚拟机上。
1234567891011121314def sth(Closure closure) { def x = 5 def y = 5 println(closure.call(x, y))}// 加sth({x, y -> x + y})// 减sth({x, y -> x - y})// 乘sth({x, y -> x * y})// 除sth({x, y -> x / y})
运行结果如下
在Java中,我们可以使用匿名内部类来完成类似的功能,而在Java8 ...
vue2路由
vue2路由
一、介绍
本文是以前学习 vue2时整理的,对于目前的 vue3有些过时。
专注后端,前端只作为使用学习。
二、路由
作用:用于维护URL跳转和页面之间的关系
使用步骤:
引入vue-router.js文件(必须先引入vue.js)
配置路由规则,url和对应的页面的配置const routes = [{ path: "/", compontent: "组件" }]
创建路由实例对象const router = new VueRouter({routes})
routes:路由规则
path:访问的url
component:指定的组件
name:路由规则名
props:是否解耦路由参数
redirect:路由重定向
12# 当访问/home时,会自动跳转至/index[{ path: "/home" redirect: "/index" }]
linkActiveClass:指定当 ...