自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JavaBuild的博客

今天不学习,明天变垃圾

  • 博客(114)
  • 收藏
  • 关注

原创 《老程序员的快乐刷题时代》题一:找单独的数

好啦,以上就是针对这种比较简单的题型的不同解决方法啦,这种问题非常适合初学者,应用自己所学过的数据结构特征以及位运算去解决实际问题啦。

2024-12-26 22:44:19 800

原创 面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!

DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。DNS是一个联机的分布式数据库系统,它具有分布式、层次化、模块化等特点,它属于应用层的协议,基于UDP传输,端口为53。以上就是DNS域名管理系统涉及到的知识点啦,虽然很多后端程序员吗,在日后的工作中几乎不再深追DNS的底层原理,但初期,我们还是有必要了解一些网络上的内容的,毕竟企业内转岗比较常见。

2024-12-17 19:44:40 455

原创 《一篇就够系列》之HTTP详解,覆盖高频面试考点!

HTTP是应用层的一个重要协议,中文译为超文本传输协议,是基于TCP协议之上的,主要为WEB浏览器和WEB服务器通讯所设计,可传输超文本和多媒体内容,当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP/HTTPS 请求进行加载的。好啦,今天的HTTP学习就到这里啦,其实对于java开发工程师而言,对于HTPP的了解程度,到此也就结束了,但对于网络工程师来说,HTPP是一个至关重要的知识,需要更深层次的去探究,推荐看《图解 HTTP》这本书。

2024-10-28 15:34:54 637

原创 坑爹面试官,一个网络连通性,把我干哑火了,无理取闹还是我太菜?

如上图就是我们本地ping百度域名的一个过程及反馈结果,可见网络连通性良好,响应时间18ms,如果时间过长,说明网络延迟较大,我们还可以通过-n 或者-i 以及-t 来测试网络承载能力。这种问题在过完的面试中从没见过,毕竟太细小了,对于任何一个有工作经验的程序员来说,这都不算是问题,但你让我去说一说它们的原理,我也会一时语塞,并不是我太菜,而是面试官太无理取闹!Ping是一个非常非常常用的网络测试工具,经常用来测试网络中主机之间的连通性和网络延迟。”打开指令帮助页面,帮我们更好的使用该命令。

2024-10-15 14:26:23 182

原创 必看系列:面试官通过一个问题考查了网络编程所有知识点!

以上就是整个网络请求所涉及到的TCP/IP四层模型的实战内容,它也是我们网络编程学习中的重中之重,至于其中的每一层的细节,我们后面单个精讲!

2024-10-11 21:46:02 580

原创 NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

今天就说这么多啦,主要介绍一下网络编程相关的基础知识,在后续的博文中针对网络编程所需要的内容,在进一步的整理与细化。

2024-10-07 09:43:55 988

原创 NIO的三大核心组件详解,充分说明为什么NIO在网络IO中拥有高性能!

到这里基本上就把NIO的几个重要的组件介绍完啦,肯定不能面面俱到,大家想更多了解的,还是要多翻看不同的书籍。同时,后面我们将基于这部分内容,写一个小型的聊天室。

2024-07-22 08:47:26 1283

原创 今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型

以上BIO、NIO、AIO三种常见的IO模型是Java面试中最常考的,大家一定要记住其各自的特点和作用。阻塞 I/O:应用程序执行 I/O 操作时,会一直等待数据传输完成,期间无法执行其他任务。非阻塞 I/O:应用程序执行 I/O 操作时,如果数据未准备好,立即返回错误状态,不等待数据传输完成,可执行其他任务。异步 I/O:应用程序发起 I/O 操作后,内核负责数据传输过程,完成后通知应用程序。应用程序无需等待数据传输,可执行其他任务。

2024-07-14 21:58:27 917

原创 面试官:transient关键字修饰的变量当真不可序列化?我:烦请先生教我!

通过上面的学习,我们知道了在Java的序列化中有 Serializable、Externalizable这两个接口,前者没有任何方法,只是一个标识,而后者作为子类,提供了必须重写的方法,用以自定义序列化设计。此外,transient 关键字只能修饰字段,而不能修饰方法和类,需要注意。

2024-06-27 14:48:12 770

原创 面试官:告诉我为什么static和transient关键字修饰的变量不能被序列化?

好啦,今天针对为什么static和transient关键字修饰的变量不能被序列化进行了一个解释,下次大家在面试的时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰的变量真的不能被序列化吗?这个问题咱们后面继续讨论哈。

2024-06-23 16:17:26 606

原创 关于面试被面试官暴怼:“几年研究生白读” 的前因后果

由此可见,Serializable 接口之所以定义为空,是因为它只起到了一个标识的作用,告诉程序实现了它的对象是可以被序列化的,但真正序列化和反序列化的操作并不需要它来完成,就像这里的序列流才是主要实现序列化的驱动器!

2024-06-20 08:01:46 1264

原创 面试官:Java中缓冲流真的性能很好吗?我看未必

对于数据的处理,CPU速度快于内存,内存又远快于硬盘,在大数据量情况下,频繁的通过IO向磁盘读写数据会带来严重的性能问题,为此Java中提供了一个缓冲流的概念,简单来说就是在内存中设置一个缓冲区,只有缓冲区中存储的数据到达一定量后才会触发一次IO,这样大大提升了程序的读写性能,常用的缓冲流有:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。这其实也涉及到一个经常被问的面试问题:java中的缓冲流真的性能很好吗?

2024-06-16 17:27:04 578

原创 面试官:字节流可以处理一切文件为什么还需要字符流呢?

输入流:数据流向程序输出流:数据从程序流出。字节流:一次读入或读出是8位二进制;字符流:一次读入或读出是16位二进制JDK 中后缀是 Stream 是字节流;后缀是 Reader,Writer 是字符流。节点流:直接与数据源相连,读入或写出;处理流:与节点流一块使用,在节点流的基础上,再套接一层。

2024-06-14 22:26:16 1151

原创 实战分析Java的异步编程,并通过CompletableFuture进行高效调优

好了,今天就讲这么多,其实在Java中通过条用CompletableFuture实现异步编排的工作还是稍微有点难度的,大量的API支持,需要我们在一次次的实战中去熟悉,并灵活使用。推荐大家去看看京东的asyncTool这个框架,里面就大量使用了CompletableFuture。

2024-06-09 15:18:00 1004

原创 面试官:如何自定义一个工厂类给线程池命名,我:现场手撕吗?

其实还有一个是Apache commons-lang3 提供的 BasicThreadFactory工厂类,也可以给线程池命名,咱这里就不贴代码了,原因是他们的本质都是通过Thread 的setName()方法实现的!所以,我们其实自己也可以设计一个工厂类也实现线程池的命名操作!这是一个好问题,如果我们的项目模块较多,在运行时调用了不同模块的线程池,为了在发生异常后快速定位问题,我们一般会在构建线程池时给它一个名字,这里我们提供几种线程池命名的方法。面试官:不错不错,挺了解的嘛,那你知道怎么给线程池命名?

2024-06-02 21:55:41 292

原创 如何创建一个线程池,为什么不推荐使用Executors去创建呢?

而CachedThreadPool使用的是同步队列 SynchronousQueue, 允许创建的线程数量也为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM,其他的方法所提供的均是这种。Executors 是java并发工具包中的一个静态工厂类,在JDK1.5时被创造出来,提供了丰富的创造线程池的方法,通过它可以创建多种类型的线程池。,在高并发场景下导致OOM的风险很大,故大部分的公司已经不建议采用Executors提供的方法创建线程池了。

2024-06-02 20:12:07 470

原创 什么!程序员不乖乖写代码,跑去写小说了?一时兴起写了《雪中悍刀行》的番外,请品鉴!

老黄力竭而亡后,徐凤年便立志要到那武帝城头取回老黄的剑匣,当时白狐脸儿还讽刺说明知打不过,偏要去送死,为了一个剑匣不值得,徐凤年给的说词是怕日子久了就把老黄给忘了,可他心底知道,这怎么可能呢,即便到死,他也不会忘记老黄,取回剑匣只是不想让后人看到老黄败了!最近,徐凤年常常失神,据北城一战后,那些本可风流一甲子的宗师们,死的死废的废,皇城还姓赵,北凉王府却不姓徐了,而他在那一战过后,心境一下苍老了许多,物换星移,城是人非,今古一枰棋,程序员不乖乖写代码,跑去写小说了?

2024-05-31 22:28:48 449

原创 面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!

在这段测试代码中,我们构造了一个包含固定3线程数的线程池,循环提交10个任务,每个任务休眠3秒,但主程序休眠4秒后,会掉用shutdown方法,理论上,在第二个时间循环中,线程池被停止,所以最多执行完6个任务,但从输出中,我们丝毫感受不好线程何时被停止了。在shutdown的源码中,会启动一次顺序关闭,在这次关闭中,执行器不再接受新任务,但会继续处理队列中的已存在任务,当所有任务都完成后,线程池中的线程会逐渐退出。这种会在控制台抛出异常的方式,同样也不优雅,所以我们继续往下看!

2024-05-31 08:26:46 943

原创 关于《Java并发编程之线程池十八问》的补充内容

如果一直没有获取到返回结果,会报错,使用get(long timeout,TimeUnit unit)方法的话,如果在 timeout 时间内任务还没有执行完,就会抛出 java.util.concurrent.TimeoutException。在shutdown的源码中,会启动一次顺序关闭,在这次关闭中,执行器不再接受新任务,但会继续处理队列中的已存在任务,当所有任务都完成后,线程池中的线程会逐渐退出。的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。

2024-05-29 22:21:17 1011

原创 为师妹写的《Java并发编程之线程池十八问》被表扬啦!

所谓 线程池,就是一个可以管理若干线程的容器,当有任务需要处理时,会提交到线程池的任务队列中,由线程池分配空闲的线程处理任务,处理完任务的线程不会被销毁,而是在线程池中等待下一个任务。

2024-05-29 17:44:03 1233 1

原创 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?

处理并发编程的时候,其核心问题是当多个线程去访问共享变量时,因为顺序、资源分配等原因带来了数据的不准确,我们叫这种情况为线程不安全,为了解决线程安全问题,在Java中可以采用Lock、 synchronzed关键字等方式,但这种方式对于没有持有锁的线程来说会阻塞,这样以来在时间性能上就有所损失。为了解决这个问题,Java的lang包中诞生出了一个类,名为 ThreadLocal,见名知意,它被视为线程的“本地变量”

2024-05-26 11:41:37 11549 6

原创 当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!

我们知道C语言可以通过指针去操作内存空间,Java不存在指针,为了提升Java运行效率、增强Java语言底层资源操作能力,便诞生了Unsafe类,Unsafe是位于sun.misc包下。正如它的名字一样,这种操作底层的方式是不安全的,在程序中过度和不合理的使用,会带来未知的风险,因此,Unsafe虽然,但要慎用哦!哎呀,妈呀,终于写完了,人要傻了,为了整理这篇文章看了大量的源码,人看的头大,跟俄罗斯套娃似的源码,严谨的串联在一起!Unsafe类在日常的面试中确实不经常被问到,大家稍微了解一下即可。

2024-05-25 06:50:00 835

原创 Java中CAS算法的集中体现:Atomic原子类库,你了解吗?

我们以getAndIncrement()为例,去跟入它的底层代码会发现,其内部是同调佣UnSafe类的静态方法 getUnsafe 实现的,UnSafe类我们在讲解CAS算法的时候有提及,后面找个时间再单独学一下它,其底层是通过CAS,原子性的进行增加值。在化学领域的原子被认为是构成化学反应的最小微观粒子,是不可分割的最小单位(当然后面又发现了更小的粒子,咱们不杠哈),伟大的Doug Lea大师,将并发的一些类以此单词开头命名,一语中的!除了如上的2种原子类外,atomic包中还提供了引用类型原子类。

2024-05-20 21:53:10 1023

原创 Doug Lea大师的佳作CopyOnWriteArrayList,用不好能坑死你!

通过以上的学习,我们进行总结:CopyOnWriteArrayList的优势在于可以保证线程安全的同时,不阻塞读操作,但是这仅限于读多写少的情况;在写多读少的情况下,或者写入的对象占用内容较大时,不建议使用CopyOnWriteArrayList;CopyOnWrite 容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用 CopyOnWrite 容器,最好通过 ReentrantReadWriteLock 自定义一个的列表。

2024-05-19 12:29:13 875

原创 一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”

那么什么是虚拟线程呢?在搞清楚这个定义之前,我们先来了解一下普通线程,基于过往的学习积累,我们知道JVM 是一个多线程环境,它通过 java.lang.Thread 为我们提供了对操作系统线程(OS线程)的抽象,但是 Java 中的线程都只是对操作系统线程的一种简单封装,我们可以称之为“平台线程(platform thread)”,平台线程在底层 OS 线程上运行 Java 代码,并在代码的整个生命周期中占用该 OS 线程,因此平台线程的数量受限于 OS 线程的数量。

2024-05-18 20:14:33 929

原创 厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中

OK!以上就是SpringBoot项目下,通过阿里开源的EasyExcel技术进行百万级数据的导入功能的优化步骤啦,由原来的500秒优化到20秒!

2024-05-12 16:06:53 2878 5

原创 EasyExcel处理Mysql百万数据的导入导出案例,秒级效率,拿来即用!

以上就是SpringBoot项目下,通过阿里开源的EasyExcel技术进行百万级数据的导入与导出,不过针对百万数据量的导入,时间在分钟级别,这很明显不够优秀,但考虑到本文的篇幅已经很长了,我们在下一篇文章针对导入进行性能优化,敬请期待!

2024-05-10 22:26:18 3363

原创 Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发

由于在上一步我们配置了注释生成器,因此,我们要在相应的路径下,创建一个类,来自定义注释的生成规则。路径:org.javaboy.vhr.utils.CommentGenerator。

2024-05-02 13:08:56 1288 1

原创 面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?

相比于传统读写锁多出来的乐观读是StampedLock比 ReadWriteLock 性能更好的关键原因。StampedLock 的乐观读允许一个写线程获取写锁,所以不会导致所有写线程阻塞,也就是当读多写少的时候,写线程有机会获取写锁,减少了线程饥饿的问题,吞吐量大大提高。不过,需要注意的是StampedLock不可重入,不支持条件变量 Condition,对中断操作支持也不友好(使用不当容易导致 CPU 飙升)。

2024-04-28 22:17:09 833

原创 Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷

读锁是共享锁,写锁是独占锁。在过去学习的过程中我们学过 synchronized、 ReentrantLock这种独占式锁,他们的好处是保证了线程的安全,缺点是同一时刻只能有一个线程持有锁,大大的影响了效率,而之前学过的Semaphore(信号量)这种呢,虽然支持同一时刻被多个线程获取,但它不能很好的保障线程安全性,我们需要的是一种效率高、安全性好的同步锁。,因为在写的时候,是独占模式,其他线程不能读也不能写,这时候若有大量的读操作的话,那这些线程也只能等待着,从而带来写饥饿。那么这个读写锁如何使用呢?

2024-04-27 16:05:53 690 1

原创 大厂高频面试题:ReentrantLock 与 synchronized异同点对比

Condition是 JDK1.5 之后才有的,它具有很好的灵活性,比如可以实现多路通知功能也就是在一个Lock对象中可以创建多个Condition实例(即对象监视器),线程对象可以注册在指定的Condition中,从而可以有选择性的进行线程通知,在调度线程上更加灵活,我们在后面的学习中会耽误聊一聊它!很明显在数据量比较大的时候,竞争激烈时,ReentrantLock的性能要比synchronized好很多,但在数据量较低的情况下,会呈现出不同的结果。如果本篇博客对您有一定的帮助,大家记得。

2024-04-21 15:27:12 1534

原创 从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁

在学习ReentrantLock之前,我们先来复习一下如下的几类锁的定义,这个其实很早的博文中就已经详细的整理过了,这里为了更好理解ReentrantLock锁,还是简单罗列一下。

2024-04-21 10:54:50 854

原创 面试官:说一说CyclicBarrier的妙用!我:这个没用过...

在过去的几天里,我们基于AQS学习了不少内容,其中基于AQS构建的同步工具类也学了Semaphore(信号量)和CountDownLatch(倒计时器),甚至于也手撕过同步器,今天我们继续来学习另外一个同步类:CyclicBarrierCyclicBarrier(循环屏障):让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。

2024-04-15 21:05:58 415

原创 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这...

在CountDownLatch中通过countDown来减少倒计时数,这是最重要的一个方法,我们继续跟进源码看到它通过releaseShared()方法去释放锁,这个方法是AQS内部的默认实现方法,而在这个方法中再一次的调用了tryReleaseShared(arg),这是一个AQS的钩子方法,方法内部仅有默认的异常处理,真正的实现由CountDownLatch内部类Sync完成。执行结果体现出了倒计时的效果每隔1秒进行3,2,1的倒数;如果本篇博客对您有一定的帮助,大家记得。

2024-04-14 14:44:44 564

原创 今天我们来聊一聊Java中的Semaphore

在前面我们讲过的synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,而Semaphore(信号量)可以用来控制同时访问特定资源的线程数量,多线程同时操作共享资源,仍然存在着线程不安全问题,要想多线程安全,理应结合锁进一步保障。

2024-04-13 20:03:16 792

原创 美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了

在上一篇文章中我们就已经提过了AQS是基于 模版方法模式1. 使用者继承 AbstractQueuedSynchronizer 并重写指定的方法;2. 将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。在模版方法模式下,有个很重要的东西,那就是“钩子方法”,这是一种抽象类中的方法,一般使用 protected 关键字修饰,可以给与默认实现,空方法居多,其内容逻辑由子类实现,为什么不适用抽象方法呢?因为,抽象方法需要子类全部实现,增加大量代码冗余!

2024-04-10 18:58:42 774

原创 到底什么是AQS?面试时你能说明白吗!

好啦,到这里我们对于AQS的学习就告一段落啦,后面我们准备使用AQS去自定义一个同步类,持续关注唷😊😊😊。

2024-04-03 17:19:35 757

原创 京东一面挂在了CAS算法的三大问题上,痛定思痛不做同一个知识点的小丑

关于CAS算法以及其存在的三大问题到这里就说完了,现在再回头来看,京东这道面试题很简单,然而由于当年的不努力变成了一种遗憾说出,希望小伙伴们能够引以为戒!

2024-03-30 08:53:13 1030

原创 工作中总结的30个常用Linux指令,实在记不住就别硬记了,看这篇就够了

最近发现自己记忆力严重下滑,很多sql命令,linux命令都记不住,特别是linux命令,很多命令参数很多,一段时间不用,再去使用就需要从网上重查了,很烦人,为此花了一些时间把之前笔记中的Linux命令给整理了一下,汇总出30个常用的分享出来,下次再想不起来直接看这篇文章就行了。list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)、查看目录信息等等。2、Linux指令-cd切换目录,是changedirectory的缩写3、L

2024-03-26 10:19:21 942

原创 面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!

会联想的同学,我想已经猜出了大概,首先在Java中的锁都是基于对象的,既然基于对象,那它存在的地方大概率要在对象中,而我们知道在JVM中,对象分为三个部分对象头、实例数据、字节对齐,其中对象头又由Mark Word和Klass Point构成,而Mark Word(标记字段)用于存储对象自身的运行时数据,例如存储对象的HashCode,分代年龄、锁标志位等信息,是synchronized实现轻量级锁和偏向锁的关键。5️⃣进入重量级锁的状态,这个时候,自旋的线程进行阻塞,等待之前线程执行完成并唤醒自己。

2024-03-24 21:29:00 906

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除