- 博客(65)
- 资源 (2)
- 收藏
- 关注
转载 JVM对synchronized的锁优化
一、 Synchronized实现 Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的,监视器锁本质又是依赖于底层的操作系统的Mutex Lock(互斥锁)来实现的。而操作系统实现线程之间的切换需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。 Java SE 1.6为了减少获得锁和...
2020-09-22 09:52:53
196
原创 Redis几种数据类型的底层实现
redis的几种数据类型有:string 、hash 、list、 set 、zsetredis里面key都是一个地址,value都是一个redisObject对象1.String的底层实现:string原理底层字符串特性? 1).二进制安全(体现在len这个字段上) 2).避免频繁的内存分配,进行内存得预分配(体现在上面扩容过程) 3).兼容c语言函数库(其实底层都会加\0占一个字节作为字符串结尾)2.哈希底层的实现:数组 + 链表(采用头插法解决冲突,不会像...
2020-09-21 22:02:57
331
转载 理解java线程的中断(interrupt)(写得非常好)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢?一个比较优雅而安全的做法是:使用等待/通知机制或者给那个线程一个中断信号, 让它自己决定该怎么办。等待/通过机制在另一篇博客中详细的介绍了。这里我们理解线
2020-08-22 23:03:15
318
原创 io多路复用
I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。select,poll,epoll都是IO多路复用的机制。select相关函数定义如下/* According to POSIX.1-2001, POSIX.1-2008 */ #include <sys/select.h> /* According to earlier standards */ #include <sys
2020-07-21 10:10:08
191
1
原创 netty
一、Netty简介Netty是一个高性能、异步事件驱动的网络应用框架,提供了对TCP、UDP和文件传输的支持,用于快速开发可维护的高性能服务器和客户端。作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。Netty常见使用场景互联网行业在分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高新能的通信框架,往往作为基础通信组件被这些RPC框架使用
2020-07-21 10:06:57
163
原创 RestTemplateUtils的一个通用工具类
一、RestTemplate介绍 RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 RestTemplate能大幅简化了提交表单数据的难度,并且附带了自动转换JSON数据的功能,但只有理解了HttpEntity的组成结构(header与body...
2020-04-14 13:13:42
1623
原创 多线程交替打印ABC以及两个线程交叉打印100以内奇偶数
一、两个线程交叉打印100以内奇偶数,打印结束后线程正常结束。实现方式一:实现方式二:二、3个线程交替打印ABC1.通过ReentrantLock我们可以很方便的进行显式的锁操作,即获取锁和释放锁,对于同一个对象锁而言,统一时刻只可能有一个线程拿到了这个锁,此时其他线程通过lock.lock()来获取对象锁时都会被阻塞,直到这个线程通过lock.unlock()操作释放...
2020-04-02 17:10:13
484
原创 BFS与DFS常见算法总结
关于BFS于DFS一般用于在图论中来遍历图(树是一个特殊的图),最难的就在于我们常常不知道这是一个可以用BFS、DFS来解决的一个问题,因为通常题目都表达得很隐晦,需要我们取转化取构建一个图,难度较大。同时可能也需要结合Stack与Queue这两种数据结构来解决问题,或者能用BFS、DFS解决的问题有时候其实是可以用动态规划来解决的。 题目中有最短路,最小步数什么的关键字也...
2019-10-07 11:43:57
485
原创 栈与队列相关算法总结
一、栈 使用栈这种数据结构作为辅助空间最典型的情况就是当前元素需要与前面的元素做比较 或者在树、图中化递归为非递归20.Valid ParenthesesGiven a string containing just the characters'(',')','{','}','['and']', determine if the input string is ...
2019-10-06 17:42:47
374
原创 链表相关算法题总结
一、链表反转1.206.Reverse Linked ListReverse a singly linked list.Example:Input: 1->2->3->4->5->NULLOutput: 5->4->3->2->1->NULL代码如下:class Solution { publi...
2019-10-06 11:17:11
140
转载 jvm内存与类加载机制
JVM内存结构 待补充.....类加载机制一:java类的加载过程编译后的Java类是以字节码的形式存在的,它只有被加载到虚拟机内存中才能被使用,它是如何被加载到内存中的呢?下图为类加载到内存的机制:作者:夏昊链接:https://www.zhihu.com/question/20097631/answer/817071740来源:知乎著作权归作者所有...
2019-10-05 16:57:45
188
原创 滑动窗口问题归纳
今后遇到滑动窗口问题都可先按该模板来写1. leetcode:3.Longest Substring Without Repeating CharactersGiven a string, find the length of thelongest substringwithout repeating characters.Example 1:Input: "abcabcb...
2019-10-04 18:40:59
458
原创 MySql常见面试题
1.mysql中主键与索引区别与联系关系数据库依赖于主键,它是数据库物理模式的基石。主键在物理层面上只有两个用途: 惟一地标识一行。 作为一个可以被外键有效引用的对象。 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。下面是主键和索引的一些区别与联系。参考:https://www.c...
2019-09-24 20:02:39
232
转载 MySql为何默认不用hash索引而用BTree索引的几点原因
hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash ...
2019-09-24 19:33:18
1325
原创 内存泄漏与内存溢出
一.内存泄漏1.什么是内存泄漏 内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。Java使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的2.内存泄漏场景 java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个...
2019-09-24 18:38:12
260
原创 Servlet
一、Serlvet1.什么是Serlvet?Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的,运行在服务器端。2.servlet的体系结构: Servlet:接口 | GenericServlet:抽象类 | HttpServlet:抽象类 | 自定义serv...
2019-09-23 19:35:04
170
原创 在中间件调优过程中的几种高性能的队列
一、阻塞队列 由于阻塞队列是加了锁的。所以在阻塞队列是一个性能瓶颈,影响中间件传输数据速度。二、disruptor Disruptor是一个无锁高性能安全的队列三、自定义祖列 最后采用了一种github上实现的无锁、线程安全的队列(类似于阻塞队列,用atomicLong实现以至于无锁,同时解决了伪共享问题) https://github...
2019-09-05 10:49:02
637
原创 java中RandomAccessFile的应用场景及使用实例
一、介绍 Java中的RandomAccessFile提供了对文件的读写功能。RandomAccessFile 虽然属于java.io下的类,但它不是InputStream或者OutputStream的子类;它也不同于FileInputStream和FileOutputStream。 FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对...
2019-09-05 10:34:07
500
原创 ByteBuffer与ByteBuf用法比较
一、ByteBuffer实现原理对于ByteBuffer,其主要有五个属性:mark,position,limit,capacity和array。mark:记录了当前所标记的索引下标; position:对于写入模式,表示当前可写入数据的下标,对于读取模式,表示接下来可以读取的数据的下标; limit:对于写入模式,表示当前可以写入的数组大小,默认为数组的最大长度,对于读取模式,表示当...
2019-09-05 09:47:25
1091
原创 Java多线程-CompletionService
一、CompletionService介绍 CompletionService是jdk1.5用来取代Future效率不高的, CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理。CompletionService将Executor和BlockingQueue功能融合在一起,将Callable...
2019-08-28 10:18:19
118
原创 如何线程安全地遍历List
一、ArrayList遍历问题1.当只有一个线程迭代遍历ArrayList时:边遍历边修改List元素会出现ConcurrenMdifyedException 正确方法可以采用迭代器遍历迭代器修改元素2.当多个线程访问ArrayList时(如:一个线程在遍历,一个线程在删除元素): 想要线程安全的遍历可以采用: 1)CopyOnWriteArrayLis...
2019-08-26 20:02:16
1230
原创 jvm调优常用参数设计值
一、堆内存分布1.新生代:每次新生代的垃圾回收(又称Minor GC)后只有少量对象存活,所以选用复制算法(有Eden区,两个Survivor区), 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区2.老年代:新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代(又称Major GC)通常使用“标记-清理”或“标记-...
2019-07-21 15:19:46
507
原创 Java对象锁和类锁全面解析
一、对象锁与类锁 1. 首先应该了解jvm内存模型才能更深入理解: (1)栈区:主要存储的是局部变量值和对象引用,常量池的引用,每个线程私有; (2)堆区:主要存储的是对象实例、数组,所有线程共享此区域; (3)方法区:主要存储静态变量、静态常量、静态方法、类信息,所有线程共享此区域; (4)程序计...
2019-07-13 22:36:45
765
原创 Jprofiler
一、JProfiler是什么 JProfiler是由ej-technologies GmbH公司开发的一款性能瓶颈分析工具,非常强大,分析cpu使用内存使用,虚拟机垃圾回收情 况等等二、破解安装 破解版本:https://dl.isharepc.com/files/117111.html三、使用教程 推荐:https://blog.csdn....
2019-07-10 15:52:07
216
原创 linux下几个监控工具
一、工具名称 jps jstat jinfo jmap jhat jstack 五种二、用法1).jps jps -l2)jstat jstst -gcutil pid 用得比较多用于查看垃圾回收次数以及回收时间3).ji...
2019-07-10 15:42:06
306
原创 linux如何使用jstack分析线程状态
在高并发,多线程环境下的java程序经常需要分析线程状态,本本是一个分析步骤无具体讲解(具体命令可自行google学习)一般流程:1.使用 jps-l 查看有哪些java程序在运行2.使用 top 查看步骤1中进程号(pid或者vmid)所占用cpu以及内存情况(或者省略步骤1)3.使用top -Hp pid 查看具体该pid下各个线程所占用的cpu情况(进程下的线程有一个ni...
2019-07-10 11:02:53
1264
原创 阻塞队列
关于阻塞队列主要用于java多线程消费者-生产者的模型,阻塞队列是线程安全的 ,put 、get等操作都加了锁,当阻塞队列为空时整个队列会阻塞,直到有数据位置,才可以取出。阻塞队列中的方法 VS 非阻塞队列中的方法1.非阻塞队列中的几个主要方法: add(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常; r...
2019-06-22 14:38:03
93
原创 netty(三)LengthFieldBasedFrameDecoder解码器的使用例子
1.需求 :发送数据接收数据个格式/** * 发送数据格式 接收数据的格式 * +---2----+--2--+---4--+--4--+----512---+---512-----+-----+-------+-------+-------+---------+ *...
2019-06-15 09:32:41
2031
2
原创 netty(二)LengthFieldBasedFrameDecoder解码器的详情
1.关于LengthFieldBasedFrameDecoder LengthFieldBasedFrameDecoder是netty解决拆包粘包问题的一个重要的类,主要结构就是header+body结构。我们只需要传入正确的参数就可以发送和接收正确的数据,重点就在于这几个参数的意义。下面我们就具体了解一下这几个参数的意义。先来看一下LengthFieldBasedFrameDeco...
2019-06-15 08:59:25
354
原创 java8 Lamba表达式
首先弄清函数式接口与Lamba表达式关系?(红色部分概念自行google) 只有有了函数式接口才可以写lamba表达式。一、java内置的四种函数式接口1.Predicate < T >接口是只有一个参数的返回布尔类型值的断言型接口 boolean test(T t);2.Function <R , T >接口 ...
2019-06-09 16:39:50
288
原创 netty入门(一)
1.关于netty可以自行google,我先概述一下netty入门helloword 只要按步骤写 入门后就可自己专研源码用maven构建:<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> ...
2019-06-07 12:35:50
157
转载 leetcode关于位操作算法题总结
n&(n-1)代表消掉n化为二进制最低位的1 -------应用非常多本文将根据题目总结常用的位操作常用的解决算法问题的技巧详见:https://blog.csdn.net/huanghanqian/article/details/79343855...
2019-05-12 21:21:09
148
转载 BlockingQueue在多线程中运用
参考:https://www.cnblogs.com/fnlingnzb-learner/p/9784776.html
2019-05-09 10:19:03
348
转载 注解
注解是什么? 注解如同标签,初学者可以这样理解注解:想像代码具有生命,注解就是对于代码中某些鲜活个体的贴上去的一张标签。简化来讲,注解如同一张标签。元注解是什么意思呢? 元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。具体内容参考:https://www.cnblogs.com/fnlingnzb-learne...
2019-05-09 09:44:25
99
转载 java泛型
泛型接口、类、方法。等以后总结一下参考:https://www.cnblogs.com/fnlingnzb-learner/p/7265104.html
2019-05-08 21:47:16
68
原创 final与不可变对象探究
一、不可变对象理解1. 什么是不可变对象不可变对象是指对象被创建之后,其内部状态保存不变的对象(内部成员变量值不会被改变,因为没有set方法)。这意味着其公开的API保证在对象的整个生命周期中其行为保持一致。可变不可变其实质是:地址里面的值可变还是不可变不可变的原因有:无set方法,则里面存储值无法改变可变原因:1.有set方法实现 ...
2019-05-08 20:37:01
538
转载 内存泄漏与内存溢出
内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间。 一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出 out of memory:指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢...
2019-05-06 09:55:26
114
原创 leetcode 上两个关于求子数组最大值
1. 53. Maximum Subarray题意:Given an integer arraynums, find the contiguous subarray(containing at least one number) which has the largest sum and return its sum.(即求连续子数组的最大值)详见:https://leetcode....
2019-04-24 15:49:51
169
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人