- 博客(49)
- 资源 (4)
- 收藏
- 关注
原创 聚合搜索引擎查询结果的开源项目gosearch
有段时间对于百度的搜索结果不满意,然后就比对了Google、Sogou、Bing、360、微信公众号、头条搜索对一个词的结果。
2022-12-20 10:03:14
866
原创 Guava监视器之Monitor
前言:对于一个控制锁的业务场景来说,有简单的也有复杂的,最简单的就是判断一个对象是否是null。再复杂点就是对于一个复杂条件的判断。判断的话如果是一个boolean类型,guava提供了一个监视器类来实现,相比传统java提供的ReentrantLock,synchronized,他提供了很大的便利性。好,我们一探窥见。1、Monitor介绍此类旨在代替ReentrantLock。与使用的代码相比,使用的代码Monitor 不易出错且可读性强ReentrantLock,而不会造成明显的性能损失。M
2021-04-03 23:17:27
627
1
原创 JUC之玩转Condition
每期总结一个小的知识点和相关面试题,嘿嘿,又来和大家共同学习了。GUC中有个类我们用的比较少,但是他确是很多类中不可或缺的成员。他就是Condition。从字面意思理解就是条件,那条件的话就有true or false。那Condition是起到一个多线程共享标识位执行阻塞的作用,true 的时候通过, false 的时候等待。1、Condition的使用通过下面的一个代码可以看出来如何使用它。// thread 1System.out.println("1 am thread 1
2021-03-28 19:34:50
206
原创 四种方法实现http服务
前言:对于微服务来说,如果我们要实现一个web服务,大部分人可能直接用springboot的spring-boot-starter-web了。我们知道spring-boot-starter-web默认实现是tomcat,当然你也可以选择其他服务器类型,比如Jetty、Undertow等。但是如果是一个非springboot项目,该如何实现呢?这里介绍了下四种实现方式,基于Tomcat、Jetty、JdkHttp、Netty实现内嵌web容器。Tomcat依赖的maven坐标: &
2021-03-23 13:59:54
859
原创 Object.wait() 和 LockSupport.park()的实现原理
Object.wait()在进行wait()之前,就代表着需要争夺Synchorized,而Synchronized代码块通过javap生成的字节码中包含monitorenter和monitorexit两个指令。当在进加锁的时候会执行monitorenter指令,执行该指令可以获取对象的monitor。同时在执行Lock.wait()的时候也必须持有monitor对象。LockSupport.park()操作对象归根结底,LockSupport调用的Unsafe中的native代码: publ
2021-03-15 22:49:28
557
2
原创 公平锁和非公平锁的区别
在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。本文围绕ReenTrantLock来讲。实现原理那如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。在公平的锁中,如果有另一个线程持有锁或者有其他线程
2021-03-14 22:25:13
741
原创 读写锁的原理
读写锁的使用读写锁在 Java 中是 ReentrantReadWriteLock,使用方式是:import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockDemo implements TestDemo { ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); ReentrantReadWriteLock.Rea
2021-03-13 10:15:57
142
原创 线程池源码研究
前言:第一次写源码分析类文章,有点忐忑,还是硬着头皮上了。之前几篇线程池文章主要是讲解线程池使用场景,这篇文章我以非代码方式讲解源码,这个估计没人这么干过吧!哈哈。说实话一打开那种源码贴,不够耐心真心看不完,而且也记不住啊,之前学过一段时间的《记忆法》,最强大脑里面的冠军袁文魁写了一本书专门讲记忆方法的书,里面说图形记忆是最快,记忆比较难忘的一种记忆方法,如果能加上情绪、味觉触觉就记的更牢了,这可能和人类历史也有关系,有文字才几千年,没文字的几百万年呢。没文字的时候只能靠图形、图案来记忆了。下面
2021-03-11 22:11:34
133
原创 volatile原理和使用场景
volatile 关键字只能用于修饰变量,无法用于修饰方法。并且 volatile 只能保证可见性,但不能保证操作的原子性。在具体编程中体现为:volatile 只能保证基本类型以及一般对象的引用赋值是线程安全的。volatile工作原理为什么 volatile 只能保证可见性,不能保证原子性呢?这跟它的工作原理有关。线程写 volaitle 变量的步骤为:改变线程工作内存中 volatile 变量副本的值将改变后的副本的值从工作内存刷新到主内存线程读 volatile 变量的步骤
2021-03-09 23:48:07
216
原创 synchronized几个小面试点
synchronized的锁升降级Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。图解通俗来讲就是:偏向锁:仅有一个线程进入临界区轻量级锁:多个线程交替进入临界区(java没有自旋锁的api,轻量
2021-03-08 22:58:46
117
原创 线程池如何传递ThreadLocal
前言在做分布式链路追踪系统的时候,需要解决异步调用透传上下文的需求,特别是传递traceId,本文就线程池透传几种方式进行分析。其他典型场景例子:分布式跟踪系统 或 全链路压测(即链路打标)日志收集记录系统上下文Session级Cache应用容器或上层框架跨应用代码给下层SDK传递信息1、JDK对跨线程传递ThreadLocal的支持首先看一个最简单场景,也是一个错误的例子。 void testThreadLocal(){ ThreadLocal<.
2021-03-06 21:51:00
713
9
原创 线程池使用的N种姿势
线程池在开发中一定会用到,如果能像golang一样,java语言也有协程,也许java程序员就少了一种包袱。回归正题,我们聊下到底有哪些线程池的使用方式,总结有以下几种。JDK 内置线程池Spring线程池自己魔改封装1、JDK 内置线程池常用的有:我们看下最全的线程池参数,探究为什么阿里规约不建议使用Executors创建默认个数的线程池。/**参数【7个】corePoolSize - 即使空闲时仍保留在池中的线程数,除非设置 allowCoreThreadTimeOutmax
2021-03-04 09:16:54
213
1
原创 线程问题怎么排查
线程状态的定义可见在 JDK 中定义的线程状态总共六种,各状态在特定条件下可以转换,其组成了一个线程的生命周期,为了方便理解,对其状态和转换整理成了列表和状态图的形式。状态描述NEW线程新建但是还没有 start 的时候,即 new Thread()RUNNABLE调用了 Thread 的 start() 方法,此时线程可运行,但是也有可能需要等待其他操作系统资源,比如处理器资源,当获取到处理器资源之后,则进入 RUNNING 状态BLOCKED当进入同步代码块时,如果
2021-03-03 09:21:28
592
原创 线程池怎么做到主动回调
某些业务场景需要在一个异步操作完成后做一个回调,如果使用Future有个问题,需要主动调用get然后再执行逻辑。但是异步逻辑不知道什么时候结束,所以推荐回调的方式处理比较优雅,本文总结了三种方式可以实现此类需求。1、CompletableFutureFuture可以明确地完成(设定其值和状态),并且可以被用作CompletionStage ,支持有关的功能和它的完成时触发动作。当两个或多个线程试图complete , completeExceptionally ,或cancel一个Completabl
2021-03-01 23:39:53
1187
原创 线程池执行流程
ThreadPoolExecutor介绍通过 ThreadPoolExecutor 创建线程池,API 如下所示:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
2021-03-01 00:19:12
479
原创 什么时候发生GC
首先gc一个对象在不可达之后,需要在第二次标记之后(finallize执行之后)什么时候发生yangeden区满了from区满了(会把from区和eden区不存活gc掉)fullgc什么时候发生old gcold区满了cms到达阈值了新来对象放不了fullgc本文由猿必过 YBG 发布...
2021-02-27 11:04:52
353
原创 什么是JIT?怎么优化?
什么是JITJIT 是 just in time 的缩写, 也就是即时编译编译器。在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用,因此从理论上来说,采用该 JIT 技术可以接近以前纯编译技术。下面我们看看,JIT 的工作过程。备注:寄存器的使用是编译器的一个非常普遍的优化。寄存器的速度比主存快很多。怎么优化JIT编译初级调优:客户模式或服务器模式中级编译器调优 (-cient,-server 或是-xx:+TieredCompilation)优化代码缓存 (–XX:Reserv
2021-02-26 15:42:39
1145
原创 JVM排查问题实战
CPU 资源占用过高top 查看当前 CPU 情况,找到占用 CPU 过高的进程 PID=123。top -H -p123 找出两个 CPU 占用较高的线程,记录下来 PID=2345, 3456 转换为十六进制。jstack -l 123 > temp.txt 打印出当前进程的线程栈。查找到对应于第二步的两个线程运行栈,分析代码。OOM 异常排查使用 top 指令查询服务器系统状态。ps -aux|grep java 找出当前 Java 进程的 PID。jstat -
2021-02-25 09:32:21
152
原创 JVM排查问题实战
CPU 资源占用过高top 查看当前 CPU 情况,找到占用 CPU 过高的进程 PID=123。top -H -p123 找出两个 CPU 占用较高的线程,记录下来 PID=2345, 3456 转换为十六进制。jstack -l 123 > temp.txt 打印出当前进程的线程栈。查找到对应于第二步的两个线程运行栈,分析代码。OOM 异常排查使用 top 指令查询服务器系统状态。ps -aux|grep java 找出当前 Java 进程的 PID。jstat -
2021-02-25 09:31:31
121
1
原创 强引用、软引用、弱引用、虚引用以及他们之间和 gc 的关系
强引用:new 出的对象之类的引用,只要强引用还在,永远不会回收。强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: Object strongReference = new Object();软引用:引用但非必须的对象,内存溢出异常之前,回收。软引用可以和一个引用队列(ReferenceQueue)联合使用。如果软引用所引用对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。ReferenceQueue<String> re
2021-02-24 09:55:06
449
2
原创 G1 与 CMS 两个垃圾收集器的对比
细节方面不同G1 在压缩空间方面有优势。G1 通过将内存空间分成区域(Region)的方式避免内存碎片问题。Eden, Survivor, Old 区不再固定、在内存使用效率上来说更灵活。G1 可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象。G1 在回收内存后会马上同时做合并空闲内存的工作、而 CMS 默认是在 STW(stop the world)的时候做。G1 会在 Young GC 中使用、而 CMS 只能在 O 区使用。整体内容不同吞吐量优先:G1
2021-02-22 22:51:54
403
原创 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?
常见的垃圾回收算法有:标记-清除算法、复制算法、标记-整理算法、分代收集算法标记-清除算法标记—清除算法包括两个阶段:“标记”和“清除”。 标记阶段:确定所有要回收的对象,并做标记。 清除阶段:将标记阶段确定不可用的对象清除。缺点:标记和清除的效率都不高。会产生大量的碎片,而导致频繁的回收。复制算法内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候, 把存活的对象复制到另一块上,然后把这块内存整个清理掉。缺点:需要浪费额外的内存作为复制区。当存活率较高时,复制算法效率会下降。
2021-02-21 23:34:15
601
原创 每日一个面试题
目标从2021.2.21开始,每天一个面试题行动使用openwrite扩散监督邀请朋友监督,群里发连接。本文由博客群发一文多发等运营工具平台 OpenWrite 发布
2021-02-21 08:54:33
64
原创 快捷键大全-私人收藏
IDEA快捷键这榜单阵容太豪华了,后几名都是如此有用,毫不示弱。Ø Top #10切来切去:Ctrl+TabØ Top #9选你所想:Ctrl+WØ Top #8代码生成:Template/Postfix +TabØ Top #7发号施令:Ctrl+Shift+AØ Top #6无处藏身:Shift+ShiftØ Top
2017-09-09 17:23:03
283
原创 新的Javadoc标签@apiNote,@implSpec和@implNote
JDK广泛使用新的标签。一些例子:并发地图:几个@implSpec定义了默认实现的行为,例如 replaceAll。 有趣的@impl注意 getOrDefault和 forEach。 重复@impl注意在Map中默认实现的抽象方法,记录“本实施方案有意地重新提取Map中提供的不正确的默认值”,例如 替换。 对象使用@apiNote解释为什么看似
2017-09-05 14:59:35
8024
原创 dubbo 服务启动不起来
环境: dubbox问题描述: 服务一直启动不了处理方法: dubbox添加了源码断点,所以起不来 ,下次遇到这种问题可以查看断点
2017-08-25 17:16:55
1358
原创 Dubbo RpcResult 提供者返回消费者数据
在服务治理项目中发现有个蹊跷的问题:重新步骤: 1、参考Dapper论文,提供者会需要记录SR、SS信息2、提供者包装SR、SS信息,记录到RpcResult的attachments中private void setRpcResult(RpcResult result,Span span,String startTime){ Map<String, String> att
2017-08-24 10:28:55
3836
原创 Mycat 哪些sql不能解析
MyCat不支持的SQL语句类型SELECT:Ø 跨分片(实体库)的交叉查询Ø 跨节点的联合查询 (如用户库的表和平台库的表做联合查询) INSERT:Ø 插入的字段不包含分片字段 (如插入tbl_user_base_info表,没有提供user_id列)Ø 插入的分片字段找不到对应分片Ø 复制插入Insert into…select… Ø 多行插入 insert
2017-07-21 15:03:55
729
Eclipse tomcat发布server options说明
Serve modules without publishing:这个选项是WebContent的文件夹会作为动态web project发布过去,用户自定义的context管理类包的依赖,eclipse classpath设置需要的jar都会按照WebDeployment的设置完全移动过去。 Publish module contexts to separate XML files就是...
2015-03-17 11:10:31
1064
原创 tomcat初始化做了什么
最近没事,看了下tomcat源码,tomcat启动的时候做了些什么?org\apache\catalina\startup\Bootstrap.java 发现这个类有个main访问,启动的时候调用这个类。我想应用启动的时候应该是后台启动一个线程在跑。 public void init() throws Exception { // ...
2014-10-26 14:12:30
280
原创 mybatis源码解析
类列表:SqlSessionFactory 说明:sqlsession对象的工场用于创建sqlsession。SqlSession 说明:执行sql的接口类。Configuration 说明:数据库连接和sql语句配置类。MappedStatement 说明:数据库操作的一些变量Executor 说明数据操作方法接口类 步骤: 加载xml文件到XMLCon...
2014-10-15 10:28:03
131
原创 classloader有哪些
classLoader, defaultClassLoader, Thread.currentThread().getContextClassLoader(), getClass().getClassLoader(), systemClassLoader}; 补充:类加载器对应的java类...
2014-10-15 09:32:59
270
oracle更新字段和查询效率高的方式
在含有子查询的SQL语句中,要特别注意减少对表的查询。如:查询 低效: SELECT TAB_NAME FROMTABLES WHERE TAB_NAME = (SELECT TAB_NAME FROM TAB_COLUMNS WHEREVERSION...
2014-08-12 09:13:26
270
原创 搜索引擎归并法和排序法
建排序法分配固定大小内存来建立索引:优点是无论要建立索引的文档集合有多大,都可以通过这种方法完成。缺点是分配的内存定额被消耗光时,排序法只是将中间结果写入磁盘,导致后期中间结果可以用的内存越来越少。 归并法:分为两个阶段:1、首先在内存里维护中间结果,内存满了后,将内存数据写入磁盘临时文件2、对临时文件进行归并形成最终索引 ...
2014-06-27 15:40:40
186
原创 Solr搜索配置关联词synonyms
在搜索中,往往需要用到关联词(近义词),比如,搜索 “联想” 品牌那么我们同时搜索 “lenovo”等,solr为我们提供了近义词过滤器solr.SynonymFilterFactory。配置搜索近义词很简单,只要在schema字段定义过滤器01<fieldType name="textMaxWord" class="solr.TextField" positi...
2014-02-17 21:34:37
464
eclipse使用中遇到的问题
1.eclipse.ini借鉴配置 -startupplugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20130521-0416-produ...
2014-02-13 15:28:32
298
原创 apache 覆盖文件时访问异常
背景:4个apache配置到一个hub上共享存储。 问题:在apache上上传一个同名的css、js、图片时,网站访问这个文件时会出现访问不到的异常。 不知道这个是什么原因?...
2014-02-11 11:08:38
215
oracle图形化sqlplus小工具(jdbc,java实现)
2009-10-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人