synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。 但不可否认的是synchronized依然是并发首选工具,连volatile、CAS、ReentrantLock都无法动摇synchronized的地位。synchronized是工作面试中的必备技能,今天就跟着一灯一块深入剖析synchronized底层到底做了哪些优化? synchronized是用来加锁的,而锁是加在对象上面,所以需要先聊一下JVM中对象构成。 1.对象的构成 Java对象在JVM内存中由三块区域组成...

  i10tTYcpxvVZ   2023年11月01日   36   0   0 Java

工作面试中经常遇到ThreadLocal,但是很多同学并不了解ThreadLocal实现原理,到底为什么会发生内存泄漏也是一知半解?今天一灯带你深入剖析ThreadLocal源码,总结ThreadLocal使用规范,解析ThreadLocal高频面试题。 1.ThreadLocal是什么 ThreadLocal是线程本地变量,就是线程的私有变量,不同线程之间相互隔离,无法共享,相当于每个线程拷贝了一份变量的副本。 目的就是在多线程环境中,无需加锁,也能保证数据的安全性。 2.ThreadLocal的使用 / @author一灯架构 @apiNoteThreadLocal示例 / publicc...

  i10tTYcpxvVZ   2023年11月01日   66   0   0 Java

上篇文章我们讲了synchronized的用法和实现原理,我们总爱说synchronized是重量级锁,volatile是轻量级锁。为什么volatile是轻量级锁,体现在哪些方面?以及volatile的作用和实现原理是怎样的?本篇带你一块学习一下。 1.volatile是什么? volatile是Java提供的一种轻量级的同步机制。与synchronized修饰方法、代码块不同,volatile只用来修饰变量。并且与synchronized、ReentrantLock等重量级锁不同的是,volatile更轻量级,因为它不会引起线程上下文的切换和调度。 2.volatile的作用 说volat...

  i10tTYcpxvVZ   2023年11月01日   67   0   0 Java

Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意。 可能很多同学能够很轻松的背出JVM、分布式事务、高并发、秒杀系统、领域模型等高难度问题,但是对于Java基础问题不屑一顾。这种抓大放小的初衷是对的,要是碰到深究基础细节的面试官,就抓瞎了。 今天一灯带你一块深入剖析Java传递的底层原理,看完这篇文章再去面试,面试官肯定要竖起大拇哥夸你: “小伙子,你是懂Java传递的!” 1.什么是形参和实参 形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。 实参:就是实际参数,用于...

  i10tTYcpxvVZ   2023年11月01日   65   0   0 Java

深拷贝与浅拷贝的问题,也是面试中的常客。虽然大家都知道两者表现形式不同点在哪里,但是很少去深究其底层原理,也不知道怎么才能优雅的实现一个深拷贝。其实工作中也常常需要实现深拷贝,今天一灯就带大家一块深入剖析一下深拷贝与浅拷贝的实现原理,并手把手教你怎么优雅的实现深拷贝。 1.什么是深拷贝与浅拷贝 浅拷贝:只拷贝栈内存中的数据,不拷贝堆内存中数据。 深拷贝:既拷贝栈内存中的数据,又拷贝堆内存中的数据。 2.浅拷贝的实现原理 由于浅拷贝只拷贝了栈内存中数据,栈内存中存储的都是基本数据类型,堆内存中存储了数组、引用数据类型等。 使用代码验证一下: 想要实现clone功能,需要实现Cloneable接...

  i10tTYcpxvVZ   2023年11月01日   48   0   0 Java

在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁。Synchronized是基于JVM实现,而ReentrantLock是基于Java代码层面实现的,底层是继承的AQS。 AQS全称AbstractQueuedSynchronizer,即抽象队列同步器,是一种用来构建锁和同步器的框架。 我们常见的并发锁ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁。 当我仔细研究AQS底层加锁原...

  i10tTYcpxvVZ   2023年11月01日   52   0   0 Java

我们常见的并发锁ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁。 上篇文章讲了AQS的加锁流程,这篇文章再一块看一下AQS具体源码实现。 先回顾一下AQS的加锁流程 1.AQS加锁流程 AQS的加锁流程并不复杂,只要理解了同步队列和条件队列,以及它们之间的数据流转,就算彻底理解了AQS。 当多个线程竞争AQS锁时,如果有个线程获取到锁,就把ower线程设置为自己 没有竞争到锁的线程,在同步队列中阻塞(同步队列采用双向链表,尾插法)。 持有锁的线程调用await方...

  i10tTYcpxvVZ   2023年11月01日   42   0   0 Java

ReentrantLock和Synchronized都是Java开发中最常用的锁,与Synchronized这种JVM内置锁不同的是,ReentrantLock提供了更丰富的语义。可以创建公平锁或非公平锁、响应中断、超时等待、按条件唤醒等。在某些场景下,使用ReentrantLock更适合,功能更强大。 前两篇文章,我们分析了AQS的加锁流程、以及源码实现。当时我们就说了,AQS使用了模板设计模式,父类中定义加锁流程,子类去实现具体的加锁逻辑。所以大部分加锁代码已经在父类AQS中实现了,导致ReentrantLock的源码非常简单,一块学习一下。 先看一下ReentrantLock怎么使用? ...

  i10tTYcpxvVZ   2023年11月01日   73   0   0 Java

线程池无论是工作还是面试都是必备的技能,但是很多人对于线程池的实现原理却一知半解,并不了解线程池内部的工作原理,今天一灯就带大家一块剖析线程池底层实现原理。 1.为什么要使用线程池 使用线程池通常由以下两个原因: 频繁创建销毁线程需要消耗系统资源,使用线程池可以复用线程。 使用线程池可以更容易管理线程,线程池可以动态管理线程个数、具有阻塞队列、定时周期执行任务、环境隔离等。 2.线程池的使用 / @author一灯架构 @apiNote线程池示例 / publicclassThreadPoolDemo{ publicstaticvoidmain(String[]args){ //1.创建...

  i10tTYcpxvVZ   2023年11月01日   57   0   0 Java

背景介绍: 你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官! 面试官:小伙子,我看你简历上写的项目中用到了线程池,你知道线程池是怎样实现复用线程的? 这面试官是不是想坑我?是不是摆明了不让我通过? 难道你不应该问线程池有哪些核心参数?每个参数具体作用是什么? 往线程池中不断提交任务,线程池的处理流程是什么? 这些才是你应该问的,这些八股文我已经背熟了,你不问,瞎问什么复用线程? 幸亏我看了一灯的八股文,听我给你背一遍! 我:线程池复用线程的逻辑很简单,就是在线程启动后,通过while死循环,不断从阻塞队列中拉取任务,从而达到了复...

  i10tTYcpxvVZ   2023年11月01日   114   0   0 Java

上篇文章谈到BlockingQueue的使用场景,并重点分析了ArrayBlockingQueue的实现原理,了解到ArrayBlockingQueue底层是基于数组实现的阻塞队列。 但是BlockingQueue的实现类中,有一种阻塞队列比较特殊,就是SynchronousQueue(同步移交队列),队列长度为0。 作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据。同样,从队列中取数据的时候,必须等待另一个线程往队列中放数据。 这样特殊的队列,有什么应用场景呢? 1.SynchronousQueue用法 先看一个SynchronousQueue的简单用例: / @aut...

  i10tTYcpxvVZ   2023年11月01日   27   0   0 Java

众所周知Redis有以下几种常见的数据类型String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Sortedset(有序集合)、Stream(流)、Geo(地理空间索引)、Bitmap(位图)、HyperLogLog(基数统计)等。 我们最常用的就是String(字符串)类型,String类型既可以存储字符串,也可以存储数字,甚至可以直接进行数值运算。 redis>setkey1value1 OK redis>getkey1 "value1" redis>setkey1 Ok redis>INCRkey (integer)2 Redis是使...

  i10tTYcpxvVZ   2023年11月01日   71   0   0 NoSQL

1.Redis介绍 Redis是一个高性能的键值存储系统,支持多种数据结构。 包含五种基本类型String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图)。 每种数据结构都是为了解决特定问题而设计的,适用不同的场景。想要用好Redis,必须了解底层实现原理和使用技巧,同时结合具体的业务场景和需求进行选择和使用。无论是工作还是面试中,这些必备的知识。 下面就详细介绍一下每种数据类型的使用方式、实现原理和适用场景。 2.String(字符串) String(字符串)是R...

  i10tTYcpxvVZ   2023年11月01日   29   0   0 NoSQL

1.Redis简介 Redis是一个开源的,基于内存的,高性能的键值型数据库。它支持多种数据结构,包含五种基本类型String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。 Redis还提供了多种特性,如持久化、事务、发布订阅、Lua脚本、管道、主从复制、哨兵机制、集群机制等,可以保证数据的安全性、一致性和可用性。 Redis的速度非常快,官方称其可以达到每秒10万次的读写操作。和其他数据库相比,Redis有着明显的优势。例如,和M...

  i10tTYcpxvVZ   2023年11月01日   135   0   0 NoSQL

1.为什么要持久化 Redis是基于内存存储的数据库,如果遇到服务重启或者崩溃,内存中的数据将会被清空。所以为了确保数据安全性和可靠性,我们需要将内存中的数据持久化到磁盘上。 持久化不仅可以防止由于系统故障、重启或者其他原因导致的数据丢失。还可以用于备份、数据恢复和迁移等操作。 2.Redis持久化机制概述 Redis提供了两种主要的持久化机制:RDB持久化和AOF持久化。此外,还可以采用混合持久化(RDB+AOF)的方式,将这两种持久化方式结合在一起。下面我们简要概述这些持久化机制。 2.1RDB持久化 RDB(RedisDataBase)持久化是一种基于快照的持久化方式。在指定的时间间隔...

  i10tTYcpxvVZ   2023年11月01日   99   0   0 NoSQL

1.Redis集群简介 1.1什么是Redis集群 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务,提高整体性能和可靠性。根据搭建的方式和集群的特性,Redis集群主要有三种模式:主从复制模式(Master-Slave)、哨兵模式(Sentinel)和Cluster模式。 1.2Redis集群的作用和优势 高可用性:Redis集群可以在某个节点发生故障时,自动进行故障转移,保证服务的持续可用。 负载均衡:Redis集群可以将客户端请求分发到不同的节点上,有效地分摊节点的压力,提高系统的整体性能。 容灾...

  i10tTYcpxvVZ   2023年11月01日   67   0   0 NoSQL

1.简介 1.1什么是Redis事务 Redis事务(Transaction)通过将多个Redis操作封装为一个原子性的操作序列,确保在事务执行过程中,不会受到其他客户端的干扰。从而在保证数据一致性的同时,协调并发,提高数据操作的效率和性能。 1.2Redis事务的应用场景 在分布式系统和高并发场景下,事务处理具有重要意义。Redis事务可以确保数据的一致性,避免并发操作导致的数据不一致问题。以下是一些Redis事务的应用场景: 批量操作:Redis事务可以将多个命令打包成一个单元来执行,可以减少与Redis服务器的通信次数,从而提高性能。 数据库迁移:在迁移数据时,需要保证数据一致性。通...

  i10tTYcpxvVZ   2023年11月01日   93   0   0 NoSQL

1.问题:怎么给线上表加字段? 工作中最常遇到的问题,怎么给线上频繁使用的大表添加字段? 比如:给下面的用户表(user)添加年龄(age)字段。 CREATETABLE`user`( `id`intNOTNULLAUTO_INCREMENTCOMMENT'主键', `name`varchar(100)DEFAULTNULLCOMMENT'姓名', PRIMARYKEY(`id`) )ENGINE=InnoDBCOMMENT='用户表'; 有同学会说,这还不简单,直接加不加完了,用下面的命令: ALTERTABLE`user`ADD`age`intNOTNULLDEFAULT'0'COMME...

  i10tTYcpxvVZ   2023年11月01日   211   0   0 MySQL

大家好,我是一灯,今天一块学习一下如何优雅安全的备份MySQL数据? 1.为什么要备份数据 先说一下为什么需要备份MySQL数据? 一句话总结就是:为了保证数据的安全性。 如果我们把数据只存储在一个地方,如果物理机器损坏,会导致数据丢失,无法恢复。 还有就是我们每次手动修改线上数据之前,为了安全起见,都需要先备份数据。防止人为的误操作,导致弄脏数据或弄丢数据。 2.怎样备份MySQL数据? 想要快速简单粗暴备份MySQL数据,可以使用mysqldump命令: 备份test数据库 mysqldump-uroot-ptest>backup.db 但是这样备份的可能包含脏数据,比如在我们备份...

  i10tTYcpxvVZ   2023年11月01日   166   0   0 MySQL
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~