![](https://img-blog.csdnimg.cn/dc2c3f003ba94f9a88241be07b9ab580.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java程序
文章平均质量分 75
一个节操泛滥,一身凛然正气,刚正不阿的Java程序员
不喝枸杞的程序员
十年生死两茫茫,写程序,到天亮。
展开
-
面试官:如何跟非技术人员解释黑盒、白盒、灰盒测试的区别?
对于黑盒、白盒与灰盒测试方法的理解,几年前我在某乎做过一个概念性的回答,当时提问者询问:如何跟非技术人员解释黑盒、白盒、灰盒测试的区别?我的回答原文如下:既然是对非技术人员解释,就不能用专业术语。这样说吧,有个打孔机,类似这样。纸条从盒子左方插入,从右方出来时,分别打出圆形、正方形、三角形三个样式的孔。某天,打出来的纸条,只有一种图形。黑盒测试员只能说:“这个打孔机坏了!”灰盒测试员把打孔机的盖子掀开,发现打孔机的造型原来是这样的。于是他说:“机器仍能打孔,说原创 2022-01-11 16:36:46 · 389 阅读 · 0 评论 -
软件测试八款优秀的API安全测试工具,会用三款工作效率能提升50%
第一款Postman Postman完全具备作为API测试工具的资格,但其更为人所知的名号却是打造安全API的全套协作平台。数百万Windows、Linux和iOS开发人员使用Postman不是没有原因的。 Postman为开发人员提供了一整套API工具供设计新API使用,还为企业提供了安全的存储库,让企业可以放心存储逐渐累积的代码。使用安全存储库可以确保未来的API从一开始就保持严格的安全和组织标准。 Postman提供的工作区旨在帮助开发人员组织自身工作。如果应用代码开始偏离公司确立的原创 2022-01-06 15:25:48 · 8490 阅读 · 0 评论 -
软件测试面试:请说一下你工作中发现的最有价值的bug?
这个问题,基本95%的面试都会遇到。究竟面试官想要知道什么呢? 让我们回到这个面试场景来看看。 “说一下你印象最深的bug" 你的脑子里拼命的回想过去遇到的印象深刻或有价值的bug。 乍一眼看,这是一个简答到不起眼的问题。可是同学们,你一定要知道,往往越简短的新闻,越是爆炸性的。而且很多同学会把目光集中在:印象最深的上面,其实这道题目的迷惑性就在这里,所以一定要谨慎回答。 “我就是做测试的,每天那么多bug,累计下来,没有上万也有成千,猛的一问我,我还真的一下想不起来哪些是有价原创 2022-01-06 15:16:34 · 450 阅读 · 0 评论 -
一线大厂Java架构师实际面试题总结,比较长一定要看到最后
一、Java 基础1.JDK 和 JRE 有什么区别? JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序(也就是.class文件)。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。 JDK(Java Development Kit...原创 2020-08-28 16:10:00 · 1328 阅读 · 1 评论 -
终于有人把Java内存模型说清楚了
内部原理JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。JMM 的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与 Java 编程中的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。为了获得较好的执行效能,Java 内存模型并没有限制执行引擎使用处理原创 2020-08-14 21:43:37 · 233 阅读 · 0 评论 -
35岁大厂程序员被劝退!老板说:没年轻人有冲劲!真有内味了吗?
早就听说,35岁是程序员行业的魔咒,没想到这么快就出来了活生生的例子。某大厂35+程序员,上有老,下有小,还有车贷房贷,资本家一句不灵活,没冲劲就给打发了。难怪贵行业人人自危了,且看下图:网友纷纷表示,35岁做不到管理层,真的很难出头啊,被裁是注定的了,不如到35岁自己滚吧!还是,难道真是有内味了? 有人指出资本下的互联网已经畸形,指责资本没有人性,要求立法保护一波现实的人已经开始蠢蠢欲动,大环境无法改变,还是改变自己吧,早早谋出路吧! 还有些唯能力唯强者论...原创 2020-08-08 17:33:30 · 427 阅读 · 0 评论 -
并发容器之ConcurrentLinkedQueue
1.ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程执行变成串行化。要想将ArrayList变成线程...原创 2019-12-03 16:17:53 · 247 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList
1. CopyOnWriteArrayList的简介Java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException异常,也就是说ArrayList并不是一个线程安全的容器,当然您可以用Vector,或者使用Collections的静态方法将...原创 2019-12-02 17:01:01 · 105 阅读 · 0 评论 -
详解Condition的await和signal等待/通知机制
1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来...原创 2019-11-29 22:29:53 · 204 阅读 · 0 评论 -
彻底理解volatile,领悟其中奥妙
1. volatile简介在上一篇文章中我们深入理解了java关键字synchronized,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。通过上一篇的文章我们了解到synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机...原创 2019-11-26 16:47:56 · 141 阅读 · 0 评论 -
一篇文章,彻底理解ReentrantLock
1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁...原创 2019-11-25 15:57:13 · 127 阅读 · 0 评论 -
深入理解AbstractQueuedSynchronizer(AQS)
1. AQS简介在上一篇文章中我们对lock和AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及...原创 2019-11-22 21:28:31 · 124 阅读 · 0 评论 -
初识Lock与AbstractQueuedSynchronizer(AQS)
1. concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。其中包含了两个子包:atomic以及lock,另外在concurrent下的...原创 2019-11-18 14:50:31 · 128 阅读 · 0 评论 -
Java三大性质总结:原子性、可见性以及有序性
1. 三大性质简介在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则Java内存模型以及happens-before规则,三条性质:原子性,有序性和可见性。关于synchronized和volatile已经讨论过了,就想着将并发编程中这两大神器在原子性,有序性和可见性上做一个比较,当然这也是面试中的高频考点,值得注意。2...原创 2019-11-16 16:24:53 · 189 阅读 · 0 评论 -
你以为你真的了解final吗?
1. final的简介final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。即使能够知道final具体的使用方法,我想对final在多线程中存在的重排序问题也很容易忽略,希望能够一起做下探讨。2. final的具体使用场景final能够修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,下面就分别...原创 2019-11-14 16:52:02 · 196 阅读 · 0 评论 -
这篇文章带你彻底理解synchronized
1. synchronized简介在学习知识前,我们先来看一个现象:public class SynchronizedDemo implements Runnable { private static int count = 0; public static void main(String[] args) { for (int i = 0; i <...原创 2019-11-09 15:08:10 · 170 阅读 · 0 评论 -
Java内存模型以及happens-before规则
1. JMM的介绍在上一篇文章中总结了线程的状态转换以及基本操作对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了。在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?我的认识是,在多线程下代码执行的结果与预期正确的结果不一致,该代码就是线程不安全的,否则则是线程安全的。虽然这种回答似乎不能获取什么内容,可以google下...原创 2019-11-08 14:27:05 · 177 阅读 · 0 评论 -
线程的状态转换以及基本操作
我们必须了解到并发编程的优缺点,我们在什么情况下可以去考虑开启多个线程去实现我们的业务,当然使用多线程我们应该着重注意一些什么,在上一篇文章中会有一些讨论。那么,说了这么多,无论是针对面试还是实际工作中作为一名软件开发人员都应该具备这样的技能。万事开头难,接下来就应该了解如何新建一个线程?线程状态是怎样转换的?关于线程状态的操作是怎样的?这篇文章就主要围绕这三个方面来聊一聊。1. 新建线程...原创 2019-11-07 15:54:53 · 154 阅读 · 0 评论 -
图解3种简单排序(选择,冒泡,直接插入)
排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。本文简单温习下最基础的三类算法:选择,冒泡,插入。先定义个交换数组元素的函数,供排序时调用/** * 交换数组元素 * @param arr * @param a * @...原创 2019-11-04 17:05:21 · 208 阅读 · 0 评论 -
Java中的经典算法之选择排序(SelectionSort)
a)原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)b)简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序...原创 2019-11-02 16:33:46 · 113 阅读 · 0 评论 -
网站被黑客各种攻击,我们该用什么防范手段
一、跨站脚本攻击 二、跨站请求伪造 三、SQL 注入攻击 四、拒绝服务攻击一、跨站脚本攻击概念跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。攻击原理例如有一个论坛网站,攻击者可以在上面发布以下内容:<script>location.href="//do...原创 2019-10-24 16:35:12 · 433 阅读 · 0 评论 -
千万级流量架构下的负载均衡解析
一、负载均衡 负载均衡算法 转发实现 二、集群下的 Session 管理 Sticky Session Session Replication Session Server一、负载均衡集群中的应用服务器(节点)通常被设计成无状态,用户可以请求任何一个节点。负载均衡器会根据集群中每个节点的负载情况,将用户请求转发到合适的节点上。负载均衡器可以用来实现高可用以及伸缩性:高...原创 2019-10-23 16:18:39 · 182 阅读 · 0 评论 -
关于分布式,你需要知道的真相
目录一、分布式锁 数据库的唯一索引 Redis 的 SETNX 指令 Redis 的 RedLock 算法 Zookeeper 的有序节点 二、分布式事务 2PC 本地消息表 三、CAP 一致性 可用性 分区容忍性 权衡 四、BASE 基本可用 软状态 最终一致性 五、Paxos 执行过程 约束条件 六、Raft 单个 Candidate 的竞选 多...原创 2019-10-22 15:07:24 · 150 阅读 · 0 评论 -
Redis深度历险,全面解析Redis14个核心知识点
一、概述 二、数据类型STRING LIST SET HASH ZSET 三、数据结构字典 跳跃表 四、使用场景计数器 缓存 查找表 消息队列 会话缓存 分布式锁实现 其它 五、Redis 与 Memcached数据类型 数据持久化 分布式 内存管理机制 六、键的过期时间 七、数据淘汰策略 八、持久化RDB 持久化 AOF 持久化 九、事务 十、事件...原创 2019-10-21 14:54:47 · 130 阅读 · 0 评论 -
MySQL,必须掌握的6个知识点
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q目录一、索引B+ Tree 原理MySQL 索引 索引优化 索引的优点 索引的使...原创 2019-10-19 15:02:08 · 231 阅读 · 0 评论 -
浅谈Java面向对象思想
一、三大特性封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外的接口使其与外部发生联系。用户无需关心对象内部的细节,但可以通过对象对外提供的接口来访问该对象。优点:减少耦合:可以独立地开发、测试、优化、使用、理解和修改 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候...原创 2019-10-18 14:28:29 · 125 阅读 · 0 评论 -
Java的23种设计模式,详细讲解(三)
1. 适配器(Adapter)Intent把一个类接口转换成另一个用户需要的接口。Class DiagramImplementation鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。要求将 Turkey 的 gobble() 方法适...原创 2019-10-17 14:41:45 · 169 阅读 · 0 评论 -
Java的23种设计模式,详细讲解(二)
1. 责任链(Chain Of Responsibility)Intent使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。Class DiagramHandler:定义处理请求的接口,并且实现后继链(successor)Implementationpubli...原创 2019-10-16 14:23:37 · 230 阅读 · 1 评论 -
Java的23种设计模式,详细讲解(一)
一、概述设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。二、创建型1. 单例(Singleton)Intent确保一个类只有一个实例,并提供该实例的全局访问点。Class Diagram使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。私有构造函数保证了不能通...原创 2019-10-15 20:56:01 · 127 阅读 · 0 评论 -
Spring Boot 中如何配置 Profile
一个应用为了在不同的环境下工作,常常会有不同的配置,代码逻辑处理。Spring Boot 对此提供了简便的支持。关键词:@Profile、spring.profiles.active目录区分环境的配置 properties 配置 yml 配置 区分环境的代码 修饰类 修饰注解 修饰方法 激活 profile 插件激活 profile main 方法激活 profile...原创 2019-10-11 21:35:30 · 352 阅读 · 0 评论 -
49个Spring经典面试题总结,附带答案,赶紧收藏
1. 一般问题1.1. 不同版本的 Spring Framework 有哪些主要功能?Version Feature Spring 2.5 发布于 2007 年。这是第一个支持注解的版本。 Spring 3.0 发布于 2009 年。它完全利用了 Java5 中的改进,并为 JEE6 提供了支持。 Spring 4.0 发布于 2013 年。这是第一个完...原创 2019-04-18 16:57:39 · 384 阅读 · 0 评论 -
一篇年薪60万的JVM性能调优文章
JVM 调优概述性能定义吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。 内存占用 - 垃圾收集器流畅运行所需要的内存数量。调优原则GC 优化的两个目标:将进入老年代的对象数量降到最低 减少 Full GC 的执行...原创 2019-04-17 17:18:58 · 435 阅读 · 0 评论 -
阿里面试题,深入理解Java类加载机制
类的生命周期包括以下 7 个阶段:加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading)其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。类初始化时机虚拟机规范中并没有强制约束...原创 2019-04-16 21:39:33 · 170 阅读 · 0 评论 -
深入理解JVM垃圾收集机制,下次面试你准备好了吗
程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行。判断一个对象是否可回收1. 引用计数算法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。两个对象出现循环引用的情况下,此时引用计...原创 2019-04-15 20:47:12 · 118 阅读 · 0 评论 -
阿里面试100%问到,JVM性能调优篇
JVM 调优概述性能定义吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。 内存占用 - 垃圾收集器流畅运行所需要的内存数量。调优原则GC 优化的两个目标:将进入老年代的对象数量降到最低 减少 Full GC 的执行...原创 2019-04-13 21:05:11 · 737 阅读 · 0 评论 -
ElasticSearch在数十亿级别数据下,如何提高查询效率?
面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下5~10s,坑爹了。第一次搜索的时候,是5~10s,后面反而就快了,可能就几百毫秒。你就很懵,每个用户第一次访问...原创 2019-04-12 22:27:50 · 3546 阅读 · 3 评论 -
缓存与数据库双写,不一致问题及解决方案
面试题如何保证缓存与数据库的双写一致性?面试官心理分析你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?面试题剖析一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求“缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里...原创 2019-04-12 17:21:18 · 1883 阅读 · 0 评论 -
当面试官问线程池时,你应该知道些什么?
概述什么是线程池?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。为什么要用线程池?降低资源消耗 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用...原创 2019-04-11 20:53:10 · 277 阅读 · 0 评论 -
Java高并发缓存架构,缓存雪崩、缓存穿透之谜
面试题了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?面试官心理分析其实这是问到缓存必问的,因为缓存雪崩和穿透,是缓存最大的两个问题,要么不出现,一旦出现就是致命性的问题,所以面试官一定会问你。面试题剖析缓存雪崩对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4...原创 2019-04-10 15:51:56 · 163 阅读 · 0 评论 -
Java并发编程之原子变量
原子变量比锁的粒度更细,量级更轻,并且对于在多处理器系统上实现高性能的并发代码来说是非常关键的。原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。原子类在内部使用现代 CPU 支持的 CAS 指令来实现同步。这些指令通常比锁更快。原子更新基本类型AtomicBoolean - 原子更新布尔类型。 AtomicInteger - 原子更新整...原创 2019-04-09 17:01:11 · 101 阅读 · 0 评论