- 博客(96)
- 资源 (2)
- 收藏
- 关注
原创 从Java中的集合交集探寻空间换时间的案例(对于我们处理大数据量可做参考)
目的:(1)双从For循环的复杂度(2)集合转Map的降低复杂度的方法以及注意点一:背景在一个数据量为2W的A集合中查询数据量2W的B集合中相同ID的数据。1.准备:模拟出2个集合public class Persion { //ID private Integer id ; //姓名 private String name ; //没写Set/get等方法}//随机创建2w个对象 List<Persion> ol.
2020-08-09 18:38:27
793
原创 从零开始java多线程并发---锁(十):LockSupport
一:LockSupport的介绍 在Condition的API中,我们看到其中阻塞和唤醒的方法都用到了park()和unpark()方法,这其实就是工具类LockSupport提供的对于指定线程的操作方法。 对于LockSupport的底层实现大部分呢都是借助于原子类的实现类UnSafe,这个类是java中允许直接操作指针的(所以命名为:UNSafe),所以关于其底层实现会在后续说明。...
2019-12-23 17:11:53
279
原创 从零开始java多线程并发---锁(九):Condition详解
一:Condition详解 Conditon提供了线程协作的更多的更丰富的API帮助,其本身是对Object的await()、notitify()方法的扩展。 首先我们来看一下Condition的方法:COndititon是实现AQS中的ConditonObject的。二:Condition的await() 该方法设置获取倒锁的线程从运行状态转变为等待状态,其...
2019-12-23 17:11:39
384
原创 从零开始java多线程并发---锁(八):ReadWriterLock接口源码以及接口解析使用
一:读写锁ReadWriterLock 在实际应用场景中,读的应用概率明显大于写,很明显在同步方法对外体现大部分时候是读的时候加上锁是不合适的。因此就引出了一个概念读写锁(读锁共享,写锁独享)。 读写锁在具有的特性:读写锁维护的是一组锁。 一次只允许一个线程修改,允许多个线程阅读。 保证每一个读之前,内存中的共享数据已经与写锁的数据一致(即读锁之前一定保证读取到之前的写锁)。...
2019-12-23 17:11:23
183
原创 从零开始java多线程并发---锁(七):AQS的共享锁功能的实现(从CountDownLatch分析)
一:共享锁 java中一般定义写锁为独享锁而读锁为共享锁,而java中读锁单独存在是没有意义的,原因如下:读锁只是对资源的读取没有对资源的修改,那么效率会远小于没有锁的读。java中只要读锁是依赖于写锁的,不同于写锁的所操作:获取锁然后操作(获取没有获取到锁进入等待阻赛队列)。读锁一般都是直接调用wait()方法进入线程阻赛的。其原因是,读锁一定保证线程中的写锁(至少是当前线程中的写...
2019-12-23 17:10:49
142
原创 从零开始java多线程并发---锁(六):AQS的独占锁功能的实现(从Lock以及实现ReentraintLock分析)
一:分析独占锁 JUC对于资源的共享资源的分类分为2种:共享不可改变资源(fianl修饰)和共享可变资源。因此产生了JUC中的2种锁类型:共享锁和独占锁。 上一节我们简述了Lock接口以及其实现类ReentraintLock的源码以及常见用法。该Lock是一个独占锁的API,下面我们就给予该Lock接口做一些源码分析。 关于一些常用的说明同步状态state: ...
2019-12-23 17:10:38
203
原创 从零开始java多线程并发---锁(五):Lock接口源码以及实现ReentraintLock解析使用
一:locks包 1.我们来看一下locks包含了哪些东西(jdk源码):2.相关简要类说明(这里为了方便,部分直接以类图说明,详情见文档)(1)同步器基础(2)独享锁(3)读写锁 (共享锁/独享锁)(4)LockSupport(实现线程阻塞) LockSupport:用于创建锁和其他同步类的基本线程阻塞原语。(5)C...
2019-12-23 17:10:25
262
原创 从零开始java多线程并发---锁(四):AQS原理简析
一:AQS原理简析 AQS是java中多数的同步器的实现基础,AQS维护同步器的同步状态。在AQS中维护同步器状态,主要是从以下的三个方面来维护的:同步状态的管理 线程的唤醒/阻赛 线程等待队列的维护二:同步状态的管理 AQS同步器定义了资源的访问方式:独占模式还是共享模式。AQS使用单个32位的int来维护同步状态的,并且暴露出以下的方法来更新获取这个状态:/** ...
2019-12-23 17:09:56
167
原创 从零开始java多线程并发---锁(三):AQS的实现方法说明
一:AQS解释了锁的核心思路 实则是,java中的锁就是我们定义了访问公共资源的一种方法。AQS是创建多线程下资源管理的核心,其通过以FIFO队列的方式定义了线程对于公共资源的操作。二:模板功能的复写 AQS的实现类实则就是腹泻了AQS的抽象功能(但是AQS中多数使用final、static修饰的变量和方法声明其为一个模板),下面对于其抽象方法的复写如下: ...
2019-12-23 17:09:27
126
原创 从零开始java多线程并发---锁(二):AQS以及实现类的介绍
一:AbstractOwnableSynchronizer介绍AbstractOwnableSynchronizer是整个JUC的核心,在jdk1.5引入,用来控制java并发编程核心底层抽象模板。其提供整套的创建线程所需要的权锁以及同步器的基础,简称AQS。准确的的说AQS是一套模板,本身不提供任何的实现所有的线程控制、诊断都是交由其子类或者工具类实现的。目前jdk对其已经的实现类分为A...
2019-12-23 17:07:41
147
原创 从零开始java多线程并发(一):jdk中的并发包的介绍
一:Jdk中并发包的介绍 在上个系列的《从零开始java多线程到分布式锁》中已经简单介绍控制java程序的并发一些简单方式(从单机锁到分布式锁),本系列从Jdk的并发编程包:java.util.concurrent讲起。(基于jdk1.8.1)jdk1.8中文文档JUC-Locks:Lock锁框架 JUC-atomic:原子类框架 JUC-synchronizer:同步器框架 ...
2019-12-23 17:07:24
214
1
原创 从零开始java多线程到分布式锁(十四):分布式锁的讨论
一:分布式锁 首先,我们在前面讨论了锁存在的意义:是为了解决数据共享性和互斥性冲突的一种解决方案,就是实现数据“最终一致性”。现在我们讨论一下为什么要用分布式锁的原因:1.项目架构的演变(这里我们主要讨论服务应用层)(1)常见小型企业---垂直单体应用 其实主要还是应用的复杂度设计问题。这种设计应用从上而下,开发、部署以及维护都很方便,但是无法应对日益增加的...
2019-12-07 22:06:52
173
原创 从零开始java多线程到分布式锁(六):spring中的线程池框架
一:spring中的线程池框架 在上一张,简要的说明了几种线程池的创建。在一般的项目中使用已经足够了。本节我们就特指springboot中的异步线程池的使用。二:springboot中的异步线程池(1)线程池参数的配置package com.commons.utils.thread;import java.util.ArrayList;import java.util.C...
2019-12-06 17:34:42
329
原创 从零开始java多线程到分布式锁(五):jdk的线程池框架
一:多线程框架解决的问题 jdk1.5引入J.U.I相关的并发包,其中Executor框架很好解决了并发多线程的情况下的安全问题。其中下面给出一幅相关的类图: 二:Executor executor接口分为2中执行方式:同步和异步。 (1)同步执行p...
2019-12-06 17:25:25
155
原创 从零开始java多线程到分布式锁(四):java中如何创建多线程
一:创建多线程的4种方法jdk中有4种方法创建多线程:(1)实现Runable接口(2)集成Thread类(3)线程池创建有返回值的callable(4)线程池的创建(通过jdk的框架)二:实现Runable接口package manyThread;/** *实现Runable实现多线程 * @author monxz * */public cla...
2019-12-04 22:28:11
211
原创 从零开始java多线程到分布式锁(十三):读写锁ReentrantReadWriteLock
一:读写锁的引入 我们在实际项目中,即使在一些使用锁的方法下也是基本以读为主写为辅,那么在大多数的读的情况下,如果也是用排它锁(即一个线程获取到锁,其他线程就进入阻赛了)就会导致是项目效率降低。有没有这样这样一种锁,读锁是排它锁,写是共享锁。 在java中提供这样一种锁:ReentrantReadWriteLock。该接口维护了一组共2个锁。其中读锁是共享锁,写锁是互斥锁。二...
2019-12-04 19:52:52
331
原创 从零开始java多线程到分布式锁(十二):Lock的实现原理
一:Lock锁接口的实现方式ReentrantLock()ReentrantLock()是已知唯一一个Lock的实现。在上文我们都使用ReentrantLock()作为实现的。关于二:Lock的特殊的Api-Condition 在上一节,我们谈到了Lock常用的一些接口方法Lock(),tryLock()等等。实则上Lock还有一个api我们单独拿出来说-condition。每...
2019-12-04 12:51:37
230
原创 从零开始java多线程到分布式锁(十一):Lock的基本概念
一:java中的锁 java中的锁关键字分为3种:Lock、Synchronized以及volatile。1 .Lock和Synchronized区别 Lock: 为java中的显示锁,锁的获取和释放可以在不同的 Synchronized:为java中隐石锁,所得获取和释放是在同步代码块的开始结束位置,是java实现同步的最简单的方法。2.Synchron...
2019-12-03 18:04:55
232
原创 从零开始java多线程到分布式锁(十):volatile的使用以及优化
一:volatile关键字的使用Synchronized锁一个重锁,其本质依赖于JVM核的Monitor的监控。实则上一旦使用偏锁/轻锁的优化在很多程度上会导致代码运行效率不高(原因就是多次CAS操作导致的)。因此,java引入另外一个关键字volatitle,但是说实话这个关键字的使用还是很少的,主要原因就是volatitle只能保证单次的读或者写的同步性,一旦一个方法出现对一个变量既有读...
2019-12-02 06:01:50
301
原创 从零开始java多线程到分布式锁(九):Synchronized的优化
目录一:Synchronized的底层优化二:锁状态1.锁状态2.锁在对象的保存3.锁优化的基本原理(很重啊哟)三:轻量级锁1.轻锁的加锁过程:2.轻锁的解锁过程四:偏向锁1.偏锁获取锁的过程2.偏锁的释放过程五:锁状态的相互转换六:锁的其他优化1.适应性自旋2.锁粗化3.锁消除七:总结1.优化锁的优缺点以及关闭锁优化...
2019-12-01 18:31:12
356
原创 从零开始java多线程到分布式锁(八):java中的锁Synchronized
一:多线程锁的概念 多线程锁是解决多个线程工作副本独立运行,但是程序需要每一个副本的数据共享的问题的。java中解决锁的关键字或者说方案有3个Lock,Synchronized以及volatile(其中voltile这个比较特殊,前面2个是java原生锁,这个是基于原生锁而进行优化的一个锁)。下面我们针对每一个锁进行详细的讲解。 java中的锁解决并发问题,可以将java中的并行操作变...
2019-11-28 22:40:52
133
原创 从零开始java多线程到分布式锁(七):java中的锁的定义以及分类
一:解决多线程的数据问题 为了解决多线程的数据安全问题,java提出了锁的概念:百度了一下网络上对锁的分类及其繁琐并且分类标准不明确。这里稍微按照个人的理解去分类锁。 java为了解决并发的数据问题,实际上提出了2个基本锁的概念,注意这里是指的概念:乐观锁(只在数据提交时验证数据完整性),悲观锁(没一个个操作都验证数据的完整性)。二:锁的概念和分类1.定义一个公平锁/...
2019-11-28 16:21:45
164
原创 从零开始java多线程到分布式锁(三):锁解决多线程的问题
一:回顾多线程在JVM中运行模型 这里直接将(二)中的图复制过来吧。 在回顾一下多线程运行快的原因吧。每一个线程都会复制一个工作副本以供本线程操作使用,在线程运行结束后再将工作副本同步到主内存中。 优点:每一个线程独立运行,效率贼快。 缺点:对于公共变量的处理,会产生"脏读"的可能。二:多线程数据安全的几大特性 ...
2019-11-28 11:40:31
407
原创 从零开始java多线程到分布式锁(二):多线程的之间的线程协作
一:java多线程的JVM运行模型 首先当一个单线程转变成一个多线程运作时,我们需要对JVM的内存模型有一些基本的了解。首先我们来看一下在多线程的情况下JVM如何运行线程方式,如图所示: 网上很多对这个运行模型讲解的不是很透彻,这里我们做一个简单说明,主要分为以下几步:(1)每一个线程复制出一个内存副本(图中以共享变量为主),也就是缓...
2019-11-28 06:25:14
191
原创 从零开始java多线程到分布式锁(一):线程的基本概念
一:多线程的介绍以及使用 其实,在java中多线程的使用是一个项目走向规模化的重要转折点(这里的使用是指应项目需求而必须去使用多线程)。很多时候我们对于多线程的使用还是停留在常用的框架提供的工具类,比如说jdk自带的Executor以及一些成熟框架的线程池框架等。这里我们将花费一个系列的时间来探讨一下java的多线程的秘密。二:多线程涉及的基本的概念 这里我们将java多...
2019-11-28 04:28:00
174
原创 从零开始java安全权限框架篇(八):spring security+jwt实现前后端分离
一:使用jwt管理 今天,在把之前的一个项目拆分成一个前后端分离的项目时(Vue+springboot),这是session是由前端的Vue去管理,后端只要认证就行了,所以去掉了spring security中的繁琐的session管理认证。实际上spring security中jwt用来做接口认证的。但是经过整合我们可以用它整合redis实现分布式无状态请求管理(这也是一个做单点登录的一个...
2019-10-28 13:45:01
1290
原创 从零开始java前端页面篇:巧用全局缓存
一:场景问题 在我们的页面设计中,我们使用了Spring security5在页面上空到具体的按钮显示权限,如图所示: 但是很尴尬的是在Js中是无法获取到的,但是Js进行其它的按钮控制比如以下:然后,看了几个网上比较好的解决方案--是基于Thymeelaf的请求服务去后端获取这个权限(当然我一开始也是如此)。如图: 这种方法在...
2019-10-07 18:09:33
540
原创 从零开始java数据库SQL优化(二):多个LEFT JOIN的SQL优化
一:场景 我代码里需要在用户登录时将所有用户相关的用户,角色,部门,岗位,权限(其中权限放在菜单中,每2张表有一张关联表),不多说直接上SQLSELECT a.fk_user_id AS "fk_user_id", a.user_realname AS "user_realname", a.user_name AS "user_name", a.user_ty...
2019-10-07 13:14:00
4265
原创 从零开始java数据库SQL优化(一):一篇解决MYSQL查询优化总纲
目录目录一:问题场景二:优化1.查询计划2.分析计划连接类型三:索引的使用与选择1.索引的使用以及优化(1) MYSQL中的索引原理(2) 4中树结构在索引中的应用(附红黑树)2、树结构选择合适的索引。3、mysql中建立索引的规范4、mysql的索引分类以及使用场景(1)索引的总分类(2)Mysql中的索引(3)、建立合适索引...
2019-10-06 16:20:59
805
1
原创 从零开始java数据库SQL优化(番外):SQL执行性能分析
目录一:为什么要进行性能分析二:navcat快速进行性能分析1.先来看一下一个100多万条数据表的查询:2.添加limit查询3.navcat打开语句分析第一步:执行计划4、navcat打开语句分析第二步:执行状态。5、navcat打开语句分析第三步:时间分布。6.排查问题7.解决问题三:语句分析初步得出优化建议一:为什么要进行性能分析 在...
2019-10-06 15:52:21
583
原创 从零开始java邮件篇篇:spring Mail实现邮件发送
一:邮件发送 毋庸置疑,在一个企业级的管理后台中,企业发送邮件是必要的的。在没有spring Mail之前,javaMail发送邮件的步骤是繁琐的。后来spring整合了相关的Mail之后,其API接口方式就变得很简单了。其实springboot2.x版本整合spring Mail还是很简单的。这里主要还是说明一下一些具体逻辑的处理: 关于下面的三个箭头,我想就不用说明了吧,其实很...
2019-09-22 16:45:43
1227
原创 从零开始java通知篇:Springboot+webSocket实现消息通知
一:实现消息实时通知 实现消息的实时通知有2种方案:即推和拉。拉,就是页面用Ajax去轮询访问后台是否有新的消息但是资源消耗很大,推即服务器通过“长链接”去实时推送消息去前端页面主要的实现就是使用WwbSocket。 这里,我们使用的是springboot2.0.x版本来整合WebScoket。二:代码1.引入依赖<dependency> ...
2019-09-20 00:07:32
7804
1
原创 从零开始java文件服务器篇:文件服务器
一:文件服务器 在一个无论什么样的系统中,文件上传/下载是一个不可或缺的基础功能。在一个比较小的单体项目中,我们不会去单独为文件的存储开辟一个服务器,但是随着我们项目的一步一步扩展从ftp,sftp,分布式存储的服务器一步一步发展而来。目前接触过的主流的分布式文件存储FasfDfs服务器和Hdfs服务器。基于目前的能力,我们这里使用了Fastdfs服务器。 这里主要是spirngboo...
2019-09-19 23:43:54
8064
3
原创 从零开始java分布式主键篇:分布式id
目录一:Mysql自增排序二:Mysql的主键排序三.分布式主键策略1.集群或者分布式下数据库自增主键带来的风险2.分布式主键方向3.数据库层面方案(一)设置步长(1)方案(2)优点(3)缺点4.数据库层面方案(二)查询MAX(ID) (1)方案(2)优点(3)缺点5.数据库层面方案(三)-单独一张id表...
2019-09-12 22:48:51
971
原创 从零开始java数据权限篇:数据权限
目录一:数据权限的产生二:数据权限的数据切割1.数据对应的层级图2.用户数据查询3.用户流程管理4.部门-岗位-公司查询拓扑图三.说明一:数据权限的产生 在一个后管系统中,由2个最重要的权限划分。第一个访问权限,通过控制访问路径、请求来控制访问的权限,第二个是数据权限,通过一系列的分割策略来对用户进行管理。访问权限,可以这么说访问权限可以通过集成框架(比...
2019-09-10 02:28:45
10334
原创 从零开始java安全权限框架篇(七):spring security整合Redis实现session共享
目录一:spring security整合spring session实现session共享二:代码 1.springsecurity的配置文件 2.自定义的session管理三:获取到当前的所有用户以及踢出一个用户四:用户锁定1.我们先来看看锁定的时序图2.流程解析3.代码(1)登录流程验证验证(2)登录失败加锁五...
2019-09-09 11:23:10
4532
原创 从零开始java安全权限框架篇(六):springboot2.x整合spring session
一:springboot2.x整合spring session 上一节,我们谈到了Security中如何去管理session问题,但是只限于单机模式。在这个过程中,我也尝试修改了使用Redis去共享session信息,但是由于security本身的封装,使得reddis进行反序列化出现很多的问题,先后使用了jackson 2和fastjson以及jdkjson等方式进行反序列化都出现或多多少...
2019-09-05 12:18:42
351
原创 从零开始java安全权限框架篇(五):security存储session源码解读
目录一:session共享二:security单体应用的session源码1.配置中的session管理2.SessionRegistry接口方法3.SessionRegistry的默认实现方法SessionRegistryImpl(1)先看创意一个新的session的实现方法吧。(2)获取到所有用户的实现(3)删除session的实现(4)session...
2019-09-03 22:48:27
540
原创 从零开始java安全权限框架篇(四):security管理session
目录一:基于Redis的Session共享二:单体应用下Session功能的实现1.获取到当前用户2.获取到所有的当前登录用户(1)SecurityConfig的配置文件(2)Contoller中调用3.剔除某一个用户4.同一个用户踢出上一次登录一:基于Redis的Session共享 上一节中,我们谈到了记住我功能的存储,这里我们将对sessio...
2019-09-03 19:55:35
607
原创 从零开始java安全权限框架篇(三):记住我Token存储的源码解析以及自定义Token存储
目录一:记住我功能的Token持久化1.新建数据表结构2.使用JdbcTemplate来存储生成的Token二:记住我功能的源码解析1.首先来看一下PersistentTokenRepository接口2.PersistentTokenRepository的实现3.1PersistentTokenRepository实现之一InMemoryTokenRepository...
2019-09-03 14:37:10
1704
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人