
【Java学习】
Hepburn Yang
匠心精神
-
原创 雪花算法踩坑 - Long 类型 id 返回前端精度丢失 (通过序列化解决)
能看到这里大概率说明你已经踩到这个坑了。原因:js的number类型支持的最大值是9007199254740992 (2的53次方-1),溢出之后的精度会丢失,导致前后端的值不一致。java的long类型最大值为9223372036854775807,远高于js number类型的最大值,所以这个坑就出现了。解决方案:id-type: ID_WORKER_STR简单来说就是id转为string类型,db和生成的id数据类型都改为string类型缺点:牺牲了long类型的性能优势通过json2020-06-28 15:03:267154
3
-
原创 java 获取request请求头所有信息
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 获取头信息 */ String headValue = r...2019-11-29 17:26:093573
0
-
原创 持续集成工具 Jenkins vs TeamCity
1. 先来看看受欢迎程度:2. Jenkins vs TeamCity: What are the differences?JenkinsJenkins 是一个开源工具,Jenkins的出现的时间比较早一点,因此社区规模更大,使用范围更广,Stacks数量要多,插件扩展也更丰富,另外可以在多台机器上进行分布式构建和负载测试,总结:Jenkins强大又灵活,免费,支持跨平台,学习成本会高...2019-11-19 16:29:234514
0
-
原创 【Java并发】 -- fork/join 框架解读
场景需求方案用法原理2019-11-13 17:28:491169
1
-
原创 【Java并发】 -- JMM如何解决原子性、可见性、有序性问题
ava中提供了一系列和并发处理相关的关键字,比如volatile、Synchronized、final、juc等,这些就是Java内存模型封装了底层的实现后提供给开发人员使用的关键字,在开发多线程代码的时候,我们可以直接使用synchronized等关键词来控制并,使得我们不需要关心底层的编译器优化、缓存一致性的问题了,所以在Java内存模型中,除了定义了一套规范,还提供了开放的指令在底层进行封装后,提供给开发人员使用2019-03-31 21:37:481229
1
-
原创 【Java并发】--读写锁 ReentrantReadWriteLock
关于锁,我们了解最多的基本都是排它锁,也就是这些锁在同一时刻只允许一个线程进行访问,而读锁在同一时刻可以允许多个线程访问,但写锁访问时候,所有的线程和其他写线程都会被阻塞。读写锁维护了一对锁,一个读锁,一个写锁;2019-06-30 22:43:35237
2
-
原创 【Java并发】-- 线程池
文章目录1.为什么要使用线程池?2.Executors提供的四种线程池区别以及应用场景:3.线程池有哪几种工作队列?ArrayBlockingQueue - 有界的数组队列 :LinkedBlockingQueue - 可支持有界/无界的队列 :DelayedWorkQueue优先级队列。PriorityBlockingQueue : 优先队列SynchronousQueue : 队列长度为1...2019-07-16 08:16:45147
1
-
原创 【Java并发】-- 原子类+并发工具
2019-07-16 08:17:21109
0
-
原创 【Java并发】-- AQS 原理
在 Lock 中,用到了一个同步队列 AQS,全称 AbstractQueuedSynchronizer,它是一个同步工具, 也是 Lock 用来实现线程同步的核心组件, 如果你搞懂了 AQS,那么 J.U.C 中绝大部分的工具都能轻松掌握;2019-07-07 21:40:54468
0
-
原创 【Java并发】-- 并发基础
多线程发展历史一个指令在一个cpu上运行,用户输入一个指令,cpu处理完毕之后返回结果。批处理操作,将多个指令集中写入到磁带上,一次交给CPU处理,返回结果。批处理操作不能解决串行化等待的问题,如果一个线程(读写磁盘)指令执行时间比较长,后面的指令需要一直等待,CPU资源也处于阻塞态得不到充分利用。多线程技术通过线程切换可以实现多个线程同时执行,从而在一定程度上提升性能和cpu的利用率...2019-07-14 21:29:09111
0
-
原创 【Java并发】-- ReentrantLock 可重入锁实现原理1 - 获取锁
Lock有很多具体的锁的实现,但最直观的实现是ReentrantLock重入锁,也是平时我们用的最多的。重入锁是独占锁的代表。ReentrantLock 重入锁表示可重入的锁,举个例子:当线程t1通过调用lock()方法获取锁之后,再次调用lock,是不会再阻塞获取锁的,直接增加重试次数就行了。synchronized 和 ReentrantLock 都是可重入锁;来个简单的demo来说明一...2019-07-17 11:54:06563
2
-
原创 【Java并发】-- ReentrantLock 可重入锁实现原理2 - 释放锁
接着上一篇分析……给一扇传送门,【Java并发】-- ReentrantLock 可重入锁实现原理1 - 获取锁当ThreadA线程执行完任务后调用finally中的unlock()方法释放锁的时候会经历什么样的操作。ReentrantLock.unlock()1. ReentrantLock中的unlock() /* * 释放锁 */ public void unlock(...2019-07-17 16:54:33580
1
-
原创 【Java并发】-- 并发容器
2019-07-14 21:51:57119
0
-
原创 【Java并发】-- Lock体系
在 Lock 接口出现之前, Java 中的应用程序对于多线程的并发安全处理只能基于synchronized 关键字来解决。但是 synchronized 在有些场景中会存在一些短板,也就是它并不适合于所有的并发场景。 但是在 Java5 以后, Lock 的出现可以解决synchronized 在某些场景中的短板,它比 synchronized 更加灵活。Lock 的实现Lock 本质上是...2019-07-14 21:50:45143
0
-
原创 【Java并发】-- 并发关键字(synchronized / volatile / final)
2019-07-14 21:48:32227
0
-
原创 【数据结构与算法】--3.复杂度分析
一.为什么需要复杂度分析?代码跑一边做统计监控的数据虽然很准确,但是属于事后统计分析,局限性在于:依赖测试环境(硬件)受测试数据规模的影响很大二、什么是复杂度分析数据结构和算法是解决“如何让计算机执行时间更快,更生空间”的解决问题。所以要从执行时间和占用空间两个维度来评估算法的性能。于是用了时间复杂度和空间复杂度两个概念来描述性能问题,统称为复杂度;复杂度描述的是算法执行...2019-04-12 11:29:29309
0
-
原创 【数据结构与算法】--2.学习方法
思考:为什么要学?最大的感受是学习的过程可以锻炼自己的性能意识,写代码的时候会潜意思的考虑性能问题,所以写出低效代码的情况会越来越少。是什么?数据结构指的是“一组数据的存储结构”,算法指的是:“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用在特定的数据结构上的。学什么?1.复杂度是算法与数据结构的精髓,是对效率和资源消耗量的一个衡量,学习算法与数据结构就要学会对其进行复杂...2019-04-10 08:46:161039
2
-
原创 【JVM学习】--内存管理 / 对象创建
这wl里写自定义目录标题WLAN欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入...2019-05-05 23:18:22176
0
-
原创 【JVM学习】--内存分配策略
# 1、基本原则:- 优先分配到Eden;- 大对象直接分配到老年代- 长期存活的对象分配到老年代- 空间分配担保(跟老年代借用空间)- 动态对象年龄判断2019-05-19 21:49:22205
4
-
原创 【java基础】-- 反射机制
java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性。动态获取类中的信息,就是java反射可以理解为对类的解剖;提高了应用程序的扩展性。...2019-05-12 21:35:30170
3
-
原创 “字面量”和“符号引用”
最近看jvm时遇到了“字面量”和“符号引用”这两个概念,它们被存放在运行时常量池,看了一些博客以后对这两个概念有了初步认识。字面量可以理解为实际值,int a = 8中的8 和 String a = "hello"中的hello都是字面量符号引用就是一个字符串,只要我们在代码中引用了一个非字面量的东西,不管它是变量还是常量,它都只是由一个字符串定义的符号,这个字符串存在常量池里,类加载的时候第...2019-05-26 20:28:20887
1
-
原创 【JVM学习】--垃圾回收
一、如何判定对象为垃圾对象1.1 引用计数法(不采用)1.1.1 what?在对象中添加一个引用计数器当有地方引用此对象,引用计数器+1引用失效时候,引用计数器-11.1.2 优势:简单高效1.1.3 劣势:在堆内部相互关联(循环引用时),对外的栈内没有指向该对象的引用时,引用计数器的值不为0,这部分垃圾不会被回收。1.2 可达性分析法1.2.1 what?...2019-05-30 20:49:32155
22
-
原创 动态代理原理 (jdk动态代理+cglib动态代理)
场景:<br />协调调用者与被调用者之间的关系,降低耦合度,保护真实对象静态代理缺点:<br />一个代理对象只能代理一类对象<br />如果要代理多个对象则需要多个proxy改造静态对象就需要引入动态代理:<br />实现方式:2019-06-16 21:27:05503
1
-
原创 【Java并发】-- synchronized原理 (偏向锁,轻量级锁,重量级锁膨胀过程)
放大了看,会让你惊艳的一张图。什么是Monitor?可以理解为一个同步工具,也可以描述为一个同步机制。所以java对象天生是一个Monitor, 每个Object对象里面markOop --> monitor() 里可以保存ObjectMonitor对象。2019-07-17 17:28:45492
1
-
原创 【Mybatis】 -- 工作流程+核心对象生命周期
JDBC连接数据库的问题1.代码重复2.结果集处理复杂,需要手动处理,对应表的字段和类型3连接管理复杂 ,需要手动打开和关闭连接4.sql写到了业务逻辑里面 耦合度太高 不利于管理mybatis特性使用连接池对连接进行管理sql和代码分离,集中管理参数映射和动态sql结果集映射缓存管理重复sql的提取插件机制工作流程图核心对象的生命周期在编程式使用的这个 dem...2019-07-24 22:09:14134
0
-
原创 【Java并发】-- ConcurrentHashMap如何实现高效地线程安全(jdk1.8)
1.传统集合框架并发编程中Map存在的问题?2.早期改进策略HashTableHashTable相比HashMap是线程安全的,因为HashTable所有的方法都是加了synchronized的,锁的是整个hashMap,也就是我们说的锁的粒度比较大,由于最基本的put,set操作都加了互斥锁,造成的结果就是同一时间点只能由一个线程put或只能get,并发操作时所有的put,get操作都...2019-07-21 20:39:312114
1
-
原创 【Redis】-- 核心原理(数据类型+缓存异常+集群)
一、简介分布式缓存是分布式系统中的重要组件,主要解决高并发、大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问。使用缓存常见场景是:项目中部分数据访问比较频繁,对下游 DB(例如 MySQL)造成服务压力,这时候可以使用缓存来提高效率。缓存组件有很多种,大家熟知的 Redis、Tair、MemCache 等。今天我们重点介绍 Redis 缓存数据库相关的内容知识。Redis 是开源免...2019-08-25 21:39:55438
0
-
原创 【Nginx】
Nginx高性能的反向代理服务器正向代理:代理客户端反向代理:代理服务端http服务器服务端监听一个端口,当client发起一个请求的时候,服务端会根据请求返回相应的资源eg: apache ,nginx,tomcat,jetty静态服务器只返回静态资源,本身不具备解析jsp,servlet等资源的能力,但可以依赖第三方模块来做动态解析的补充apache(早期,并发量扛不住) , ...2019-09-01 21:44:44198
0
-
原创 【java并发】 --wait与notify原理
重量级锁通过对象内部的监视器(monitor)实现,其中monitor的本质是依赖于底层操作系统的Mutex Lock实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高。前面我们在讲Java对象头的时候,讲到了monitor这个对象,在hotspot虚拟机中,通过ObjectMonitor类来实现monitor。他的锁的获取过程的体现会简单很多.wait 和notif...2019-09-04 17:28:403059
3
-
原创 2019-2-17-- blob类型与text类型
blob与text异同比较:## 同- text与blog类型的数据存储或检索过程中都不存在大小写转换。- text与blob类型的数据索引必须制定索引前缀的长度- 不能有默认值2019-02-17 20:48:17310
2
-
原创 【jvm学习笔记】--jvm运行时数据区
通过软件虚拟的具有完善硬件系统功能的,运行在完整隔离环境中的完整计算机系统。2018-12-30 20:54:22201
3
-
原创 图解MQ应用场景+技术选型
为什么使用消息队列啊?消息队列有什么优点和缺点啊?kafka、activemq、rabbitmq、rocketmq都有什么区别以及适合哪些场景?2019-06-23 21:38:18405
2
-
原创 消息队列的可靠性如何保证?(RabbitMQ)
如何保证消息队列的高可用啊?MQ的缺点,我已经说过了,有好多,可以文章链接跳转查看,导致系统可用性降低,等等。所以只要你用了MQ,接下来问的一些要点肯定就是围绕着MQ的那些缺点怎么来解决了。...2019-06-09 22:20:24154
2
-
原创 IDEA自动生成方法时序图 -- Sequence Diagram(一款超好用的Idea插件)
安装插件:使用:在方法上右击选择Sequence Diagram设置参数:可在控制台内查看时序图结果:2017-04-09 20:06:148212
29
-
原创 springboot --springApplication
1234567892019-08-11 21:48:10168
1
-
原创 【Java并发】-- Lock和Synchronized的选择
2019-08-10 08:13:22169
0
-
原创 【Dubbo】-- 掌握Dubbo原理你需要明白这些
1、dubbo中"读接口"和"写接口"有什么区别?2、谈谈dubbo中的负载均衡算法及特点?3、最小活跃数算法中是如何统计这个活跃数的?4、简单谈谈你对一致性哈希算法的认识?5、服务发布过程中做了哪些事?6、dubbo都有哪些协议,他们之间有什么特点,缺省值是什么?7、什么是本地暴露和远程暴露,他们的区别?8、服务提供者能实现失效踢出是根据什么原理?9、讲讲dubbo服务暴露中本地...2019-08-05 15:31:50526
1
-
原创 【Dubbo】-- SPI扩展点剖析
spi,简单来说,就是service provider interface,比如你有个接口,现在这个接口有3个实现类,那么在系统运行的时候对这个接口到底选择哪个实现类呢?这就需要spi了,需要根据指定的配置或者是默认的配置,去找到对应的实现类加载进来,然后用这个实现类的实例对象2019-08-04 21:58:11135
0
-
原创 【Java并发】-- Condition机制原理分析
Condition之前用synchronized的时候,使用wait/notify可以实现线程间的通信。除此之外,JUC包里提供了类似的线程通信机制,Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒;Condition基本使用ConditionWaitpublic class ConditionDem...2019-07-23 00:01:11626
0
-
原创 【Dubbo】-- 基本应用与核心机制
文章目录1.dubbo产生的背景2.dubbo可以满足的需求3.dubbo架构图3.1 dubbo各节点之间调用关系3.2 dubbo各个节点角色3.3 dubbo架构特点4.dubbo所支持的协议:5. Dubbo核心的配置:5.2 配置之间的关系:5.3 配置优先级6.服务调用时阻塞的吗?调用流程图?7.容错机制7.1 dubbo提供了哪些容错机制?7.2 如何配置?8.服务降级?8.2 du...2019-08-04 21:54:42261
1