Jone Sun's Blog

用心发现,这个星球很美!

0%

next高版本的已经默认集成gitalk插件, 如果你本地没找到配置,尽快升级。目前我使用的是next 7.x版本,故只需要在_config.yml中打开gitalk配置即可

  1. 在GitHub新建Application

用于用户评论文章时登录授权

阅读全文 »

概念

JDK1.7引入了一种新的并行编程模式”fork-join”,它是实现了”分而治之”思想的Java并发编程框架。它对问题的解决思路是分而治之,先将一个问题fork(分为)几个子问题,然后子问题又分为孙子问题,直至细分为一个容易计算的问题,然后再将结果依次join(结合)为最终的答案。对程序员来说,叫递归思想更加合适。只不过普通的递归是在单线程中完成的,而这里的递归则把递归任务通过invokeAll()方法丢进了线程池中,让线程池来调度执行。

ForkJoinPool 不是为了替代 ExecutorService,而是它的补充,在某些应用场景下性能比 ExecutorService 更好

阅读全文 »

前言

日志是开发过程中必不可少的模块,出现异常后可以通过查看日志看排查原因

使用

常用日志框架

JDK Logging

JDK提供的日志框架,由于自身有些局限性,故不太流行

Commons Logging

Commons Logging是一个第三方日志库,它是由Apache创建的日志模块。Commons Logging的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons
Loggin自动搜索并使用Log4j(Log4j是另一个流行的日志系统),如果没有找到Log4j,再使用JDK Loggin

Log4j

Apache的提供的一种日志实现,现已不推荐使用

阅读全文 »

一、使用线程池的好处

  1. 降低系统资源消耗, 通过重用已存在的线程, 降低线程创建和销毁造成的消耗
  2. 提高系统响应速度, 当有任务到达时, 通过复用已存在的线程, 无需等待新线程的创建便能立即执行
  3. 方便线程并发数的管控。因为线程若是无限制的创建, 可能会导致内存占用过多而产生OOM, 并且会造成cpu过度切换(cpu切换线程是有时间成本的-需要保持当前执行线程的现场, 并恢复要执行线程的现场)。
  4. 提供更强大的功能, 如延时定时线程池
  5. ……

JVM在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不同,并且承受着多个因素制约,包括JVM的启动参数、Thread构造函数中请求栈的大小,以及底层操作系统对线程的限制等。如果破坏了这些限制,那么可能抛出OutOfMemoryError异常。

二、线程池实现

使用Executors中创建线程池的快捷方法, 实际上是调用了ThreadPoolExecutor的构造方法(定时任务使用的是ScheduledThreadPoolExecutor、CompletableFuture默认使用的是ForkJoinPool)

线程池设计

executorUML

阅读全文 »

SpringSecurity

以下代码基于SpringBoot 2.4.1(SpringSecurity 5.4.2)

简易版

使用SpringBoot可以很轻松的完成SpringSecurity的集成,因为SpringBoot默认帮我们做了很多事

默认创建一个UserDetailsService具有用户名user和随机生成的密码的Bean,并将其记录到控制台

未整理完成……

阅读全文 »

概念

ELK:Elasticsearch、Logstash、Kibana,组合起来可以搭建线上日志系统

各服务作用

  • Elasticsearch:用于存储收集到的日志信息;
  • Logstash:用于收集日志,SpringBoot应用整合了Logstash以后会把日志发送给Logstash,- Logstash再把日志转发给Elasticsearch;
  • Kibana:通过Web端的可视化界面来查看日志
阅读全文 »

JMH(Java Microbenchmark Harness)和jMeter的不同

JMH和jMeter的使用场景还是有很大的不同的,jMeter更多的是对rest api进行压测,而JMH关注的粒度更细,它更多的是发现某块性能槽点代码,然后对优化方案进行基准测试对比。比如json序列化方案对比,bean copy方案对比,文中提高的洗牌算法对比等。

官方样例

国人翻译的demo

应用场景

JMH比较典型的应用场景有:

  • 想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性
  • 对比接口不同实现在给定条件下的吞吐量,找到最优实现
  • 查看多少百分比的请求在多长时间内完成

JMH 可视化

将测试例子结果的 json 文件导入,就可以实现可视化

JMH Visual Chart

JMH Visualizer

阅读全文 »

设计模式是为了可扩展性,不要为了使用设计模式而使用

概念

为其他对象提供一种代理以控制对这个对象的访问

代理模式包含如下角色:

  • Subject:抽象主题角色。可以是接口,也可以是抽象类。
  • RealSubject:真实主题角色。业务逻辑的具体执行者。
  • ProxySubject:代理主题角色。内部含有RealSubject的引用,负责对真实角色的调用,并在真实主题角色处理前后做预处理和善后工作

使用场景

主要可以用于:日志记录,性能统计,安全控制,事务处理,异常处理等场景

阅读全文 »

引言

Java项目编程中,为了充分利用计算机CPU资源,一般开启多个线程来执行异步任务。多线有很多好处,其中最重要的是:

  • 可以发挥多核CPU的优势

随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。

  • 防止阻塞

从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。

一、Thread&Runnable

java1开始,常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。

从源码中可以看到,Thread也是实现Runnable接口的:

阅读全文 »

1.Random

Random从java1.0开始就已经引入,是线程安全的。

阅读全文 »