Java多线程与并发编程 | 同步容器与&Atomic包&CAS算法
前言在多线程环境下我们日常使用的很多类都存在线程安全问题,比如ArrayList、HashSet、HashMap,那么多线程环境下我们应该如何处理好线程问题?CAS算法是什么?除了synchronized有没有别的方法实现线程安全?乐观锁?悲观锁?同步容器JUC工具包中针对这些日常开发中经常使用的集合类,给我们提供了线程安全的类来代替这些类。 ArrayList --> Co
【Redis 系列】redis 学习,Redis 集群搭建和主从复制
主从复制的理论先来说说什么是主从复制主从复制,就是将一台 redis 服务器的数据,复制到其他的 redis 服务器上, 前者为主节点 master,后者为从节点 slave数据的复制是单向的,只能是主机复制到从机,master 以写为主,slave 以读为主默认的情况下,每台 redis 服务器都是主节点,并且一个主节点都会有多个从节点或者没有从节点,但是反过来,一个从节点,只能有一
java多线程之synchronized锁的实现原理
java中synchronized是由JVM层实现的锁,而Lock的实现完全是由JAVA层实现,jdk 1.5之前synchronized是重量级锁实现,效率比较低,经过JVM·的优化,jdk1.5版本及后synchronbized的锁效率已经和Lock差不多。synchronized是通过monitorEnter和monitorExit的JVM指令实现的,下面通过一个简单demo展示
SpringBoot参数校验最佳实践
我们这里使用hibernate-validator作为对象参数验证器,所以在正式介绍SpringBoot参数验证之前,需要先简单了解一下hibernate-validator的使用。hibernate-validator基本使用引入依赖<dependency> <groupId>org.hibernate<
JVM基础——运行时数据区
程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,称之为“线程
面试官:说说Redis中Hash数据类型的底层结构
前言本文将介绍Redis中Hash数据结构的底层结构,字典。概述字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构。在字典中,一个键(key )可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。字典经常作为一种数据结构内置在很多高级编程语言里面,但Redis所使用的C语言并没有内置这种数据结构,因此 Redis构建了自己的字典实
深入理解jvm - 类加载过程
前言在最早的文章中,我们虽然讨论过了类加载器的过程,但是并没有讲述内部的细节,本文将会根据类加载器的过程,详细说一下整个类加载的过程中每一个步骤都干什么事情。类加载的过程如下:加载,验证,准备,初始化,解析,使用,卸载。重点需要关注的步骤是前面的五个步骤,这些细节算是八股文的内容,所以这篇文章以简单的总结和归纳为主。概述本篇主要讲述类加载的加载过程,在类加载的过程当中包含了前五个步骤和
JVM 常见垃圾收集器介绍
垃圾收集器如何演化的?垃圾收集器的发展路线,简单来说是随着内存越来越大而发生变化。从分代算法逐渐演化为不分代算法。从serial的几十兆,逐渐演化到parallel的几个G,再到CMS的几十个G,也从此开始了并发回收。年轻代收集器Serial特点:年轻代、串行回收、STW、简单高效Serial(串行)收集器是最基本、发展历史最悠久的收集器,它是采用复制算法的新生代收集器,曾经(JDK
Java并发编程——阻塞队列BlockingQueue
前言什么是阻塞队列?有那7种阻塞队列?为什么需要阻塞队列?通过剖析JDK 1.8 源码了解源码设计的精髓和巧妙的地方,并运用在我们实际的项目中,他山之石,可以攻玉。1. 什么是阻塞队列感觉并发编程上面的解释不是很容易理解,我们看下源码Doug Lea大佬的注释,意思是阻塞队列支持检索的时候可以等待队列变成非空(也就是阻塞等待), 存储元素的时候,等待空间可用。BlockingQueue
跟我一起来学习Redis中的时间事件
时间事件简介 Redis的时间事件分为以下两类: 定时事件:让一段程序在指定的时间之后执行一次。 周期性事件:让一段程序每隔指定时间就执行一次。一个时间事件主要由以下三个属性组成:1、id: 服务器为时间事件创建的全局唯一ID(标识号)。ID号按从小到大的顺序递增,新事件的ID号比旧事件的ID号要大。2、when: 毫秒精度的UNIX时间戳,记录了时间事件的到达(arrive
Redis架构实战:高并发情况下并发扣减库存
相信大家从网上学习项目大部分人第一个项目都是电商,生活中时时刻刻也会用到电商APP,例如淘宝,京东等。做技术的人都知道,电商的业务逻辑简单,但是大部分电商都会涉及到高并发高可用,对并发和对数据的处理要求是很高的。这里我今天就讲一下高并发情况下是如何扣减库存的?我们对扣减库存所需要关注的技术点如下: 当前剩余的数量大于等于当前需要扣减的数量,不允许超卖 对于同一个数据的数量存在用
多线程高频面试题——如何判断线程是否已经结束了
多线程、分布式、高并发是常见的面试题,所以也是我们必须掌握的知识与要点。掌握的起端就是学习,知识就是这样一点点的积累来的,那么今天我们一起来学习学习与多程序有关的知识,如何判断线程结束。示例在main函数启动6个新的线程,main函数所在的线程会等待这6个线程结束,再往下执行?还是main线程启动完6个线程之后直接往下执行呢?示例如下:package com.wangscal
SpringBoot面试杀手锏——自动配置原理
引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。Spr
SpringBoot统一接口返回和全局异常处理,大佬们怎么玩
现在大多数公司项目框架,基本都是属于前后端分离模式,这种模式会涉及到一个前后端对接问题,无论是对前端或者是后台服务,维护一套完善且规范的接口是非常有必要的,这样不仅能够提高对接效率,也可以让我的代码看起来更加简洁优雅。修改前后最大的区别是我们不用在每个接口单独捕获异常,也不用在每个接口都要组装一遍返回参数,可以参考下面这张对比图:一、SpringBoot不使用统一返回格式默认情况下,S
MySql系列:查询优化简单总结
前言有时候圈子很重要,就像上学期间大家都会发现班里有这样一类学生不怎么听课,但是就是学习好。那假如让他回家呆着,不能在课堂里呢?类似的圈子还有;图书馆、网吧、车友群、技术群等等,都可以给你带来同类爱好的人所分享出来的技能或者大家一起烘托出的氛围帮你成长。有人要问博主为什么要对MySql进行优化呢?这个问题我该怎么说呢,只要是一个有过中型以上项目开发经验的人都知道,一条MySql执行性能
手把手教你使用Spring Boot从零开始制作用户注册登录功能
用户登录是网站基本上最常见的功能了。当然,使用Spring Boot实现用户登录也不是难事,今天我将分享,从零开始制作一个用户登录功能的过程。当然,大家还是需要掌握Spring Boot基本使用以及MyBatis的配置(SSM基本操作),再来看这篇文章比较好。在最开头我们先约定:主类所在的项目包路径:com.example.userlogin,后面其余新建的软件包都在这个包路径之下。文
深入理解JVM - 阶段总结与回顾(二)
概述 第二阶段的文章回顾和总结 你真的熟悉老年代么?对象在什么时候会进入到老年代? 频繁的FULL GC通常有什么原因 优化JVM需要注意哪些点?你真的熟悉老年代回收么?传统的JVM模型采用固定分代的形式,首先我们来回顾一下老年代的回收触发条件。对象什么时候进入老年代新生代是如何回收内存的?讲述老年代回收之前,我们回顾一下新生代是如何分配内存的,没错,就是采用的 改良复
虚惊一场!运营在群里说有人删库跑路,吓得我赶紧去查数据,才发现是有人lombok踩坑了
引言今天中午正在带着耳机听着歌,遨游在代码的世界里,突然就被运营在群里给@了,气冲冲的反问我最近有删生产的用户数据的吗?我肯定客气的回答道没有呀?生产的数据我怎么能随随便便可以删除,这可是公司的红线,再说了我也没有数据库的删除权限啊,不过查询权限还是有的。于是我赶紧登上堡垒机,然后去生产数据库查一下数据,查了一下数据是还在的,吓死了,数据还在问题就不大了,无非就是应用程序出问题了,赶紧
Mybatis#foreach中相同的变量名导致值覆盖
背景使用Mybatis中执行如下查询:单元测试@Test public void test1() { String resource = "mybatis-config.xml"; InputStream&
Redis分布式锁之锁续期的源码透析!针针见血!
时间为何无法评估?你是否一定会有这样的疑问:一个同步代码块,逻辑很简单,完全可以预估一个时间。如果预估不准,通过测试取一个平均时间然后稍微做些预留即可,就可以满足我们对锁设置过期时间的评估。可是对时间的评估并不仅限于简单的业务逻辑,比如像这样一个简单逻辑:判断某条数据是否在数据库中已经存在,如果存在将某个字段更新。逻辑很简单,但是你是否考虑过网络延时导致数据库的链接建立时间较长、连接池