2.Java
文章平均质量分 88
双斜杠少年
希望经记录下来自己学习过程,并和大家一块分享
展开
-
slf4j 日志门面模式应用(双亲委派特例)
SLF4JSLF4J是一个日志抽象库 (Simple Logging Facede For Java 简单日志门面 ),它相当于一个服务的接口,具体的日志功能是有其中的日志框架去实现的,slf4j 可以在部署的时候接上想要使用的日志框架。通俗来说SLF4J是一个日志抽象库,必须和其他日志库配合才能正常运行。一般来说,需要将抽象层(例如slf4j-api-xx.jar)+ 中间层(例如slf4j-log4j12)+ 实现层(例如log4j)这三层都配置好才能保证SLF4J正常运行。另外,有的日志库可以原创 2022-03-17 21:39:20 · 1320 阅读 · 0 评论 -
总结:一文死磕 synchronized 和 AQS 系
先将ReentrantLock跟常用的Synchronized进行比较,其特性如下ReentrantLockSynchronized锁实现依赖AQS监视器Monitor模式灵活性支持响应中断、超时、尝试获取锁不灵活释放形式必须显示的调用unlock()释放锁自动释放监视器锁类型公平锁&非公平锁非公平锁条件队列可关联多个队列关联一个条件队列可重入性可重入可重入1. synchronizedsynchronized关键原创 2020-12-11 14:53:21 · 5162 阅读 · 0 评论 -
Java 并发关键字大练兵—一文读懂各个关键字
Java 并发大练兵本文介绍了Threadlocal、volatile、condition、Semaphore、CountDownLatch、unsafe 等关键字目录如下:Threadlocal 本地线程volatileconditionCountDownLatch 闩锁CyclicBarrier 篱栅Semaphore 信号灯unsafe 魔法类StampedLock 新读写锁https://github.com/527515025/JavaTest/tree/dev/src/原创 2020-12-09 15:44:14 · 918 阅读 · 6 评论 -
一文分清23种设计模式-设计模式及PK小结
设计模式是为了可重用代码(可重用)、让代码更容易被他人理解(可读性)、保证代码可靠性。设计模式不是一种方法和技术,而是一种思想。1. OOP三大基本特性封装封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏。继承继承是指这样一种能力,它可以使用现有的类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。多态多态指一个类实例的相同方法在不同情形有不同的表现形式。具体来说就是不同实现类对公共接口有不同的实现方式,但这些操作可以通过相原创 2020-11-18 14:25:02 · 1824 阅读 · 1 评论 -
一文明白JVM-万字长文,遇人随便问
JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。1. 类加载Java 语言是一种具有动态性的解释型语言,类(Class)只有原创 2020-11-01 21:17:07 · 1419 阅读 · 2 评论 -
设计模式导读
什么是设计模式。 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。(简单说设计模式就是经验的总结)这个东西可以重复的使用相当于十个模型,比如说我想做个蛋糕,我看到一个巧克力蛋糕特别漂亮,我想做一个类似的蛋糕,我只要有蛋糕这个模型就可以了。我就可以做出一样的蛋糕出来。同理设计模式就类似这样一个东西。我模仿着它就能做出符合某种规则的东西来。其原创 2016-08-14 13:49:20 · 1475 阅读 · 0 评论 -
一文读懂mysql-万字长文,肝就完了
1.存储引擎1.1 innodb提供了对数据库 ACID事务 的支持提供了 行级锁和外键的约束。InnoDB的行锁也是分为行级**「共享读锁(S锁)「和」排它写锁(X锁)」**,原理特点和MyISAM的表级锁两种模式是一样的。设计的目标就是 处理大数据容量 的数据库系统会出现死锁,但是 InnoDB的支持的并发性能比MyISAM好, 行锁的粒度最小,一定的方法和措施可以解决死锁的发生,极大的发挥InnoDB的性能InnoDB中引入了 间隙锁 的概念来决解出现 幻读 的问题,也原创 2020-10-22 23:54:52 · 954 阅读 · 1 评论 -
一文读懂zookeeper--万字长文肝就完了
1. zookeeper在分布式集群的作用1.1,数据发布与订阅(配置中心)发布与订阅模型,即所谓的配置中心,顾名思义就是讲发布者将数据发布到zk节点上,共订阅者动态获取数据,实现配置的集中式管理和动态更新。例如,全局的配置信息,服务服务框架的地址列表就非常适合使用。分布式环境下,配置文件管理和同步是一个常见问题一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群、集群中的数据库配置信息等全局配置对配置文件修改后,希望能够快速同步到各个节点上。配置管理可交由 ZooK原创 2020-10-16 16:40:19 · 2154 阅读 · 2 评论 -
Java集合 Queue、LinkedList、PriorityQueue、Deque、ArrayDeque及 native函数
Queue接口Queue用于模拟了队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器。队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素。新元素**插入(offer)**到队列的尾部,**访问元素(poll)**操作会返回队列头部的元素。通常,队列不容许随机访问队列中的元素。常用方法1. 入队**void add(Object o):** 指定元素加入队列尾部boolean offer(Object o):同上,在有限容量队列中,此方法更好2. 出队*原创 2020-10-11 19:02:46 · 739 阅读 · 0 评论 -
表达式解析器Mvel2.0(MVFLEX Expression Language)
表达式解析器Mvel2.0(MVFLEX Expression Language)时间过的好快,突然就发现,已经过去一两年了,这一两年博客也写的不多,快要进入中年了,最重要的就是自律。要好好睡觉,好好学习,好好工作。废话不多说,这次给大家说的是 表达式语言解析Mvel2.0简介MVEL为 MVFLEX Expression Language(MVFLEX表达式语言)的缩写,它是一种动态/静态的可嵌入的表达式语言和为Java平台提供Runtime(运行时)的语言。最初是作为一个应用程序框架实用程序的语原创 2020-08-14 16:48:07 · 6513 阅读 · 0 评论 -
Java8重新认识HashMap
本文Java 版本 1.8.0_92-b14引子前段时间,朋友问了一道力扣算法题,求两数之和。题目是给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。要求时间复杂度:O(n)我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1)O(1) ,所以时间复杂度为 O(n)。空间复杂度:O(n)所需的额外空间取决于哈希表中存储的元素原创 2020-06-28 11:31:41 · 648 阅读 · 0 评论 -
java8 小技巧保证分组groupingBy后排序不变
问题:遇到一个小问题,查询出来一组数据后,按照其中的属性进行groupBy 分组 ,分组后要保证顺序不变。排查首先去api中查找解决//一个参数 public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? ex...原创 2020-03-03 14:45:59 · 20394 阅读 · 6 评论 -
RocketMq 初识和springboot-rockerMq
介绍:消息队列(Message Queue,简称MQ)。消息中间件作为实现分布式消息系统可拓展、可伸缩性的关键组件,具有高吞吐量、高可用等等优点。优势:削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)蓄流压测(线上...原创 2019-12-22 16:48:56 · 1967 阅读 · 0 评论 -
红黑树学习及Java实现
BST二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。它的高度决定了它的查找效率。在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N)。当它的高度为logN+1时,我们就说二叉查找树是平衡的。BST存在的问题BST存在的主要问题是,数在插入的时候会...原创 2019-10-31 17:49:57 · 3679 阅读 · 5 评论 -
后端(springboot)解决跨域问题
首先我门要知道什么是跨域:跨域是指 不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。也就是如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容 如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。什么是同一个域?同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。前端解决跨域:前边也原创 2017-05-08 22:14:14 · 58881 阅读 · 13 评论 -
drools 基于jar包实现动态规则
Drools中提供了一个类KieScanner,可以支持从Maven存储库动态的加载并更新规则。官方给出的例子没有很好的证明这一能力。项目演示共分三个包:springboot-drools-dynamic-rules: springboot 和 drools 的结合,drools运行于此,并对外提供rest 接口服务springboot-drools-dynamic-rules-api...原创 2019-06-12 16:08:31 · 5010 阅读 · 0 评论 -
drools 基于数据库实现动态规则
drools 基于数据库实现动态规则,即为将规则文件字符串 存在数据库中,然后规则引擎执行的时候将规则从数据库中读取出来,写入到规则引擎KieFileSystem中,加载规则。从而实现,修改数据库后,即可及时执行规则。创建springboot + mybatis 项目https://abelyang.blog.csdn.net/article/details/89296273导入drools...原创 2019-06-12 16:12:09 · 17739 阅读 · 10 评论 -
Java IP 地址服务 GeoIP
本文内容介绍动手什么是GeoIP地理知识产权数据库与服务:业界领先的知识产权情报Geoip 是 MaxMind 的IP智能产品GeoIP由多个相关产品组成。GeoIP允许您发现关于特定IP地址的信息。提供web服务、基于订阅的可下载数据库和免费的可下载数据库,MaxMind GeoIP2产品为内容个性化、欺诈检测、广告定位、流量分析、遵从性、地理定位、地理防护和数字版权管理等广泛应用...原创 2019-08-02 18:01:28 · 3656 阅读 · 2 评论 -
Java 读写csv
本文结构:废话动手读csv写csv工作中需要读写csv,由于csv 文件较大,数据比较多,所以需要选择一个速度快的csv 读取插件。经过比较选择opencsv 。官方解释:Opencsv是一个易于使用的CSV(逗号分隔值)解析器库。之所以开发它,是因为当时所有CSV解析器都没有商业友好的许可证。Java 7是目前支持的最小版本。Opencsv支持您可能想要做的所有基本CSV类型的事情...原创 2019-08-02 18:06:14 · 5323 阅读 · 1 评论 -
springboot+dubbo+validation 进行 rpc 参数校验
注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE项目结构test-rest (前端消费着,controller 层,springboot+maven项目)test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目)test-provider(dubbo 服务提供者,实际的数据库操作及业务层...原创 2019-09-22 17:55:11 · 9893 阅读 · 0 评论 -
分布式锁浅谈之redis锁
Redis 分布式锁业务:用于库存扣减,因为是微服务架构所以 jvm 级别的锁都不满足需求。故考虑分布式锁A:服务获取锁 修改库存 释放锁背景:在单机时代,虽然不存在分布式锁,但也会面临资源互斥的情况,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就需要对这个资源进行加锁,当使用完资源之后,再解锁,其它线程就可...原创 2019-09-28 16:49:19 · 1140 阅读 · 0 评论 -
SpringBoot 通过拦截器验证Referer 防御CSRF攻击
问题:**CSRF概念:**CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。如下:其中Web A为...原创 2019-10-10 19:05:13 · 12085 阅读 · 2 评论 -
java调用shell脚本执行spark任务错误
java调用shell脚本执行spark任务使用java通过 Runtime.getRuntime().exec(); 调用shell 脚本,在脚本中执行 spark 任务会报错,如下:19/05/15 15:46:47 WARN StandaloneAppClient$ClientEndpoint: Failed to connect to master 192.168.9.2:7077...原创 2019-05-16 14:23:23 · 1388 阅读 · 0 评论 -
mapstruct 实体转换及List转换
开发中,我们经常需要将PO转DTO、DTO转PO等一些实体间的转换。比较出名的有BeanUtil 和ModelMapper等,它们使用简单,但是在稍显复杂的业务场景下力不从心。MapStruct这个插件可以用来处理domin实体类与model类的属性映射,可配置性强。只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地...原创 2019-03-09 16:07:44 · 43863 阅读 · 1 评论 -
Drools Fusion(CEP) 初尝
从 Drools 统一行为建模平台的视野看,Drools Fusion 是负责启用事件处理行 为的一个模块。定义支持复杂事件处理,是比简单的理解事件是什么要更多得多,cep场景具有几个共同而明显的特点:通常需要处理巨量的事件,但是只有少部分事件是真正关心的。事件通常是不变的,因为它们是状态改变的一条记录。通常有关事件的规则和查询必须是运行在被动模式(reactive modes),即,...原创 2019-03-01 18:05:23 · 2128 阅读 · 2 评论 -
原型模式
场景假设现在我需要发送1000W封邮件,我使用多线程发送邮件(单线程的话,发完邮件我也入土了,时间太久。),我创建了一个邮件对象,每次给邮件对象赋值,然后发送出去,但是使用多线程,就遇到了线程安全问题,当线程一,创建好邮件对象后,还没有进行发送邮件操作时,线程二 又对邮件对象进行了赋值,然后线程一开始发送邮件,此时线程一发送的邮件对象,其实已经是线程二赋值的邮件对象了。那么怎么通过设计模式解决这个问原创 2017-07-18 22:42:12 · 708 阅读 · 0 评论 -
springboot-AOP
先了解AOP的相关术语: 1.通知(Advice):通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。 3.切入点(Pointcut)通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Sprin原创 2017-07-13 23:05:15 · 1125 阅读 · 0 评论 -
java中使用反射机制获取实体类集合的某个属性值
需求今天遇到一个需求。需要从几个对象的集合中取出对象的某些属性。怎么办呢?哪就利用反射机制写个方法吧。思路入参首先是几个对象的集合,那么方法的入参就是 list<?> 因为是不同对象所以还是得用泛型。用反射当然得有 参数Class<?> 最后还得有第三个参数就是需要获取的属性名。出参出参比较容易,就搞个String好了实现public String getStringAbel(List<?> o,原创 2017-06-12 23:46:20 · 8919 阅读 · 0 评论 -
利用java 的动态代理模拟spring的AOP
AOPAOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。平常我门需要记录一些操作的日志,需要在操作的业务逻辑代码里嵌入日志模块的代码。这些日志模块的代码与操作的代码逻辑无关,只是做一个记录,而且在其原创 2017-07-13 00:00:01 · 1572 阅读 · 1 评论 -
spring 之 自己动手实现IOC
扯淡学 java 的人应该都知道spring,学spring的人呢都应该知道 IOC和 AOP 对吧。今天就简单的说一下spring 的IOC。IoC是Spring框架的核心内容,IoC(Inversion of Control)控制反转,是一种设计思想,DI(依赖注入)是实现IoC的一种方法。 其实spring就是一个容器,一个bean容器。主要是完成了完成对象的创建和依赖的管理注入。什么是控制原创 2017-07-11 22:49:38 · 2347 阅读 · 1 评论 -
网站的海量数据和高并发的解决方案(二)
高并发的解决方案除了数据量大,另外一个常见的问题就是并发量高,很多架构就是针对这个问题设计出来的。1.应用和静态资源分离刚开始的时候应用和静态资源是保存在一起的,当并发量达到一定程度的时候就需要将静态资源保存到专门的服务器中,静态资源主要包括图片、视频、js、css和一些资源文件等,这些文件因为没有状态所以分离比较简单,直接存放到响应的服务器就可以了,一般会使用专门的域名去访问。 通过不同的域名可原创 2017-05-08 21:27:50 · 6017 阅读 · 0 评论 -
网站的海量数据和高并发的解决方案(一)
现在无论是企业的业务系统还是互联网上的网站程序都面临着数据量大的问题,这个问题如果解决不好将严重的影响系统的运行速度,下面就针对这个问题的各种解决解决方案进行介绍。1. 缓存和页面静态化1.1 缓存数据量大这个问题最直接的解决方案就是使用缓存,缓存就是将数据库中获取的结果暂时保存起来在,在下次使用的时候无需从数据库中提取,这样可以大大降低数据库压力。常用的缓存框架有Ehcache、Memcache原创 2017-03-27 00:03:47 · 4240 阅读 · 0 评论 -
maven 的生命周期
原文地址:http://www.cnblogs.com/tenghoo/p/maven_life_cycle.html1、Maven的生命周期Maven的生命周期就是对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。Maven的生命周期是抽象的,即生命周期不做任何实际的工作,实际任务由插件完成,类似于设计模式中的模板方法。转载 2017-03-24 00:02:51 · 738 阅读 · 0 评论 -
Ant 风格路径表达式
ANT通配符有三种:通配符 说明例子:URL路径 说明属性: 最长匹配原则(has more characters) 说明,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/*/.jsp和/app/dir/.jsp,那么会根据模式/app/dir/.jsp来匹配原文链接:http://blog.csdn.net/songdexv/article/details/7219转载 2017-02-17 17:25:34 · 2398 阅读 · 0 评论 -
设计模式之中介者模式
场景一个公司的“进销存“买IBM电脑系统设计,销售部门要反馈销售情况,畅销的就多采购,滞销就不采购;销售前要确定库存有货才能销售。采购部门要根据销售情况和库存情况进行采购。库存情况要根据销售情况和采购情况维护库存量。根据库存量来决定是否要打折出售。“进销存“三个模块都有自己的香味,并且与其他的模块之间行为产生关联,类似我们的办公室“同事“各干各的活,但是彼此之间有依赖、交叉,于是彼此之间就...原创 2017-08-09 00:39:20 · 765 阅读 · 0 评论 -
java 实现二叉树题目
树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,本文包括:建树向树中插入一个节点依据树节点的值删除树中的一个节点先续遍历树中的所有节点中续遍历树中的所有节点后续遍历树中的所原创 2017-09-11 23:33:32 · 914 阅读 · 0 评论 -
设计模式之责任链模式
场景:中国古代对妇女制定了“三从四德” 的道德规范,“三从” 指 “未嫁从父、即嫁从夫、夫死从子”。也就是说,一位女性在结婚之前要听从于父亲,结婚后听从于丈夫,如果丈夫死了还要听从于儿子。比如说一位女性要去逛街,在她出嫁之前必须征得父亲的同意,出嫁之后必须获得丈夫的同意,如果丈夫死了, 那就要请示小叔子、侄子等。作为父亲,丈夫或儿子,只有两种选择:要不承担起来责任,允许她或不允许她逛街;要不就...原创 2018-04-08 21:05:40 · 1274 阅读 · 0 评论 -
redis之Jedis-API介绍和连接池使用
Redis的各种语言客户端列表,请参见Redis Client。其中Java客户端在github上start最高的是Jedis和Redisson。Jedis提供了完整Redis命令,而Redisson有更多分布式的容器实现。添加maven 依赖 dependency> groupId>redis.clientsgroupId>原创 2018-01-12 20:11:49 · 7341 阅读 · 2 评论 -
在spring boot中使用java线程池ExecutorService
1. 认识java线程池1.1 在什么情况下使用线程池?1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处:1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存1.3 线程池包括以下四个基本组成部分:1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线原创 2018-01-02 21:52:35 · 37131 阅读 · 3 评论 -
java 位掩码之与(&)或(|)非(~)、左移 、右移
1. java 位掩码java 位掩码,在java开发中很少有场景会用到掩码,但是当系统中需要判断某个对象是否有 某些权限时,可以通过位掩码来做。位掩码 主要通过位运算,例如与(&)、非(~)、或(|)、异或(^)、移位(<<和>>)等来实现 权限判断功能。1.1 简单介绍一下位运算符(计算均为二进制计算)<< : 左移运算符,num << 1,相当于num乘以2>>原创 2017-12-11 22:35:39 · 2331 阅读 · 0 评论