- 博客(41)
- 收藏
- 关注
原创 JUC主要知识点整理
Volatile与CASVolatile是一个只能修饰成员变量的关键字。对volatile变量进行写操作时,其生成的汇编代码会加上一个lock前缀,lock的作用是将处理器缓存的数据写回内存使其他处理器缓存了该内存地址的数据无效Volatile的内存语义JMM(java内存模型,逻辑概念)我们来看一个例子,我们准备一个布尔类型的标记量flag,使用一个线程修改,两个线程获取这个flag;public class JMM { private boolean flag =fal.
2021-03-20 14:59:05
416
转载 Thread.sleep、synchronized、LockSupport.park的线程阻塞有何区别?
前言在日常编码的过程中,我们经常会使用Thread.sleep、LockSupport.park()主动阻塞线程,或者使用synchronized和Object.wait来阻塞线程保证并发安全。此时我们会发现,对于Thread.sleep和Object.wait方法是会抛出InterruptedException,而LockSupport.park()和synchronized则不会。而当我们调用Thread.interrupt方法时,除了synchronized,其他线程阻塞的方式都会被唤醒。于是本文
2021-03-13 22:18:31
1540
1
原创 从Linux内核开始,带你建立一套完成的,基础的Java网络IO知识体系
前言很多学习java的小伙伴与网络IO的第一次接触可能是这样:某一个惬意的下午,你的java老师让你翻开书本,找到"Socket 通信"那一章。随后,他打开IDE,娴熟的建了一个类,在主方法啪唧,new了一个ServerSockt对象,并给定一个int类型参数,说这是我们要监听的端口号。ServerSocket serverSocket = new ServerSocket(6666);Linux Socket什么是SocketSocket(套接字)可以看成是两个网络应用程序进行通信时,各自通信
2021-03-08 20:46:16
773
转载 JDK1.5后的对象锁优化,偏向锁升级为轻量锁再升级为重量锁流程图
特别说明两点:CAS记录owner时,expected == null,newValue == ownerThreadId,因此,只有第一个申请偏向锁的线程能够返回成功,后续线程都必然失败(部分线程检测到可偏向,同时尝试CAS记录owner)。内置锁只能沿着偏向锁、轻量级锁、重量级锁的顺序逐渐膨胀,不能“收缩”。这基于JVM的另一个假定,“一旦破坏了上一级锁的假定,就认为该假定以后也必不成立”。...
2021-03-02 21:18:08
211
原创 Spark学习笔记(5)——Spark Core一些案例实操
学习于https://www.bilibili.com/video/BV11A411L7CK?p=110&spm_id_from=pageDriver视频的资料、代码及笔记链接:https://pan.baidu.com/s/1NT0-O7ZplxZX4FBMI4od6A提取码:5a6h案例1:电商数据分析数据介绍上面的数据图是从数据文件中截取的一部分内容,表示为电商网站的用户行为数据,主要包含用户的 4 种行为:搜索,点击,下单,支付。数据规则如下:➢ 数据文件中每行数据采用下划
2021-02-25 14:16:34
278
原创 Spark学习笔记(4)——Spark Core之累加器与广播变量
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一. 累加器学完了Spark core三大数据结构之一的RDD,我们继续来看剩下俩一. 累加器
2021-02-24 17:56:04
259
原创 Spark学习笔记(3)——SparkCore之RDD(2)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、RDD序列化1.闭包检查2.序列化方法和属性3.Kryo 序列化框架二、RDD依赖1.依赖关系1.1.OnetoOne(窄依赖)1.2 shuffle(宽依赖)2.血缘关系3.RDD 阶段(Stage)划分4.RDD 任务划分三.RDD持久化1.RDD Cache 缓存一、RDD序列化1.闭包检查从计算的角度, 算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 Executor端执行。那么在 scala
2021-02-23 23:17:33
563
原创 Spark学习笔记(2)——SparkCore之RDD(1)
Spark核心编程Spark 计算框架为了能够进行高并发和高吞吐的数据处理,封装了三大数据结构,用于处理不同的应用场景。三大数据结构分别是:RDD : 弹性分布式数据集累加器:分布式共享只写变量广播变量:分布式共享只读变量1.RDD1.1 RDD简介RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是spark中最基本的数据处理模型,是最小的计算单元它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合➢ 弹性⚫ 存储的弹性:内存与磁盘的自
2021-02-22 20:12:33
300
原创 spark学习笔记(1)——spark概述
一.Spark概述1.Spark 是什么Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。2.spark和HadoopHadoopHadoop 是由 java 语言编写的,在分布式服务器集群上存储海量数据并运行分布式 分析应用的开源框架作为 Hadoop 分布式文件系统,HDFS处于Hadoop 生态圈的最下层,存储着所有 的 数 据 , 支 持 着 Hadoop的 所 有 服 务 。 它 的 理 论 基 础 源 于 Google 的 TheGoogleFileSystem
2021-01-28 20:20:23
256
1
原创 spark学习准备(2)——windows下环境搭建
Spark运行环境Spark 作为一个数据处理框架和计算引擎,被设计在所有常见的集群环境中运行, 在国内工作中主流的环境为 Yarn,不过逐渐容器式环境也慢慢流行起来。下面我们简单介绍一下几种运行环境1.Local环境local 本地模式是用来进行练习和演示的,不需要其他任何节点资源就可以在本地执行 Spark 代码的环境2.Standalone 模式local 本地模式毕竟只是用来进行练习演示的,真实工作中还是要将应用提交到对应的集群中去执行,这里我们来看看只使用 Spark 自身节点运行的集
2021-01-26 22:26:49
212
原创 spark学习准备(1)——光速入门scala语法(在熟悉java的基础上)
一、变量1.在scala中,可以使用val或var定义变量,语法格式如下val/var 变量标识:变量类型 = 初始值其中val定义的是不可重新赋值的变量var定义的是可以重新赋值的变量2.通过类型推断来定义变量scala可以自动根据变量的值来推断变量类型,使代码更简洁var name = "tom"3.惰性赋值当有一些变量保存的数据比较大,但不需要马上加载到JVM中。可以使用惰性赋值,语法格式如下lazy val/var 变量名 = 表达式二、字符串1.scala提供多
2021-01-26 18:16:39
413
原创 hadoop学习笔记(5)——MapReduce运行机制
MapReduce整体运行图一.Map阶段读取数据组件InputFormat(默认是TextInputFormat)会通过getSplits方法对输入目录中文件经行逻辑切片规划得到block,有多少个block就会启动多少个MapTask.将输入文件切分为block之后,由RecordReader对象(默认是LineRecordReader)进行读取,以\n作为分隔符,读取一行数据,返回<key,value>,key表示每行首字符偏移值,value表示这一行文本内容读取block返回
2021-01-22 16:58:46
225
原创 Hadoop学习笔记(4)——MapReduce的一些案例
一、流量统计首先给出元数据表这是一张手机流量统计表需求一: 统计求和统计每个手机号的上行数据包总和,下行数据包总和,上行总流量之和,下行总流量之和。分析:以手机号码作为key值,上行流量,下行流量,上行总流量,下行总流量四个字段作为value值,然后以这个key,和value作为map阶段的输出,reduce阶段的输入step 1:创建javaBean用于封装数据public class FlowBean implements Writable { private Integer
2021-01-21 20:14:50
407
原创 Hadoop学习笔记(3)——MapReduce入门
一、MapReduce介绍MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。”map"负责分,即把复杂的任务分解为若干简单的任务来处理。前提是这些小任务可以并行计算,彼此间几乎没有依赖关系“Redude”负责合,即对map阶段的结果进行全局汇总1.MapReduce 设计构思一个完整的mapreduce程序在分布式运行时有三类实例进程:MRAppMaster 负责整个程序的过程调度
2021-01-21 15:07:23
882
原创 Hadoop学习笔记(1)——HDFS概述
学习于Hadoop入门教程一.HDFS概述1.介绍需要跨机器存储,统一管理分布在集群上的文件系统统称为分布式文件系统。Hodoop使用HDFS(Hadoop Distributed File System)作文存储系统。HDFS使用多台计算机存储文件,对外提供统一操作文件的接口2.应用场景适合的场景a.存储非常大的文件并对延时没有要求b.彩球流式的数据访问方式,即一次写入,多次读取。数据集经常从数据源生成或者拷贝,然后做很多分析工作。c.对硬件要求不高d.高容错e.可拓展不适合的场
2021-01-18 14:29:00
308
原创 java基础——NIO
一、NIO简介NIO(Non-blocking IO)即非阻塞IO,在JDK1.4中引入,提供面向块的非阻塞IO操作1.NIO家族成员a).BufferNIO是面向块的,不是一个一个的传递数据,自然要有一个东西来打包数据。Buffer缓冲区就是来打包数据用的,它是NIO数据处理的基础单元。NIO具体有八种Buffer即ByteBuffer,CharBuffer,ShortBuffer,FloatBuffer…对应了java的基本数据类型b).Channel类似于流,但数据在Channel中的
2020-12-07 20:37:30
175
原创 JVM——运行时数据区域
名称线程是否共享存放内容程序计数器线程私有虚拟机字节码虚拟机栈线程私有(方法的)局部变量表,操作数栈,动态连接,方法出口本地方法栈线程私有(本地方法的)局部变量表,操作数栈,动态连接,方法出口堆线程共享对象实例及数组方法区线程共享类型信息,常量,静态变量,代码补充运行时常量池是方法区的一部分,用于存在编译时生成的各种字面量与符号引用直接内存直接内存并不是运行时数据区的一部分,也不是Java虚拟机定义的内存区域。本机直接内存的分...
2020-11-25 16:16:35
79
原创 java之HashMap——学习笔记
学习于bilibili大学和bilibili大学一、前置知识学习HashMap之前,我们需要知道1.散列表(hash表)散列表:根据元素的关键字确定元素的存储位置,其查找,插入,删除操作效率接近O(1)散列函数:任意长度的输入计算出定长输出,也就是将任意key计算成相应的index散列冲突:两个不同的key通过散列函数计算出的index值相同容量:散列表最大装载元素的个数装填因子(Load Factor):表示散列表的空间利用率,当散列表已有元素>=容量 * 装填因子时,加入新元素之前
2020-11-23 21:17:11
286
1
原创 CAS知道吗?如何实现的?
一、概念CAS—compareAndSet字面意思:比较并交互真实值和期望值相同,执行修改,否则不执行。CAS方法存在于UnSafe类中,UnSafe可以直接操作系统内存资源。CAS是一种系统原语,属于操作系统用语,是有若干条连续,不可中断的指令构成的,也就是说,CAS是一条CPU的原子指令。二、源码阅读示例我们以UnSafe的getAndSetInt方法为例这个方法的作用是,获得并且设置一个int值,返回获得的结果public final int getAndSetInt(Object v
2020-11-08 19:30:04
337
原创 volatile——学习笔记
一、概念volatile是jvm提供的轻量级同步机制二、特性1.保证可见性volatile很好的保证了变量的可见性,变量经过volatile修饰后,对此变量进行写操作时,汇编指令中会有一个LOCK前缀指令,加了这个指令后,会引发两件事情:将当前处理器缓存行的数据写回到系统内存这个写回内存的操作会使得在其他处理器缓存了该内存地址无效(多处理器核心的情况下)什么意思呢?意思就是说当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中
2020-11-08 16:16:55
154
原创 AbstrctQueueSynchronizer抽象队列同步器---学习笔记
一、意义是用来构建锁或者其他同步器组件的基础框架通过内置的FIFO(先进先出)队列来完成资源获取线程的排队工作,并通过一个int变量表示持有锁的状态二、
2020-11-08 00:47:34
213
原创 Java可重入锁
一、概念线程在方法外获得锁进入方法内,如果需要再次获得锁,那么就会自动获取(前提是同一个锁对象),不会因为之前获取过锁还没释放而阻塞二、种类Java中ReentrantLock和synchronized都是可重入锁。隐式锁(synchronized)显示锁(Lock,即需要手动lock和unlock的锁)中的ReentrantLock三、伪代码演示1.隐式锁public class ReentrantDemo static Object objectA = new Object();
2020-11-07 12:20:25
231
转载 Java的Unsafe类
一、概念Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数是private的:二、主要功能普通读写通过Unsafe可以读写一个类的属性,即使这个属性是私有
2020-11-07 00:24:43
269
原创 Fegin调用其他微服务带上请求头
Fegin调用其他微服务带上请求头import feign.RequestInterceptor;import feign.RequestTemplate;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpSe
2020-11-04 22:23:03
317
原创 spring 拦截器注入bean为null的问题
今天使用redis缓存token,使用拦截器做登陆判断的时候,发现redis获得值始终为空debug后看到Stringredistemplate根本没有注入这是因为拦截器加载的时间点在springcontext之前,即在bean实例化之前,所以在拦截器中注入自然为null 。那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取就能解决这个问题啦。...
2020-10-21 16:29:20
789
原创 Spring Boot整合Spring session
一、环境搭建<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>二、application配置文件spring: redis: host: 39.106.20
2020-10-11 21:21:18
642
原创 SpringBoot整合JWT(Json Web Token)实战
一、业务场景前后端分离或者跨系统的用户认证二、JWT简介批里批里JWT认证原理三、环境搭建引入依赖即可 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </depen
2020-10-10 23:13:29
370
原创 Mybatis一对多,一对一多表查询
用一个VO类做测试,要从三个表中查到数据@Datapublic class SkuInfoAndImagesVO { private String skuName; private SkuCommentEntity comment; private List<SkuImagesEntity> images;}为VO类写一个结果映射java类就用association, javaType指定类型集合用collection,ofType指定集合内数据的类型&l
2020-10-09 22:58:48
127
原创 使用Spring Boot整合Rabbit MQ实现延时队列定时关闭无效订单
一、业务场景下订单后,30分组内没用付款就要关闭订单等一些需要延时执行的任务。使用定时任务轮询数据库则浪费太多资源二、环境搭建1.Rabbit MQ这里我使用docker安装Rabbit MQdocker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management(PS:Rabbit MQ各个端口的作用)
2020-10-09 17:51:29
528
原创 幂等性问题
一、需要避免的问题1.用户多次点击提交2.用户退回页再次提交3.微服务调用,由于网络问腿,导致请求失败,feign触发重试机制…二、一些自带幂等的操作1.同样的select,delete语句,2.固定的update语句 ,把1改成0等等3.insert语句以ID为主键插入。三、如何保证幂等1.令牌机制获得令牌,对比令牌,删除令牌应该是个原子性操作2.锁1.悲观锁select * from tab where id =1 for update2,乐观锁带版本号的更新3.唯一
2020-10-08 14:25:05
303
1
原创 使用Spring AOP环绕通知做权限控制
一、应用场景项目中用户使用相关功能时需要判断是否登陆二、自定义注解约定切入点是标记了@LoginJudge的方法//登陆判断@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface LoginJudge {}标注注解在相关业务方法上@PostMapping("/save")@LoginJudge public R save(@RequestHeader("Authorizat
2020-10-07 17:54:20
593
转载 spring事务
本文将按照声明式事务的五个特性进行介绍:事务传播机制事务隔离机制只读事务超时回滚规则Spring事务传播机制事务的特性原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他
2020-10-06 16:25:22
75
转载 SpringBoot使用AOP
转载于 SpringBoot使用AOP众所周知AOP(Aspect Oriented Programming)是Spring的核心之一,是OOP面向对象编程的延续和补充,是面向切面编程,他的底层实现是代理模式,简单来说,代理模式分为静态代理模式和动态代理模式,而代理模式又分为JDK动态代理和CGLib代理,AOP则是基于动态代理实现,默认是使用JDK动态代理,若没有接口则会使用CGLib代理,前者基于接口,后者基于子类,若兴趣深入了解代理模式的,可参考Java代理模式一文,下面简单说下AOP的基本概念.
2020-10-06 15:13:28
152
1
原创 Java动态代理
动态代理的角色和静态代理的一样 .动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理基于接口的动态代理----JDK动态代理 基于类的动态代理–cglib 现在用的比较多的是 javasist 来生成动态代理 .百度一下javasist 我们这里使用JDK的原生代码来实现,其余的道理都是一样的!动态代理的好处静态代理有的它都有,静态代理没有的,它也有!可以使得我们的真实角色更加纯粹 . 不再去关注一些公.
2020-10-05 23:59:00
86
原创 Java注解与反射
一 、注解1.一些内置注解@Override,@Deprecated2.元注解元注解的作用就是负责注解其他注解4个标准元注解(meta-annotation)(1)@Target:描述注解的使用范围(类,方法…)(2)@Retention:表示需要在什么级别保存改注释信息,用于描述注解的生命周期(SOURCE<CALSS<RUNTIME)(3)@Document:说明该注解将被包含在javadoc中(4)@Inherited:说明字类可以继承父类中的该注解3.自定义注解使用
2020-10-05 19:59:14
221
1
原创 MySQL索引的数据结构
转自http://blog.codinglabs.org/articles/theory-of-mysql-index.html**摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容
2020-10-03 22:15:54
111
原创 JUC的三个常用辅助类
一 、CountDownLatch允许一个或多个线程等待直到其他线程中执行的一组操作完成的同步辅助可以理解为减法计数器主要方法:countDownLatch.countDown();//计数器数量减1countDownLatch.await();//等待计数器归0Demo:public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(6);//new一个减法
2020-10-01 00:00:43
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人