• 精通多线程,却不会异步编程?

    前言以前需要异步执行一个任务时,一般是用Thread或者线程池Executor去创建。如果需要返回值,则是调用Executor.submit获取Future。但是多个线程存在依赖组合,我们又能怎么办?可使用同步组件CountDownLatch、CyclicBarrier等;其实有简单的方法,就是用CompletableFuture线程任务的创建线程任务的串行执行线程任务的并行执...

    Java 2020年12月20日 66 0
  • Java高性能编程实战 --- 线程封闭与ThreadLocal

    1 线程封闭多线程访问共享可变数据时,涉及到线程间数据同步的问题。并不是所有时候,都要用到 共享数据,所以线程封闭概念就提出来了。数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使 用同步的技术称为线程封闭。避免并发异常最简单的方法就是线程封闭 即 把对象封装到一个线程里,只有该线程能看到此对象; 那么该对象就算非线程安全,也不会出现任何并发安全问题...

    Java 2020年12月18日 91 0
  • 将HTML表格转换成精美的PDF,几种生成PDF的解决方案

    包含表格、图表和图形的Web应用程序通常包含将数据导出为PDF的选项。你有没有想过,作为一个用户,当你点击那个按钮时,幕后发生了什么?作为开发人员,如何让PDF输出看起来更专业?大多数免费的在线PDF导出器实际上只是将HTML内容转换为PDF,而不进行任何额外的格式化,这会使数据难以阅读。如果你也能添加诸如页眉和页脚、页码或重复的表列标题等内容呢?像这样的小点缀,对把一份看起来...

    Java 2020年12月18日 133 0
  • 线程池的7种创建方式,强烈推荐你用它

    根据摩尔定律所说:集成电路上可容纳的晶体管数量每 18 个月翻一番,因此 CPU 上的晶体管数量会越来越多。但随着时间的推移,集成电路上可容纳的晶体管数量已趋向饱和,摩尔定律也渐渐失效,因此多核 CPU 逐渐变为主流,与之相对应的多线程编程也开始变得普及和流行起来,这当然也是很久之前的事了,对于现在而言多线程编程已经成为程序员必备的职业技能了,那接下来我们就来盘一盘“线程池”这...

    Java 2020年12月18日 107 0
  • Spring Boot 2.4 对多环境配置的支持更改

    在目前最新的Spring Boot 2.4版本中,对配置的加载机制做了较大的调整。相关的问题最近也被问的比较多,所以今天就花点时间,给大家讲讲Spring Boot 2.4的多环境配置较之前版本有哪些变化。多环境配置2.4版本之前先回顾下,2.4版本之前,我们在yaml配置文件中,使用spring.profiles来定义不同环境的标识,比如下面这样:spring:  ...

    Java 2020年12月17日 101 0
  • Springboot整合shiro基于url身份认证和授权认证

    权限管理在日常开发中很重要,所以硬着头皮也要啃下来。在这里插入图片描述实现功能:身份认证对不同页面进行url授权多表登录解决同一个页面多role访问项目完整github地址 欢迎starspringboot一些学习整合完整地址shiro的四大组件:身份认证(Authentication)-证明用户身份,通常叫做登陆(login)。授权(Authorization)-访问控制加密...

    Java 2020年12月16日 93 0
  • 最佳的前后端分离:SpringBoot集成Swagger2

    一、是什么  当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维持一份及时更新且完整的 Rest API 文档将会极大的提高我们的工作效率。传统意义上的文档都是后端开发人员手动编写的,相信大家也都知道这种方式很难保证文档的及时性,这种文档久而久之也就会失去其参考意义,反而还会加大我们的沟通成本。而 Swagger 给我们提供了一个全...

    Java 2020年12月16日 104 0
  • 5 分钟入门 spring cloud 实战笔记

    今天和大家来一起体验一下 spring cloud,回首了一下以前的笔记,整理记录 spring cloud 已经 2 年有余,不过工作中不用,也就淡忘了。最近在梳理学习微服务相关知识,就将 spring cloud 重温一下。Spring CloudSpring Cloud 为开发人员提供了工具,以快速构建分布式系统中的一些常见模式(例如,配置管理,服务发现,断路器,智能路由...

    Java 2020年12月16日 79 0
  • 新手一看就懂的线程池

    那相信大家也能感受到,其实用多线程是很麻烦的,包括线程的创建、销毁和调度等等,而且我们平时工作时好像也并没有这样来 new 一个线程,其实是因为很多框架的底层都用到了线程池。线程池是帮助我们管理线程的工具,它维护了多个线程,可以降低资源的消耗,提高系统的性能。并且通过使用线程池,我们开发人员可以更好的把精力放在任务代码上,而不去管线程是如何执行的,实现任务提交和执行的解藕。本文...

    Java 2020年12月15日 89 0
  • Java基础|强引用、弱引用、软引用、虚引用

    前言在ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Obj...

    Java 2020年12月15日 87 0
  • 你来说一下springboot的启动时的一个自动装配过程吧

    前言没有面试就继续夯实自己的基础,前阵子的在面试过程中遇到的各种问题陆陆续续都会总结出来分享给大家,这次要说的也是面试中被问到的一个高频的问题,我当时其实没答好,因为很早之前是看到springboot的启动的一个过程的源码的,但是时间隔得有点久了(两年多没用过springboot),所以当时也没答好。这次好好总结这部分知识。SpringApplication.run()我看网上...

    Java 2020年12月15日 110 0
  • 无锁队列Disruptor原理解析

    队列比较队列队列比较总结: 就性能而言,无锁(什么也不加) > CAS > LOCK; 从现实使用中考虑,我们一般选择有界队列(避免生产者速度过快,导致内存溢出);同时,为了减少Java的垃圾回收对系统性能的影响,会尽量选择array/heap格式的数据结构。所以我们实际使用中用ArrayBlockingQueue多一些;注:之后会将ArrayBlockingQue...

    Java 2020年12月15日 136 0
  • 集成动态日志,“消灭”logback-spring.xml

    前言动态调整线上日志级别是一个非常常见的场景,借助apollo这种配置中心组件非常容易实现。作为apollo的官方技术支持,博主经常在技术群看到有使用者询问apollo是否可以托管logback的配置文件,毕竟有了配置中心后,消灭所有的本地配置全部交给apollo管理是我们的最终目标。可是,apollo不具备直接托管logback-spring.xml配置文件能力,但是,我们可...

    Java 2020年12月15日 97 0
  • springboot之本地缓存-guava与caffeine

    1. 场景描述因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友。2.解决方案2.1 使用google的guava作为本地缓存初步的想法是使用google的guava,因为本身项目中就有guava的denpency。2.1.1 pom文件需要3个dependency,如下: <!--软件老王 1--> <depen...

    Java 2020年12月15日 110 0
  • 分布式事务的七种实现方案汇总

    背景随着微服务的普及,分布式事务成为了系统设计中不得不面对的一个问题,而分布式事务的实现则十分复杂。阅读本文之前,需要你对数据库事务的ACID、CAP理论、Base理论以及两阶段提交有一定的认知,不熟悉者请自行百度或者阅读参考博客1、2、3和4。除此之外,在阅读本文过程中,如果对某种方案不理解,强烈建议先阅读对应方案中的参考博客后再阅读本文中对应的介绍。为了便于后文叙述,这里对...

    Java 2020年12月15日 144 0
  • Springboot+MybatisPlus高效实现增删改查

    Mybatis-Plus基于mybatis做了增强,大大简化了单表CRUD操作,而且Mybatis-Plus是无侵入性的,不会影响现有项目,Mybatis-Plus提供了代码生成器,可以根据数据库表一键生成对应的service、mapper、xml文件,service和mapper提供了丰富的CRUD操作方法,xml文件也是非常简洁。目前最新版本是3.4.1版本。最新版本蛮看一...

    Java 2020年12月14日 254 0
  • 完美的分布式监控系统——普罗米修斯

    DevOps工程师或SRE工程师,可能都知道Prometheus普罗米修斯。Prometheus于2012年由SoundCloud创建,目前已经已发展为最热门的分布式监控系统。Prometheus完全开源的,被很多云厂商(架构)内置,在这些厂商(架构)中,可以简单部署Prometheus,用来监控整个云基础架构设施。比如DigitalOcean或Docker都是普罗米修斯作为基...

    Java 2020年12月14日 368 0
  • 动态高并发时为什么推荐重入锁而不是Synchronized?

    前言碎语Synchronized和 ReentrantLock 大家应该都不陌生了,作为java中最常用的本地锁,最初版本中 ReentrantLock 的性能是远远强于 Synchronized 的,后续java在一次次的版本迭代中 对 Synchronized 进行了大量的优化,直到 jdk1.6 之后,两种锁的性能已经相差无几,甚至 Synchronized 的自动释放锁...

    Java 2020年12月14日 118 0
  • Spring Boot 整合 Netty

    前言Protobuf介绍使用代码编写服务端客户端功能测试其它前言本篇文章主要介绍的是SpringBoot整合Netty以及使用Protobuf进行数据传输的相关内容。Protobuf会简单的介绍下用法,至于Netty在之前的文章中已经简单的介绍过了,这里就不再过多细说了。Protobuf介绍protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立...

    Java 2020年12月13日 94 0
  • 快速实现图形验证码、token验证

    验证码(图形、短信、邮箱)、token机制对于系统的安全性已经是老生常谈;本文将结合spring-security快速实现Google图形验证码、token的安全性校验。 技术储备1、UserDetailsService接口/** * Core interface which loads user-specific data. * <p> * It is us...

    Java 2020年12月13日 100 0
  • 探究神秘的SpringMVC,寻找遗失的web.xml踪迹

    寻找遗失的 web.xml在开始 Spring MVC 的分析之前,先来聊一聊 Java 初学者接触的最多的 Java Web 基础。还记得我的第一个 Web 工程是由 Servlet、Velocity 和 Filter 来完成的,那时几乎所有人都是根据 Servlet、JSP 和 Filter 来编写自己的第一个 Hello World 工程。那时,还离不开 web.xml ...

    Java 2020年12月12日 148 0
  • 如何做一个防重设计

    前言在业务设计中防重设计是一个关键点,以接口设计为例,防重就是防止接口被多次调用而产生脏数据,比如支付订单出现重复支付,所以说防重至关重要,在如何防重之前我们首先看一下是如何出现重复请求的。何时出现多次调用多次调用接口的出现有主观原因比如:人为的重复请求攻击,用户的误操作等;也有客观原因比如:为了健壮性进行超时重试;重复请求攻击对于这种恶意攻击,其实已经属于安全范畴了,我们可以...

    Java 2020年12月11日 106 0
  • 从 0 学习 Spring 缓存数据

    前言昨天在开发业务时,打算加入缓存层来提高系统响应速度。查找了一些资料,发现 Spring 的缓存功能十分强大!只需要添加少量的代码,就可以轻松缓存方法所返回的对象。这篇文章通过描述一个实际使用例子,介绍 Spring Cache 的使用限制以及注意事项。环境准备Redis 5+JDK 1.8+Gradle 6+一款你喜爱的 IDE实践过程添加依赖打开 build.gradle...

    Java 2020年12月11日 77 0
  • 如何在项目中优雅的校验参数

    前言验证数据是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每一层实现相同的验证逻辑,这既费时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证代码混在一起,这些验证代码实际上是关于类本身的元数据,与业务逻辑不相关。JSR 380——Bean Validation2.0——定义了用于实体和方法验证的元数据模型和API,将数据校验逻...

    Java 2020年12月11日 115 0
  • springboot 基于数据库的乐观锁实现

    何谓悲观锁与乐观锁悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和Reentr...

    Java 2020年12月09日 166 0
  • 搭建百万连接服务,使用netty完成websocke的推送

    (一)使用websocket① 介绍webSocket协议是基于TCP的一种新的网络协议。他的出现实现了网络和浏览器全双工通信,允许服务器主动发送信息给客户端。客户端 给 服务器发消息是半双工,服务器给客户端也发送消息就是全双工。多客户端多语言多浏览器支持:浏览器,php,Java,ruby,nginx,python,Tomcat,erlang,.net等等。专栏从0开始学会k...

    Java 2020年12月09日 163 0
  • 分布式高并发服务三种常用限流方案简介

    服务限流场景在高并发大流量系统中,由于并发大造成服务资源不足,负载过高,进而引发致一系列问题,这里的流量一般都是突发性的,由于系统准备不足,很难短期扩容来应对 ,进行限流是最常用的手段,所以说限流也是服务稳定性治理重要的手段。限流可能发生在多个层面:用户网络层:突发的流量场景如热点事件流量(秒杀事件、热门抢购,微博热搜),恶意刷流,竞对爬虫等。内部应用层:上游服务的异常调用,脚...

    Java 2020年12月09日 112 0
  • 什么是悲观锁和乐观锁?

    思维导图文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary悲观锁悲观锁是平时开发中经常用到的一种锁,比如ReentrantLock和synchronized等就是这种思想的体现,它总是假设别的线程在拿线程的时候都会修改数据,所以每次拿到数据的时候都会上锁,这样别的线程想拿这个数据就会被阻塞。如图所示...

    Java 2020年12月08日 119 0
  • 运用拦截器与注解,在SpringBoot中实现自定义权限认证

    权限的认证框架很多,比如Shiro与SpringSecurity。今天使用拦截器与注解的方式,实现一个自定义的权限认证。目前,系统中需要两种角色,分别是平台管理员与普通用户,他们各自拥有不同的权限。在真正开始他们的操作之前,系统要求先登录。(1)第一次登陆系统后,之后利用Cookie与Session来标识用户。先写好Cookie与Session的工具类备用CookieUtil...

    Java 2020年12月08日 124 0
  • 搞懂Java本地事务和分布式事务

    什么是事务事务的概述是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);事务的特性事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性(atomicity):事务是一个不可分割的工作单位,事务中包括的诸操作要么都做...

    Java 2020年12月08日 158 0