- 博客(76)
- 收藏
- 关注
原创 工作中总结的30个常用Linux指令,实在记不住就别硬记了,看这篇就够了
最近发现自己记忆力严重下滑,很多sql命令,linux命令都记不住,特别是linux命令,很多命令参数很多,一段时间不用,再去使用就需要从网上重查了,很烦人,为此花了一些时间把之前笔记中的Linux命令给整理了一下,汇总出30个常用的分享出来,下次再想不起来直接看这篇文章就行了。list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)、查看目录信息等等。2、Linux指令-cd切换目录,是changedirectory的缩写3、L
2024-03-26 10:19:21 619
原创 面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
会联想的同学,我想已经猜出了大概,首先在Java中的锁都是基于对象的,既然基于对象,那它存在的地方大概率要在对象中,而我们知道在JVM中,对象分为三个部分对象头、实例数据、字节对齐,其中对象头又由Mark Word和Klass Point构成,而Mark Word(标记字段)用于存储对象自身的运行时数据,例如存储对象的HashCode,分代年龄、锁标志位等信息,是synchronized实现轻量级锁和偏向锁的关键。5️⃣进入重量级锁的状态,这个时候,自旋的线程进行阻塞,等待之前线程执行完成并唤醒自己。
2024-03-24 21:29:00 849
原创 是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
关于synchronized的介绍其实远没有结束,还有很多细节可以值得学习,我们会在后面的文章中逐渐补充,避免文章过长,读者失去阅读的耐心!
2024-03-23 10:28:16 703
原创 您真的了解Java中的锁吗?这7种不同维度下的锁知道吗?
OK,今天关于锁的介绍就写到这里啦,本文先做一个总体上的概括,在后续的更新中会做详细介绍呀!😊。
2024-03-20 21:16:04 560
原创 走进volatile的世界,探索它与可见性,有序性,原子性之间的爱恨情仇!
我们定义了2个线程,一个用来求和操作,一个用来赋值操作,因为定义的是成员变量,所以代码(1)(2)(3)(4)之间不存在依赖关系,在运行时极可能发生指令重排序,如将(4)在(3)前执行,顺序为(4)(1)(3)(2),这时输出的就是0而不是4,但在很多性能比较好的电脑上,这种重排序情况不易复现。关键字,这个单词中文释义为:不稳定的,易挥发的,在Java中代表变量修饰符,用来修饰会被不同线程访问和修改的变量,对于方法,代码块,方法参数,局部变量以及实例常量,类常量多不能进行修饰。那这个问题怎么解决呢?
2024-03-17 21:43:33 1015
原创 关于volatile与指令重排序的探讨
我们定义了2个线程,一个用来求和操作,一个用来赋值操作,因为定义的是成员变量,所以代码(1)(2)(3)(4)之间不存在依赖关系,在运行时极可能发生指令重排序,如将(4)在(3)前执行,顺序为(4)(1)(3)(2),这时输出的就是0而不是4,但在很多性能比较好的电脑上,这种重排序情况不易复现。OK,知道了这些内容之后,我们再回头看代码示例2中,增加了volatile关键字后的执行顺序,在赋值线程启动后,执行顺序会变成(3)(4)(1)(2),这时打印的结果就为4啦!原创不易,转载请联系Build哥!
2024-03-17 21:35:34 891
原创 面试官:volatile如何保证可见性的,具体如何实现?
其实volatile关键字不仅仅能解决可见性问题,还可以通过禁止编译器、CPU 指令重排序和部分 happens-before 规则,解决有序性问题,我们放在下一篇聊。
2024-03-16 22:09:18 1094
原创 面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
Java内存模型讲到这里,也就差不多讲完了,其实中间还有缓存一致性协议JSR-133文档volatile等关键字可以展开说一说,但那样篇幅太长,而且内容多乏味,就一笔带过了,感兴趣的小伙伴自己去网上搜一些博文看看吧。
2024-03-16 15:40:06 747
原创 一张图搞清楚wait、sleep、join、yield四者区别,面试官直接被征服!
(1)sleep()与wait()的区别?sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法;JDK1.8 sleep() wait() 均需要捕获 InterruptedException 异常;sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用;sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;
2024-03-14 22:12:34 627
原创 在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
,这是一种协作机制,当其他线程通知需要被中断的线程后,线程中断的状态被设置为 true,但是具体被要求中断的线程要怎么处理,完全由被中断线程自己决定,可以在合适的时机中断请求,也可以完全不处理继续执行下去,这样一来,安全性就得到了保障。这个方法使用了@Deprecated修饰,代表着它是废弃的方法,在Java的编码规约中,过时的方法不建议继续使用,并且在这个方法的注释中官方也提示说这是一个不安全的强制恶意中断方法,会破坏线程的原子性。Ok,写了那么多,我们来写一个小的demo测试一下线程中断的方法。
2024-03-13 11:59:41 444
原创 面试官:线程调用2次start会怎样?我支支吾吾没答上来
OK,今天就讲这么多啦,其实现在回头看看,这仅是一个简单且微小的细节而已,但对于刚准备步入职场的我来说,却是一个难题,今天写出来,除了和大家分享一下Java线程中的小细节外,更多的是希望正在准备面试的小伙伴们,能够心细,多看源码,多问自己为什么?并去追寻答案,Java开发不可浅尝辄止。
2024-03-11 20:06:10 730
原创 面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会
OK,写到这里,关于守护线程的内容就讲完了,我们从什么是守护线程,守护线程的使用场景,优先级,注意事项等方面,进行了全面的介绍。其实说实话,在我们日后工作中,很少直接使用上守护线程,所以它看似没那么重要,但在很多Java多线程相关的书籍中绝对都有提及,很多小伙伴在学习的过程中认为这个点不重要,也就相当然的忽略了,但遇到变态的面试官,专门挑拣一些偏僻的知识点考你时,难免陷入尴尬,所以希望借助这个考题,大家能够在日后更细心的学习哈。
2024-03-09 15:52:27 1164 1
原创 Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种
在Java中创建线程的方式只有一种:通过Thread.start()调用 start()方法,会启动一个线程并使线程进入就绪状态,当分配到时间片后开始运行。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容
2024-03-07 19:40:06 553
原创 面试官让说出8种创建线程的方式,我只说了4种,然后挂了。。。
OK,我们根据面试官的需求,写出了10种创建线程的方式,如果再细分,甚至还可以更多,毕竟线程池的工具类还有没往上写的呢。那么,我们一起静默3分钟,好好思考一下,在Java中创建一个线程的本质,真的是八股文中所说的3种、4种、8种,甚至更多吗?Build哥认为,真正创建线程的方式只有1种,其他的衍生品都算套壳!考虑到本篇已经六七千字了,所以我们在下一篇文章中来分析一下为什么“真正创建线程的方式只有1种!
2024-03-07 10:14:47 917
原创 一文讲明白Java中线程与进程、并发与并行、同步与异步
ok,everybody,在过去的两周内,我们大体上讲完了Java的集合,在最后我们探讨了关于HashMap线程不安全的原因,又提出了ConcurrentHashMap这个线程安全的集合解决方案,那么在接下来的2-3周内,我们就一起来学习一下Java中的并发多线程。一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源(堆,字符串常量池(JDK1.8)/方法区(JDK1.7));一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器,栈区域;
2024-03-04 22:50:51 709
原创 面试官:集合使用时应该注意哪些问题?我:应该注意该注意的问题!
以上就是结合开发手册和自己平时开发经验,写的六点注意事项,希望所有小伙伴都能够在日后的开发工作中,保持良好的开发规范与习惯,强烈建议每个人必看《阿里巴巴 Java 开发手册》,这是很多互联网企业,新员工入职必看书籍,虽然里面有些内容,个人感觉有点矫枉过正,但90%以上的约定都非常必要!
2024-03-03 23:33:51 1172
原创 为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
这篇文章的时候,漏了一个知识点,知道晚上吃饭的时候才凸显想到,关于ConcurrentHashMap在存储Key与Value的时候,是否可以存null的问题,按理说这是一个小问题,但build哥却不敢忽视,尤其在现在很多面试官都极具挑剔的环境下,万一同学们刷到了咱的博客,回答中遗漏了这个小细节,错过了面试官的考验,那咱可就成罪人了。很多同学们可能会以为ConcurrentHashMap不过是HashMap在多线程环境下的版本,底层实现都一致,只是多了加锁的操作,所以二者对于null的允许程度是一样。
2024-03-02 21:42:05 896
原创 HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!
文章写到这里,ConcurrentHashMap的介绍基本讲完了,我们现在来自我总结一下为啥它的效率又高,又能保证线程安全。Node + CAS + synchronized 保证并发安全,每次上锁的颗粒度细到链表或红黑树的根节点,不会影响其他Node的读写,此外CAS是轻量级的,synchronized 也经过了锁升级;JDK1.7的版本里采用的Segment 分段锁,颗粒度粗不说,Segment 的个数一旦初始化就不能改变。
2024-03-02 15:14:53 1204
原创 面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种
以上就是HashMap中常用的7种遍历方式了,在工作中还是经常用得到的,所以希望小伙伴们能够记住并熟练使用哈。
2024-02-29 22:20:03 1024
原创 耗时3天写完的HashMap万字解析,争取一篇文章讲透它,面试官看了都直点头!
哎呀,妈呀!陆陆续续的写了3天,中间老是有工作琐事打断,每天抽空写一点,终于总结完了HashMap,大致的覆盖了HashMap的常见面试题,很多细节可能还是不足,后面有时间了再进行补充哈,多担待。
2024-02-27 21:00:22 902
原创 面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
源码就不在这里展示了,爱钻研的小伙伴可以自己去看哈。讲到这里,我们可以对比Comparable接口进行阐述,解释一下为什么有个相似的比较排序接口,还要设计Comparator,因为很多时候我们并不想破坏原始类的结构,比如Person类中,我们只需要它拥有age和name,不想写一些实现方法在其中,这个时候就需要。我们跟进去看一下sort()方法的底层源码,会发现,在它的底层实际上Arrays.sort进行数组排序,而使用的比较器,就是我们传入的自定义PersonalComparator 对象。
2024-02-23 18:03:45 255
原创 面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
我们创建一个包含ArrayList容器,里面包含aaa,bbb,ccc元素,通过调用str对象的iterator()方法去遍历元素,然后将遍历的元素打印出来,如上输出(这部分可以手撕给面试官看,方便后续的展开阐述)反编译后我们可以看得出,底层的实现就是迭代器,而这个for-each的写法不过是Java的一个语法糖罢了,这部分属于附加题,讲不明白的,可以不提。当面试官问到这个问题的时候,我们心中一喜,因为他成功的被我们引导到了我们熟悉的方向上,那么接下来,我们要好好唠一唠了!
2024-02-21 19:37:42 758
原创 Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
作为Queue的子类,它的特点是元素出队顺序是与优先级相关,利用二叉堆的数据结构来实现的,底层使用可变长的数组来存储数据,默认是小顶堆,但可以接收一个 Comparator 作为构造参数,从而来自定义元素优先级的先后。因为队列中的元素是通过小顶堆方式来确定优先级的,而小顶堆是一个完全二叉树,这就导致的队列输出为排序后的结果。队列的特点:存储的元素是有序的、可重复的。作为双端队列的实现类,是基于可变长的数组和双指针来实现,常常被用于实现栈功能,以此来替代曾经那个笨拙的Stack。
2024-02-18 22:31:05 612
原创 Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
HashSet、LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。HashSet、LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。
2024-02-18 17:52:53 1310
原创 Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
其实在List的继承关系中,除了ArrayList和LinkedList之外,还有另外一个集合类stack(栈),它继承自vector,线程安全,先进后出,随着Java并发编程的发展,它在很多应用场景下被逐渐替代,成为了Java的遗落之类。入栈表示将元素放入栈顶,而出栈表示从栈顶取出元素。在Java的工具包中其实帮我们封装好了一个类,java.util.Stack,它所提供的方法并不多,我们通过一个小示例感受一下。通过上面的代码示例我们了解了一个栈所具备的功能特点,根据它的特点,我们尝试一下手写一个栈!
2024-02-18 14:59:38 337
原创 Java集合篇之深入解析LinkedList
作为ArrayList的同门师兄弟,LinkedList的师门地位逊色不少,除了在做算法题的时候我们会用到它之外,在实际的开发工作中我们极少使用它,就连它的创造者都说:“I wrote it,and I never use it”,想想颇有点好笑,但这并不影响我们去学习它,个人认为它底层的链表逻辑对于我们代码思想的培养还是挺有帮助的。我们看过RandomAccess 接口的底层的同学知道,这个接口也是个标识性接口,只要实现了这个接口就意味着支持通过索引访问元素。如果本篇博客对您有一定的帮助,大家记得。
2024-02-17 21:21:06 1114
原创 Java集合篇之深入解析ArrayList,这六问你答的上来吗?
二者都是List的实现类,底层都通过object[]数组实现,但Vector是早起JDK支持的集合类,目前几乎全部ArrayList替代,二者有着相似的增删改查功能,但不同的是,Vector的方法都是同步的,可以保证线程安全,而ArrayList则不是,因此,ArrayList相较于Vector拥有良好的性能;,春节期间就是咔咔乱吃,咔咔乱玩,把学习都抛一边子去了,已经9天没有学习了,深深的懊悔,从今天开始,2024年的学习正式开启,一起给我猛冲!不使用泛型的时候,可以添加不同类型元素。
2024-02-17 11:41:30 625
原创 盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
本文的重心是Java集合的盘点,Collection和Map的引出,各子类的特点比较,针对很多常用的子类并没有展开过多的叙述,后面会按个的学习按个的梳理滴,毕竟这一块内容有非常多的考点,至少得更新个十几篇博文才能讲个大概,继续保持耐心,继续保持学习,一起冲!!!
2024-02-07 12:18:23 994
原创 Promise, async, await实现异步编程,代码详解
其实最近在不断的更新Java的知识,从基础到进阶,以及计算机基础、网络、WEB、数据库、数据结构、Linux、分布式等等内容,预期写成一个既可以学习提升又可以面试找工作的《Java成长之路》!算是对自己学习的总结(笔记),也算是一种程序猿的记忆,现在大环境那么差,万一哪天转行了,还能当做一种记忆。以往的博客都是按照知识点的顺序发的,但今天一个大一的粉丝私信问JS异步编程内容,决定先理一理这块内容,想着后面如果还是有类似的咨询,则会破坏原有发文顺序,进行交叉更新,最后,会将所有内容汇总成PDF,发给需要的朋友
2024-02-03 12:20:51 932
原创 由反射引出的Java动态代理与静态代理
在Java中有多达23种的设计模式(后面Java基础更新完后,会找个时间详细的去写写这些设计模式),恰当的设计模式的使用能够提升代码的效率,简化代码的复杂性。所谓静态代理,一般是针对编译期就已经完成了接口,实现类,代理类的定义,我们对目标对象的增强需要手工去完成,一个目标对象就要有个代理类,非常不灵活。这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代理!OK,终于码完了动态代理,自己还去看了很久的源码,头昏脑涨!
2024-02-02 17:43:09 782
原创 每日一道Java面试题:说一说Java中的异常
受检查异常范围:IO 相关的异常、ClassNotFoundException、SQLException等,或者说除了运行时异常(RuntimeException)及其子类外,其他的异常几乎都是受检查异常。看完上面的内容,想必大家对于Java中的异常已经有了一个基本的了解了,其实,在Java中异常的分类有很多种,我们通过一个思维导图,快速了解。在Java中有个Throwable类,为所有异常的祖先类,其下又分为两个子类,分别为Exception(异常)和Error(错误)。我:“小二,上代码!
2024-02-01 21:52:28 366
原创 深入剖析Java中的反射,由浅入深,层层剥离!
Class也是一个类,存放在java.lang包中,它的作用是:编译时生成一个类的Class对象,这个对象中包含了类的结构信息,如类名、继承父类、实现的接口、方法、属性等等,Class对象保存在编译后的.class文件中。之前更新了不少Java的基础知识,比如Java的类、对象、基础类型、关键字、序列化、泛型、值传递等等,今天要上点深度了,来聊一聊Java中的。在java.lang.reflect包中存着几个反射常用的类,大概的罗列如下,注意,Class类其实是放在java.lang中的。
2024-02-01 18:45:08 921
原创 每日一道Java面试题:说一说Java中的泛型?
什么是泛型?这是个好问题,JDK5更新时带来了一个新特性-泛型,所谓“泛型”就是类型参数化,把类型定义成参数的形式(编译期-类型形参),调用时再传入具体的类型(调用时-类型实参)。了解了定义之后,我们再来直观的感受一下泛型的魅力吧不使用泛型使用泛型以上就是使用泛型和不适用泛型时代码的对比,可以看出在使用泛型后无需类型强转,这样更安全,代码可读性也更好啦。
2024-01-31 21:41:40 629
原创 每日一道面试题:Java中序列化与反序列化
哈喽大家好,在高铁上码字的感觉是真不爽啊,小桌板又拥挤,旁边的小朋友也比较的吵闹,影响思绪,但这丝毫不影响咱学习的劲头!哈哈哈,在这喧哗的车厢中,思考着这样的一个问题,Java中的对象是如何在各个方法,或者网络中流转的呢?但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。毋容置疑,这是一个无形中都会用到的知识点!这种实现方式是JDK自带的,方便好用,易于实现,代码逻辑不复杂,但它有着诸多的致命缺陷,导致很多大厂不会使用这种方式。
2024-01-28 21:22:12 1171
原创 每日一道Java面试题:Java是值传递还是引用传递?
看完了如上的例子,大家对Java的参数传递有没有更深的了解了呢,通过上面的几个例子我们可以得出这样的总结:Java中将实参传递给方法(或函数)的方式是值传递如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。如果参数是引用类型,传递的就是实参所引用的对象在堆中地址值的拷贝,同样也会创建副本。
2024-01-26 23:10:50 638
原创 每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
这个问题应该是各大厂面试时问的最多的话题之一了,它们几乎贯穿了我们日常的开发工作,在过往的博客中我们多多少少都提到过重载与重写,而今天我们就一起来详细的学习一下这二者的功能与区别!重写: 类实现接口或者子类继承父类时,保持方法签名相同,用不同的方法体来实现不同的功能,这也是Java三大特性之一多态的具体实现,是垂直方向的“类间行为”。重载: 在同一个类或者父类与子类之间,保持方法名称相同,参数类型,参数数量,参数顺序不同的一种实现,是水平方向上的“类内行为”,同一个类中,或者父子类中。如下代码中是一个最简单
2024-01-25 22:18:08 604
原创 两千字讲明白java中instanceof关键字的使用!
instanceof 运算符是用来在运行时判断对象是否是指定类及其父类的一个实例(包括接口),因为比较的是对象,故不能应用于基本数据类型中!咱们直接上一段代码,感受一下instanceof的魅力吧true这段代码满足“对象是否是指定类及其父类的一个实例”,所以才返回true。其实,这里面也涉及到Java中的is-a关系,在这里做一下小小的知识延伸吧。
2024-01-23 20:10:50 406
原创 面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?
finalize() 是在 java.lang.Object 里定义的,Object 的 finalize() 方法什么都不做,对象被回收时 finalize() 方法会被调用。finally 异常处理的一部分,它只能用在 try/catch 语句中,表示希望 finally 语句块中的代码最后一定被执行(存在一些情况导致 finally 语句块不会被执行,如 jvm 结束)特殊情况下,可重写 finalize() 方法,当对象被回收的时候释放一些资源,须调用 super.finalize()。
2024-01-22 22:09:35 412
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人