自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阿凡提煮鸡蛋

发现问题,解决问题,终生学习

  • 博客(49)
  • 资源 (4)
  • 收藏
  • 关注

原创 聚合搜索引擎查询结果的开源项目gosearch

有段时间对于百度的搜索结果不满意,然后就比对了Google、Sogou、Bing、360、微信公众号、头条搜索对一个词的结果。

2022-12-20 10:03:14 634 1

原创 Guava监视器之Monitor

前言:对于一个控制锁的业务场景来说,有简单的也有复杂的,最简单的就是判断一个对象是否是null。再复杂点就是对于一个复杂条件的判断。判断的话如果是一个boolean类型,guava提供了一个监视器类来实现,相比传统java提供的ReentrantLock,synchronized,他提供了很大的便利性。好,我们一探窥见。1、Monitor介绍此类旨在代替ReentrantLock。与使用的代码相比,使用的代码Monitor 不易出错且可读性强ReentrantLock,而不会造成明显的性能损失。M

2021-04-03 23:17:27 511 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 167

原创 四种方法实现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 640

原创 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 495 1

原创 公平锁和非公平锁的区别

在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。本文围绕ReenTrantLock来讲。实现原理那如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。在公平的锁中,如果有另一个线程持有锁或者有其他线程

2021-03-14 22:25:13 711

原创 读写锁的原理

读写锁的使用读写锁在 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 104

原创 线程池源码研究

前言:第一次写源码分析类文章,有点忐忑,还是硬着头皮上了。之前几篇线程池文章主要是讲解线程池使用场景,这篇文章我以非代码方式讲解源码,这个估计没人这么干过吧!哈哈。说实话一打开那种源码贴,不够耐心真心看不完,而且也记不住啊,之前学过一段时间的《记忆法》,最强大脑里面的冠军袁文魁写了一本书专门讲记忆方法的书,里面说图形记忆是最快,记忆比较难忘的一种记忆方法,如果能加上情绪、味觉触觉就记的更牢了,这可能和人类历史也有关系,有文字才几千年,没文字的几百万年呢。没文字的时候只能靠图形、图案来记忆了。下面

2021-03-11 22:11:34 103

原创 volatile原理和使用场景

volatile 关键字只能用于修饰变量,无法用于修饰方法。并且 volatile 只能保证可见性,但不能保证操作的原子性。在具体编程中体现为:volatile 只能保证基本类型以及一般对象的引用赋值是线程安全的。volatile工作原理为什么 volatile 只能保证可见性,不能保证原子性呢?这跟它的工作原理有关。线程写 volaitle 变量的步骤为:改变线程工作内存中 volatile 变量副本的值将改变后的副本的值从工作内存刷新到主内存线程读 volatile 变量的步骤

2021-03-09 23:48:07 175

原创 synchronized几个小面试点

synchronized的锁升降级Java SE1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。图解通俗来讲就是:偏向锁:仅有一个线程进入临界区轻量级锁:多个线程交替进入临界区(java没有自旋锁的api,轻量

2021-03-08 22:58:46 91

原创 线程池如何传递ThreadLocal

前言在做分布式链路追踪系统的时候,需要解决异步调用透传上下文的需求,特别是传递traceId,本文就线程池透传几种方式进行分析。其他典型场景例子:分布式跟踪系统 或 全链路压测(即链路打标)日志收集记录系统上下文Session级Cache应用容器或上层框架跨应用代码给下层SDK传递信息1、JDK对跨线程传递ThreadLocal的支持首先看一个最简单场景,也是一个错误的例子。 void testThreadLocal(){ ThreadLocal<.

2021-03-06 21:51:00 642 9

原创 线程池使用的N种姿势

线程池在开发中一定会用到,如果能像golang一样,java语言也有协程,也许java程序员就少了一种包袱。回归正题,我们聊下到底有哪些线程池的使用方式,总结有以下几种。JDK 内置线程池Spring线程池自己魔改封装1、JDK 内置线程池常用的有:我们看下最全的线程池参数,探究为什么阿里规约不建议使用Executors创建默认个数的线程池。/**参数【7个】corePoolSize - 即使空闲时仍保留在池中的线程数,除非设置 allowCoreThreadTimeOutmax

2021-03-04 09:16:54 162 1

原创 线程问题怎么排查

线程状态的定义可见在 JDK 中定义的线程状态总共六种,各状态在特定条件下可以转换,其组成了一个线程的生命周期,为了方便理解,对其状态和转换整理成了列表和状态图的形式。状态描述NEW线程新建但是还没有 start 的时候,即 new Thread()RUNNABLE调用了 Thread 的 start() 方法,此时线程可运行,但是也有可能需要等待其他操作系统资源,比如处理器资源,当获取到处理器资源之后,则进入 RUNNING 状态BLOCKED当进入同步代码块时,如果

2021-03-03 09:21:28 458

原创 线程池怎么做到主动回调

某些业务场景需要在一个异步操作完成后做一个回调,如果使用Future有个问题,需要主动调用get然后再执行逻辑。但是异步逻辑不知道什么时候结束,所以推荐回调的方式处理比较优雅,本文总结了三种方式可以实现此类需求。1、CompletableFutureFuture可以明确地完成(设定其值和状态),并且可以被用作CompletionStage ,支持有关的功能和它的完成时触发动作。当两个或多个线程试图complete , completeExceptionally ,或cancel一个Completabl

2021-03-01 23:39:53 1002

原创 线程池执行流程

ThreadPoolExecutor介绍通过 ThreadPoolExecutor 创建线程池,API 如下所示:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,

2021-03-01 00:19:12 436

原创 什么时候发生GC

首先gc一个对象在不可达之后,需要在第二次标记之后(finallize执行之后)什么时候发生yangeden区满了from区满了(会把from区和eden区不存活gc掉)fullgc什么时候发生old gcold区满了cms到达阈值了新来对象放不了fullgc本文由猿必过 YBG 发布...

2021-02-27 11:04:52 310

原创 什么是JIT?怎么优化?

什么是JITJIT 是 just in time 的缩写, 也就是即时编译编译器。在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用,因此从理论上来说,采用该 JIT 技术可以接近以前纯编译技术。下面我们看看,JIT 的工作过程。备注:寄存器的使用是编译器的一个非常普遍的优化。寄存器的速度比主存快很多。怎么优化JIT编译初级调优:客户模式或服务器模式中级编译器调优 (-cient,-server 或是-xx:+TieredCompilation)优化代码缓存 (–XX:Reserv

2021-02-26 15:42:39 901

原创 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 106

原创 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 93 1

原创 强引用、软引用、弱引用、虚引用以及他们之间和 gc 的关系

强引用:new 出的对象之类的引用,只要强引用还在,永远不会回收。强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: Object strongReference = new Object();软引用:引用但非必须的对象,内存溢出异常之前,回收。软引用可以和一个引用队列(ReferenceQueue)联合使用。如果软引用所引用对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。ReferenceQueue<String> re

2021-02-24 09:55:06 389 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 318

原创 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

常见的垃圾回收算法有:标记-清除算法、复制算法、标记-整理算法、分代收集算法标记-清除算法标记—清除算法包括两个阶段:“标记”和“清除”。 标记阶段:确定所有要回收的对象,并做标记。 清除阶段:将标记阶段确定不可用的对象清除。缺点:标记和清除的效率都不高。会产生大量的碎片,而导致频繁的回收。复制算法内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候, 把存活的对象复制到另一块上,然后把这块内存整个清理掉。缺点:需要浪费额外的内存作为复制区。当存活率较高时,复制算法效率会下降。

2021-02-21 23:34:15 535

原创 每日一个面试题

目标从2021.2.21开始,每天一个面试题行动使用openwrite扩散监督邀请朋友监督,群里发连接。本文由博客群发一文多发等运营工具平台 OpenWrite 发布

2021-02-21 08:54:33 43

原创 Hyperledger fabric 小试牛刀和遇到的问题汇总

区块链

2018-03-19 11:15:30 924

原创 快捷键大全-私人收藏

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 254

原创 新的Javadoc标签@apiNote,@implSpec和@implNote

JDK广泛使用新的标签。一些例子:并发地图:几个@implSpec定义了默认实现的行为,例如 replaceAll。 有趣的@impl注意 getOrDefault和 forEach。 重复@impl注意在Map中默认实现的抽象方法,记录“本实施方案有意地重新提取Map中提供的不正确的默认值”,例如 替换。 对象使用@apiNote解释为什么看似

2017-09-05 14:59:35 7763

原创 dubbo 服务启动不起来

环境: dubbox问题描述: 服务一直启动不了处理方法: dubbox添加了源码断点,所以起不来 ,下次遇到这种问题可以查看断点

2017-08-25 17:16:55 1287

原创 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 3728 1

原创 maven引入多个相同的jar,但是版本号不同

mark:同级的会高版本覆盖低版本依赖引入的,都会存在。

2017-08-24 10:17:34 17615 2

原创 Mycat 哪些sql不能解析

MyCat不支持的SQL语句类型SELECT:Ø 跨分片(实体库)的交叉查询Ø 跨节点的联合查询 (如用户库的表和平台库的表做联合查询) INSERT:Ø 插入的字段不包含分片字段 (如插入tbl_user_base_info表,没有提供user_id列)Ø 插入的分片字段找不到对应分片Ø 复制插入Insert into…select… Ø 多行插入 insert 

2017-07-21 15:03:55 675

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 943

原创 tomcat初始化做了什么

最近没事,看了下tomcat源码,tomcat启动的时候做了些什么?org\apache\catalina\startup\Bootstrap.java 发现这个类有个main访问,启动的时候调用这个类。我想应用启动的时候应该是后台启动一个线程在跑。 public void init()        throws Exception    {         // ...

2014-10-26 14:12:30 248

原创 mybatis源码解析

类列表:SqlSessionFactory 说明:sqlsession对象的工场用于创建sqlsession。SqlSession 说明:执行sql的接口类。Configuration 说明:数据库连接和sql语句配置类。MappedStatement 说明:数据库操作的一些变量Executor 说明数据操作方法接口类 步骤:    加载xml文件到XMLCon...

2014-10-15 10:28:03 100

原创 classloader有哪些

        classLoader,         defaultClassLoader,         Thread.currentThread().getContextClassLoader(),         getClass().getClassLoader(),         systemClassLoader};  补充:类加载器对应的java类...

2014-10-15 09:32:59 236

原创 缩写大全

On-Line Transaction Processing联机事务处理系统(OLTP)也称为面向交易的处理系统

2014-08-12 10:03:18 198

oracle更新字段和查询效率高的方式

在含有子查询的SQL语句中,要特别注意减少对表的查询。如:查询     低效:          SELECT TAB_NAME  FROMTABLES WHERE TAB_NAME =  (SELECT TAB_NAME                        FROM TAB_COLUMNS                      WHEREVERSION...

2014-08-12 09:13:26 224

原创 搜索引擎归并法和排序法

建排序法分配固定大小内存来建立索引:优点是无论要建立索引的文档集合有多大,都可以通过这种方法完成。缺点是分配的内存定额被消耗光时,排序法只是将中间结果写入磁盘,导致后期中间结果可以用的内存越来越少。 归并法:分为两个阶段:1、首先在内存里维护中间结果,内存满了后,将内存数据写入磁盘临时文件2、对临时文件进行归并形成最终索引 ...

2014-06-27 15:40:40 150

原创 Solr搜索配置关联词synonyms

在搜索中,往往需要用到关联词(近义词),比如,搜索 “联想” 品牌那么我们同时搜索 “lenovo”等,solr为我们提供了近义词过滤器solr.SynonymFilterFactory。配置搜索近义词很简单,只要在schema字段定义过滤器01&lt;fieldType name="textMaxWord" class="solr.TextField" positi...

2014-02-17 21:34:37 408

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 256

原创 apache 覆盖文件时访问异常

  背景:4个apache配置到一个hub上共享存储。 问题:在apache上上传一个同名的css、js、图片时,网站访问这个文件时会出现访问不到的异常。 不知道这个是什么原因?...

2014-02-11 11:08:38 184

旅游景点网页设计

一个学生用的网页制作的课程设计,有个五个旅游景点的介绍。

2013-01-14

oracle图形化sqlplus小工具(jdbc,java实现)

这个工具可以实现图形化操作oracle数据库 要设置classpath包含oracle驱动路径 这个sqlplus是自动提交的,运行sqlplus.bat。 数据库地址请修改JdbcUtil.java文件

2009-10-22

java关机精灵,awt编程实例

在gui图形化设计下,使用cmd shutdown命令 借助java awt Jcombox组件实现关机图形化,智能化。

2009-04-05

五子棋dos版本(java)实现

本java程序在dos环境下实现五子棋的功能,用坐标实现下棋的操作。

2008-12-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除