自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 8种单例模式写法助你搞定面试

1. 单例模式常见问题为什么要有单例模式单例模式是一种设计模式,它限制了实例化一个对象的行为,始终至多只有一个实例。当只需要一个对象来协调整个系统的操作时,这种模式就非常有用.它描述了如何解决重复出现的设计问题,比如我们项目中的配置工具类,日志工具类等等。如何设计单例模式 ?单例类如何控制其实例化如何确保只有一个实例通过一下措施解决这些问题:private构造函数,类的实例话不对外开放,由自己内部来完成这个操作,确保永远不会从类外部实例化类,避免外部随意new出来新的实例。该实例通常存

2020-11-29 19:12:18 204

原创 面试时说Redis是单线程的,被喷惨了!

Redis是单线程的,这话搁以前,是横着走的,谁都知道的真理。现在不一样,Redis 变了。再说这句话,多少得有质疑的语气来跟你辩驳一番。意志不坚定的,可能就缴械投降,顺着别人走了。到底是什么样的,各位看官请跟小莱一起往下:图注:思维导图Reactor模式反应器模式,你可能不太认识,如果看过上篇文章的话应该会有点印象。涉及到 Redis 线程它是一个绕不过去的话题。1、传统阻塞IO模型在讲反应器模式前,这里有必要提一下传统阻塞IO模型的处理方式。在传统阻塞IO模型中,由一个独立的 Accep

2020-11-29 13:54:34 217

原创 疯了吧!一口气问我18个JVM问题?有没有搞错

前言GC 对于Java 来说重要性不言而喻,不论是平日里对 JVM 的调优还是面试中的无情轰炸。这篇文章我会以一问一答的方式来展开有关 GC 的内容。这篇文章解释了很多有关垃圾回收的基本知识,能从源头上理解垃圾回收和日益发展的垃圾收集器演进的方向,这很重要。本文章所说的 GC 实现没有特殊说明的话,默认指的是 HotSpot 的。我先将十八个问题都列出来,如果都清楚的话那就可以关闭这篇文章了。好了,开始表演。young gc、old gc、full gc、mixed gc 傻傻分不清?这个

2020-11-28 20:11:27 301

原创 程序员须知:面试中最容易被问到的18个算法题(附答案!)

算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。而根据统计,以下这18个问题是面试中最容易遇到的,本文给出了一些基本答案,供算法方向工程师或对此感兴趣的程序员参考。1)请简单解释算法是什么?算法是一个定义良好的计算过程,它将一些值作为输入并产生相应的输出值。简单来说,它是将输入转换为输出的一系列计算步骤。2)解释什么是快速排序算法?快速排序算法能够快速排序列表或查询。它基于分割交换排序的原则,这种类型的算法占用空间较小,它将待排序列表分为三个主要部分:小于Pivot的元素枢轴元素

2020-11-27 19:13:08 208

原创 如何优雅地处理重复请求(并发请求)

利用唯一请求编号去重你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的代码大概如下: String KEY = "REQ12343456788";//请求唯一编号 long expireTime = 1000;// 1000毫秒过期,1000ms内的重复请求会认为重复 long expireAt = System.currentTimeMillis() + expireTime;

2020-11-27 14:42:12 211

原创 京东面试官:说说你对MySQL索引的理解?

开门见山,直接上图,下面的思维导图即是现在要讲的内容,可以先有个印象~常见索引类型(实现层面)索引种类(应用层面)聚簇索引与非聚簇索引覆盖索引最佳索引使用策略1.常见索引类型(实现层面)首先不谈Mysql怎么实现索引的,先马后炮一下,如果让我们来设计数据库的索引,该怎么设计?我们首先思考一下索引到底想达到什么效果?其实就是想能够实现快速查找数据的策略,所以索引的实现本质上就是一个查找算法。但是跟普通的查找有所不同,因为我们的数据有一下特征:存储的数据是非常非常多的并且还不断的动

2020-11-26 19:11:28 112

原创 Spring Security 是如何在 Servlet 应用中执行的?

Spring Security 是一个强大的认证和授权框架,它的使用方式也非常简单,但是要想真正理解它就需要花一时间来学习了,最近在学习 Spring Security 时有一些新的理解,特意记录下来防止知识忘记的太快,毕竟好记性不如烂笔关,也给即将准备学习 Spring Security 的同志做一个参考。由于我在学习和使用是基于 Servlet Applications 的,所以文中的大部分都与 Servlet 相关,当然 Spring Security 还支持 Reactive Applicatio

2020-11-26 14:04:44 126 1

原创 读者让我总结一波 redis 面试题,现在肝出来了!

Redis 持久化机制Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。RDB是Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snap

2020-11-25 19:45:38 111

原创 让面试官心服口服:Thread.sleep、synchronized、LockSupport.park的线程阻塞有何区别?

前言在日常编码的过程中,我们经常会使用Thread.sleep、LockSupport.park()主动阻塞线程,或者使用synchronized和Object.wait来阻塞线程保证并发安全。此时我们会发现,对于Thread.sleep和Object.wait方法是会抛出InterruptedException,而LockSupport.park()和synchronized则不会。而当我们调用Thread.interrupt方法时,除了synchronized,其他线程阻塞的方式都会被唤醒。于是本文

2020-11-24 20:37:26 503

原创 面试问烂了的Java线程池执行流程,具体的执行细节你还会吗?

对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路。但是假如我是面试官,现在我想问一些更细致的问题,你还能答得上来吗?比如:线程池是如何实现线程复用的?如果一个线程执行任务的时候抛出异常,那么这个任务是否会被丢弃?当前线程池中有十个线程,其中一个线程正在执行任务,那么剩下的九个线程正在处于一种什么状态呢?相信如果没有看过线程池的相关源码实现,这些问题是很难回答得完美的。同时这些问题往深了问还会引出Java中阻塞队列以及AQS

2020-11-24 15:49:10 527

原创 为什么 Java 中“1000==1000”为false,而”100==100“为true?

如果你运行下面的代码:Integer a = 1000, b = 1000;System.out.println(a == b);//1Integer c = 100, d = 100;System.out.println(c == d);//2你会得到falsetrue基本知识:我们知道,如果两个引用指向同一个对象,用== 表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。因此,后面一条语句也应该是false 。这就是它有趣的地方了。如果

2020-11-23 20:52:12 103

原创 Spring@Autowired注解自动注入流程是怎么样?

面试中碰到面试官问:”Spring 注解是如果工作的?“,当前我一惊,完了这不触及到我的知识误区了吗?,还好我机智,灵机一动回了句:Spring 注解的工作流程倒还没有看到,但是我知道@Autowired注解的工作流程,后面不用说了一顿巴拉,面试官都连连点头。面试中要活用转移话题,要避免回答 ”不知道“,要引导面试官掉入你擅长的技术,然后才有机会教他作人。@Autowired 相关的类@Autowired 注解的主要功能就是完成自动注入,使用也非常简单(Spring都安排好了),但是要想知道 @Aut

2020-11-23 14:24:50 1221 1

原创 百度面试官:给我说是CDN加速的原理?

一、什么是 CDNCDN 的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。简单的说,CDN 的工作原理就是将您源站的资源缓存到位于全球各地的 CDN 节点上,用户请求资源时,就近返回节点上缓存的资源,而不

2020-11-22 19:09:50 639

原创 18 张图弄懂面试官必问的一致性哈希

1. 满眼都是自己二十年前的样子,让我们从哈希开始在 N 年前,互联网的分布式架构方兴未艾。大刘所在的公司由于业务需要,引入了一套由 IBM 团队设计的业务架构。这套架构采用了分布式的思想,通过 RabbitMQ 的消息中间件来通信。这套架构,在当时的年代里,算是思想超前,技术少见的黑科技架构了。但是,由于当年分布式技术落地并不广泛,有很多尚不成熟的地方。所以,这套架构在经年日久的使用中,一些问题逐渐突出。其中,最典型的问题有两个:RabbitMQ 是个单点,它一坏掉,整个系统就会全部瘫痪。收

2020-11-22 14:57:00 144

原创 面试官:Redis 主从复制时网络开小差了怎么整?

什么是事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。事务的 ACID事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特

2020-11-20 21:31:31 127

原创 Redis:我这21个灵魂拷问你拿什么挡?

1.什么是redis?Redis 是一个基于内存的高性能key-value数据库。2.Reids的特点Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限

2020-11-20 13:40:10 86

原创 Java并发编程:从源码分析几道必问线程池的面试题?

一般一个线程执行完任务之后就结束了,Thread.start()只能调用一次,一旦这个调用结束,则该线程就到了stop状态,不能再次调用start。如果你对一个已经启动的线程对象再调用一次start方法的话,会产生:IllegalThreadStateException异常,但是Thread的run方法是可以重复调用的。所以这里也会有一个面试经常问到的问题:「Thread类中run()和start()方法的有什么区别?」下面我们就从jdk的源码来一起看看如何实现线程复用的:线程池执行任务的ThreadPo

2020-11-19 19:16:45 94

转载 SpringBoot 注解每一个用途你都应该清晰了解

一、注解(annotations)列表1、@SpringBootApplication包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。2、@ComponentScan组件扫描,可自动发现和装配一些Bean。3、@Configuration等同于Spring的XML配置文件;使用Java代码可以检查类型安全。4

2020-11-19 14:17:58 83

原创 前后端分离三连问:为何分离?如何分离?分离后的接口规范?

1. 前言随着互联网的高速发展,前端页面的展示、交互体验越来越灵活、炫丽,响应体验也要求越来越高,后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻,从而导致前后端研发各自专注于自己擅长的领域深耕细作。然而带来的另一个问题:前后端的对接界面双方却关注甚少,没有任何接口约定规范情况下各自撸起袖子就是干,导致我们在产品项目开发过程中,前后端的接口联调对接工作量占比在30%-50%左右,甚至会更高。往往前后端接口联调对接及系统间的联调对接都是整个产品项目研发的软肋。本文的主要初衷就是规范约定先行

2020-11-18 21:13:22 245

原创 烂大街的Spring循环依赖该如何回答?

什么是循环依赖?从字面上来理解就是A依赖B的同时B也依赖了A,就像上面这样,或者C依赖与自己本身。体现到代码层次就是这个样子@Componentpublic class A { // A中注入了B @Autowired private B b;}---@Componentpublic class A { // A中注入了B @Autowired private B b;}---// 自己依赖自己@Componentpublic class C { // C中注入了C

2020-11-18 15:09:06 185

原创 阿里一道面试题把90%的程序员拦在了门外

1. CASCAS 全称: CompareAndSwap ,故名思意:比较并交换。他的主要思想就是: 我需要对一个值进行修改,我不会直接修改,而是将当前我认为的值和要修改的值传入,如果此时内存中的确为我认为的值,那么就进行修改,否则修改失败。 他的思想是一种乐观锁的思想。一张图解释他的工作流程:知道了它的工作原理,我们来听一个场景:现在有一个 int 类型的数字它等于1,存在三个线程需要对其进行自增操作。一般来说,我们认为的操作步骤是这样:线程从主内存中读取这个变量,到自己的工作空间中,然后执行变

2020-11-17 21:18:57 126

原创 MyBatis 为什么可以兼容所有常用的日志框架?

前言日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:Apache Common Log,Log4j,java.util.logging等。MyBatis作为一款优秀的ORM框架,定义了一套统一的日志接口供应用层调用,而底层却利用适配器模式兼容了我们上面所列出来的常用日志框架。MyBatis日志分类在介绍MyBatis的全局配置文件的时候,我们提到setting内有一个属性logI

2020-11-17 19:29:15 73

原创 面试官:连哈希扣的都不懂还来面试

前言相信你面试的时候,肯定被问过 hashCode 和 equals 相关的问题 。如:hashCode 是什么?它是怎么得来的?有什么用?经典题,equals 和 == 有什么区别?为什么要重写 equals 和 hashCode ?重写了 equals ,就必须要重写 hashCode 吗?为什么?hashCode 相等时,equals 一定相等吗?反过来呢?好的,上面就是灵魂拷问环节。其实,这些问题仔细想一下也不难,主要是平时我们很少去思考它。正文下面就按照上边的问题顺序,一个一

2020-11-14 19:02:47 132

原创 面试官:说一下缓存穿透、缓存击穿、缓存雪崩

前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一

2020-11-14 14:47:20 93

原创 10道棘手的Java面试题,看看你能答对几个?

Q1:下面Java代码的输出是什么?public class Test { public static void main(String[] args) { method(null); } public static void method(Object o) { System.out.println("Object method"); } public static void method(String s) { System.out.print

2020-11-13 19:49:25 73

原创 Nginx面试中最常见的18道题 抱佛脚必备

Nginx的并发能力在同类型网页服务器中的表现,相对而言是比较好的,因此受到了很多企业的青睐,我国使用Nginx网站的知名用户包括腾讯、淘宝、百度、京东、新浪、网易等等。Nginx是网页服务器运维人员必备技能之一,下面为大家整理了一些比较常见的Nginx相关面试题,仅供参考:1、请解释一下什么是Nginx?Nginx是一个web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议。2、请列举Nginx的一些特性。Nginx服务器的特性包括:反向代理/L7负载均衡器嵌

2020-11-13 14:19:00 142

原创 面试官问我redis数据类型,我回答了8种

redis 的对象类型与编码类型redis 的对象类型,就是面试中常考的 redis 数据类型有哪些 这个问题所问的准确说法,这个对于我们这些只会面试不会开发的程序员来说,简直再熟悉不过啦,就是字符串、哈希、列表、集合、有序集合,这个在 redis 源码中能找到准确的定义:redis.c/* Object types */#define REDIS_STRING 0#define REDIS_LIST 1#define REDIS_SET 2#define REDIS_ZSET 3#defi

2020-11-12 17:19:20 218

原创 MySQL 的 join 功能弱爆了?

简介: 对于 join 操作的实现,大概有 Nested Loop Join (循环嵌套连接),Hash Join(散列连接) 和 Sort Merge Join(排序归并连接) 三种较为常见的算法,它们各有优缺点和适用条件,接下来我们会依次来介绍。关于MySQL 的 join,大家一定了解过很多它的“轶事趣闻”,比如两表 join 要小表驱动大表,阿里开发者规范禁止三张表以上的 join 操作,MySQL 的 join 功能弱爆了等等。这些规范或者言论亦真亦假,时对时错,需要大家自己对 join 有.

2020-11-12 14:20:57 76

原创 一次List对象去重失败,引发对Java8中distinct()的思考

list的转map的另一种猜想Java8使用lambda表达式进行函数式编程可以对集合进行非常方便的操作。一个比较常见的操作是将list转换成map,一般使用Collectors的toMap()方法进行转换。一个比较常见的问题是当list中含有相同元素的时候,如果不指定取哪一个,则会抛出异常。因此,这个指定是必须的。当然,使用toMap()的另一个重载方法,可以直接指定。这里,我们想讨论的是另一种方法:在进行转map的操作之前,能不能使用distinct()先把list的重复元素过滤掉,然后转map的时

2020-11-11 23:04:52 266 1

原创 收藏,吊打面试官的kafka知识!

1 什么是kafkaKafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。2 为什么要使用 kafka,为什么要使用消息队列缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。解耦和扩展性:项目开始的时候,并不能确定具

2020-11-11 19:13:30 548

原创 求求你们了,别再写满屏的 if/ else 了!

为什么我们写的代码都是 if-else?程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断;这里要判断下对象是否为 null;不同类型执行不同的流程。落地到具体实现只能不停地加 if-else 来处理,渐渐地,代码变得越来越庞大,函数越来越长,文件行数也迅速突破上千行,维护难度也越来越大,到后期基本达到一种难以维护的状态。虽然我们都很不情愿写出满屏 if-else 的代码,可逻

2020-11-11 15:52:59 90

原创 浅谈面试中遇到的JVM与性能优化问题

面试中遇到面试官问的最多的便是JVM与性能调优,小编便肝了一个星期为大家整理了这方面的重要知识点,掌握这些知识点,小编就不信你还征服不了面试官。话不多说,我们直接进入主题。关于JVM与性能调优的内容主要包括:JVM 内存区域划分JVM 执行子系统垃圾回收器和内存分配策略编写高效优雅 Java 程序性能优化JVM 内存区域划分程序计数器(线程私有)Java 栈(线程私有)本地方法栈(线程私有)堆(线程共享)方法区(线程共享)直接内存(线程共享)JVM 执行子系统Cla

2020-11-10 21:15:24 217 1

原创 面试:如何决定使用 HashMap 还是 TreeMap?

问:如何决定使用 HashMap 还是 TreeMap?介绍TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。结论如果你需要

2020-11-10 14:00:32 49

原创 如何构建 Kubernetes 原生云边高效协同网络?

使用场景在应用的部署和运维过程中,用户常常需要获取应用的日志,或直接登录到应用的运行环境中进行调试。在 Kubernetes 环境中,我们通常使用 kubectl log,kubectl exec 等指令来实现这些需求。如下图所示,在 kubectl 请求链路上, kubelet 将扮演服务器端,负责处理由 kube-apiserver(KAS) 转发来的请求,这就要求 KAS 和 kubelet 之间需要存在一条网络通路,允许 KAS 主动访问 kubelet。图一:kubectl 执行流程然而,

2020-11-09 16:02:59 242

原创 面试中又被问到Redis如何实现抢购,赶快代码实现一波吧!

面试常常遇到写一个抢购实例,或者讲讲抢购实现想法,然后总是讲不明白,因为目前工作没做抢购这一块儿。但是这个想法今天终于搞明白了,其中也参照了一些大佬的做法。这篇文章直接使用redis,其中注释也写的挺明白的,直接上代码:junit测试类:Log log = LogFactory.getLog(getClass()); @Autowired private RedisTemplate<String, Object> redisTemplate; @Tes

2020-11-09 14:07:08 127

原创 看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了

final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。final、finally 和 finalize我.

2020-11-08 20:47:26 140

原创 如何让 Mybatis 自动生成代码,提高开发效率

在使用 mybatis 过程中, 当手写 JavaBean和XML 写的越来越多的时候, 就越来越同意出错。这种重复性的工作, 我们当然不希望做那么多。还好, mybatis 为我们提供了强大的代码生成–MybatisGenerator。通过简单的配置, 我们就可以生成各种类型的实体类, Mapper接口, MapperXML文件, Example对象等。通过这些生成的文件, 我们就可以方便的进行单表进行增删改查的操作。以下的工具使用的都是 IDEA1 创建代码生成器1.1 创建Maven项目1

2020-11-08 14:37:59 197

原创 五大分布式事务,你了解多少?

一、前言事务(Transaction):一般是指要做的或所做的事情,由 事务开始(begin transaction) 和 事务结束(end transaction) 之间执行的全体操作组成。简单的讲就是:要么全部被执行,要么就全部失败。那分布式事务,自然就是运行在分布式系统中的事务,是由多个不同的机器上的事务组合而成的。同上,只有分布式系统中所有事务执行了才能是成功,否则失败。事务的基本特征ACID:原子性(Atomicity): 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,

2020-11-07 19:53:45 169

原创 浅聊 volatile原理

volatilevolatile 只能保证对单次读/写的原子性。i++ 这种符合操作操作不能保证原子性。禁止指令重排可见性volatile读的内存语义当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量(注意不仅仅是一个volatile变量,是所有共享变量)volatile写的内存语义当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存(注意不仅仅是一个volatile变量,是所有共享变量)可见性

2020-11-07 15:02:42 103

原创 当面试官看完我手写的单例时,直接惊呆了!

DCL 单例模式DCL 就是 Double Check Lock 的缩写,即双重检查的同步锁。代码如下,public class Singleton { //注意,此变量需要用volatile修饰以防止指令重排序 private static volatile Singleton singleton = null; private Singleton(){ } public static Singleton getInstance(){ /

2020-11-06 19:50:58 80

空空如也

空空如也

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

TA关注的人

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