一、写在开头 在我们一开始讲多线程的时候,提到过异步与同步的概念,这里面我们再回顾一下: 同步:调用方在调用某个方法后,等待被调用方返回结果;调用方在取得被调用方的返回值后,再继续运行。调用方顺序执行,同步等待被调用方的返回值,这就是阻塞式调用; 异步:调用方在调用某个方法后,直接返回,不需要等待被调用方返回结果;被调用方开启一个线程处理任务,调用方可以同时去处理其他工作。调用方和被调用方是异步
我们在学线程的时候了解了几种创建线程的方式,比如继承Thread类,实现Runnable接口、Callable接口等,那对于线程池的使用,也需要去创建它,在这里我们提供2种构造线程池的方法: <font color = "DodgerBlue ">方法一: 通过ThreadPoolExecutor构造函数来创建(首选)</font> 这是JDK中最
一、写在开头 在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。 二、Runnable vs Callable 在创建线程的时候,一般会选用 Runnable 和 Callable 两种方式。 【源码对比】 Runnable接口 @FunctionalInterface public interfac
写在开头 之前给一个大四正在找工作的学妹发了自己总结的关于Java并发中线程池的面试题集,总共18题,将之取名为《Java并发编程之线程池十八问》,今天聊天时受了学妹的夸赞,心里很开心,毕竟自己整理的东西对别人起到了一点帮助,记录一下! Java并发编程之线程池十八问 经过之前的学习,我们知道在Java中创建一个线程需要调用操作系统内科API,操作系统要为创建的线程分配一系列的资源
一、写在开头 今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工作毫无问题,但现在即便你是应届生,问的考题也非常的深入和细节了,只会背八股,没有一定的代码量和项目积累,根本找不到像样的工作,具体聊天内容如下: 既然大厂的面试都拷问到ThreadLocal了,那今
一,慢查询日志的介绍 MySQL数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL,可以快速帮助我们找到需要优化的SQL位置。 二,慢查询日志开启 第一步,先通过指令查看一下自己的慢查询日志是否已经开启,如下: slow_query_log 字段对应的value值为OFF,则表示慢查询日志为关闭状态。 slow_query_log_file 字段的value值代表的是MySQL
一、写在开头 依稀记得多年以前的一场面试中,面试官从Java并发编程问到了锁,从锁问到了原子性,从原子性问到了Atomic类库(对着JUC包进行了刨根问底),从Atomic问到了CAS算法,紧接着又有追问到了底层的Unsafe类,当问到Unsafe类时,我就知道这场面试废了,这似乎把祖坟都能给问冒烟啊。 但时过境迁,现在再回想其那场面试,不再觉得面试官的追毛求疵,反而为那时候青涩菜鸡的自己感到羞愧
(Mysql学习手册(第一部分)) (一)Mysql查询语法和执行顺序 1.1 查询语法顺序 如下的这些是完整的查询语句的语法编写顺序,这其中除了LIMIT之外,都是很多关系型数据库通用的标准SQL语法: 1.SELECT 2. FROM 3.LEFT JOIN 4. ON 5. WHERE 6. GROUP BY 7. HAVING 8. ORDER BY 9. LIMIT --Mysql专有的
一、写在开头 在前面的博文中我们学习了volatile关键字,知道了它可以保证有序性和可见性,但无法保障原子性,结局原子性问题推荐使用synchronized、Lock或者AtomicInteger;我们还学习过CAS算法,在那篇博文中我们同样也提及atomic。那么今天,我们就来好好学一学Atomic原子库,一个基于CAS算法实现的高效并发工具库! 并发包 java.util.concurren
一、写在开头 我们在学习集合或者说容器的时候了解到,很多集合并非线程安全的,在并发场景下,为了保障数据的安全性,诞生了并发容器,广为人知的有ConcurrentHashMap、ConcurrentLinkedQueue、BlockingQueue等,那你们知道ArrayList也有自己对应的并发容器嘛? 作为使用频率最高的集合类之一,ArrayList线程不安全,我们在并发环境下使用,一般要辅以手
一、写在开头 昨晚收到一个粉丝在私信的留言如下: build哥,今天参加了网易的提前批,可以说是一次惨痛的面试体验?,直接被虚拟线程问倒了,无论是在校学习的时候还是在公司实习的时候,都使用的是Java8更多,或者Java11,比较点子背的是面试我的这一个面试官,他们团队刚好在做Java21的切换,因此,虚拟线程似乎是一个逃脱不掉的重点拷问对象,虽然21出来的时候知道有虚拟线程这个事情,但从没有认
一、写在开头 我们在上一篇写ReentrantReadWriteLock读写锁的末尾留了一个小坑,那就是读写锁因为写锁的悲观性,会导致 “写饥饿”,这样一来会大大的降低读写效率,而今天我们就来将此坑填之!填坑工具为:StampedLock,一个素有Java锁王称号的同步类,也是在 java.util.concurrent.locks 包中。 需要声明的是,这个类在Java的面试过程中极少被问及,
写在开头 最近是和java.util.concurrent.locks包下的同步类干上了,素有 并发根基 之称的concurrent包中全是精品,今天我们继续哈,今天学习的主题要由一个大厂常问的Java面试题开始: 小伙子,来说一说Java中的读写锁,你都用过哪些读写锁吧? 这个问题小伙伴们遇到了该如何回答呢?心里琢磨去吧,哈哈?,不过build哥的回答要用从ReentrantReadWrit
写在开头 在过去的博文中我们学习了ReentrantLock 与 synchronized这两种Java并发使用频率最高的同步锁,在很多大厂面试题中有个经典考题: ReentrantLock 与 synchronized异同点对比! 今天我们针对这一考题来做一个尽可能全面的总结哈。 ReentrantLock 与 synchronized ReentrantLock是一种独占式的可重入锁,位于
写在开头 面试官:同学,AQS的原理知道吗? 我:学过一点,抽象队列同步器,Java中很多同步工具都是基于它的... 面试官:好的,那其中CyclicBarrier学过吗?讲一讲它的妙用吧 我:啊,这个,这个我平时写代码没用过... 面试官:那你回去再学学吧! 随着Java的国内竞争环境逐渐激烈,面试时遇到很多奇葩的问题也是越来越多,以上是模拟的一个面试场景,同学们看下你们能答得上来不?? 什么是
写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这个同步工具类! CountDownLatch有何作用? 我们知道AQS是专属于构造锁和同步器的一个抽象工具类,基于它Java构造出了大量的常用同步工具,如ReentrantLock、Semaphore
写在开头 今天在牛客上看到了一个帖子,一个网友吐槽美团一面上来就让手撕同步器,没整出来,结果面试直接凉凉。 就此联想到一周前写的一篇关于AQS知识点解析的博文,当时也曾埋下伏笔说后面会根据AQS的原理实现一个自定义的同步器,那今天就来把这个坑给填上哈。 常用的AQS架构同步器类 自定义同步器实现步骤 在上一篇文章中我们就已经提过了AQS是基于 模版方法模式 的,我们基于此的自定义同步器设计一般需
写在开头 在介绍synchronized关键字时,我们提到了锁升级时所用到的CAS算法,那么今天我们就来好好学一学这个CAS算法。 CAS算法对build哥来说,可谓是刻骨铭心,记得是研二去找实习的时候,当时对很多八股文的内容浅尝辄止,很多深奥的知识点只是知道个概念,源码看的也不深,代码量也不够,京东一面,面试官问了CAS算法,大概的介绍了之后,他紧接着追问CAS的三大问题,在很多面试类书籍中背过
写在开头 在之前的博文中,我们介绍了volatile关键字,Java中的锁以及锁的分类,今天我们花5分钟时间,一起学习一下另一个关键字:synchronized。 synchronized是什么? 首先synchronized是Java中的一个关键字,所谓关键字,就是Java中根据底层封装所赋予的一种具有特殊语义的单词,而synchronized译为同步之意,可保证在同一时刻,被它修饰的方法或代码
写在开头 在之前的学习我们了解到,为了充分利用缓存,提高程序的执行速度,编译器在底层执行的时候,会进行指令重排序的优化操作,但这种优化,在有些时候会带来 有序性 的问题。 那何为有序性呢?我们可以通俗理解为:程序执行的顺序要按照代码的先后顺序。 当然,之前我们还说过发生有序性问题时,我们可以通过给变量添加volatile修饰符进行解决。那么今天,我们继续学习,一起探讨一下volatile与指令重排
写在开头 在之前的几篇博文中,我们都提到了 volatile 关键字,这个单词中文释义为:不稳定的,易挥发的,在Java中代表变量修饰符,用来修饰会被不同线程访问和修改的变量,对于方法,代码块,方法参数,局部变量以及实例常量,类常量多不能进行修饰。 自JDK1.5之后,官网对volatile进行了语义增强,这让它在Java多线程领域越发重要!因此,我们今天就抽一晚上时间,来学一学这个关键字,首先,
写在开头 在线程的生命周期中,不同状态之间切换时,可以通过调用sleep()、wait()、join()、yield()等方法进行线程状态控制,针对这一部分知识点,面试官们也会做做文章,比如问你这些方法的作用以及之间的区别。 那么今天我们就一起来总结一下这几个方法的作用及区别,先画一个思维导图梳理一下,便于理解与记忆,争取在被问到这个点时彻底征服面试官!(图片可保存常看哈) sleep() sl
写在开头 经过上几篇博文的学习,我们知道在Java中可以通过new Thread().start()创建一个线程,那今天我们就来思考另外一个问题:线程的终止 自然终止有两种情况: 1. 线程的任务执行完成; 2. 线程在执行任务过程中发生异常。 start之后,如果线程没有走到终止状态,我们该如何停止这个线程呢? 为什么stop终止不可用 翻看Thread源码后,发现其提供过一个stop()方
文编|JavaBuild大家好呀,我是JavaBuild,以后可以喊我build哥,嘿嘿!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加油学习,厚积薄发!在程序员的日常工作中,通过FTP/SFTP等工具在服务器之间进行文件的交互是一个基操技能,无论是编码开发过程中的跨系统传输文件,还是生产部署过程中的数据索取,熟练掌握这一技能,可以大大的提高开发效率。当然,现在也有很多终端模拟器提供了可视化的
写在开头 在写完上一篇文章《Java面试必考题之线程的生命周期,结合源码,透彻讲解!》后,本以为这个小知识点就总结完了。 但刚刚吃晚饭时,突然想到了多年前自己面试时的亲身经历,决定再回来补充一个小知识点! 记得是一个周末去面试Java后端开发工程师岗位,面试官针对Java多线程进行了狂轰乱炸般的考问,什么线程创建的方式、线程的状态、各状态间的切换、如果保证线程安全、各种锁的区别,如何使用等等,因为
写在开头 在前面的几篇博客里,我们学习了Java的多线程,包括线程的作用、创建方式、重要性等,那么今天我们就要正式踏入线程,去学习更加深层次的知识点了。 第一个需要学的就是线程的生命周期,也可以将之理解为线程的几种状态,以及互相之间的切换,这几乎是Java多线程的面试必考题,每一年都有大量的同学,因为这部分内容回答不够完美而错过高薪,今天我们结合源码,好好来聊一聊。 线程的生命周期 所谓线程的生命
写在开头 面试官:小伙子请聊一聊Java中的精灵线程? 我:什么?精灵线程?啥时候精灵线程? 面试官:精灵线程没听过?那守护线程呢? 我:守护线程知道,就是为普通线程服务的线程嘛。 面试官:没了?守护线程的特点,怎么使用,需要注意啥,Java中经典的守护线程都有啥? 我:不知道。。。 这的天,面试一个10K的工作,上来先整个精灵线程,直接把人整蒙了,难道提及Java多线程的时候,问的不应该是线程、
写在开头 在上篇博文中我们提到小伙伴去面试,面试官让说出8种线程创建的方式,而他只说出了4种,导致面试挂掉,在博文中也给出了10种线程创建的方式,但在文章的结尾我们提出:真正创建线程的方式只有1种,剩下的衍生品多是套壳,那么在这篇文章中,我们来解释一下缘由! 线程创建方式可先阅读这篇文章:面试官让说出8种创建线程的方式,我只说了4种,然后挂了。。。 线程创建之源 OK!咱们闲话少叙,直接进入正题,
写在开头 昨天有个小伙伴私信说自己面试挂在了“Java有几种创建线程的方式”上,我问他怎么回答的,他说自己有背过八股文,回答了:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池这四种,但是面试官让说出8种创建方式,他没说出来,面试就挂了,面试官给的理由是:只关注八股文背诵,对线程的理解不够深刻! 在这里想问一下大家,这位小伙伴回答的这四种有问题吗?看过《Java核
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号