![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
走在小路
行走在路上
展开
-
线程池
1.什么是线程池java.util.concurrent.Executors这个类大家不知道有没有仔细的去看过这个,而这个类中给我提供了很多方法来创建线程池。在代码的开头的注释上就写明了,它可以创建重复使用固定数量线程的线程池,如果在所有线程都处于活动状态时提交了其他任务,那么他们将在队列中等待线程可用。public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolE.转载 2020-07-05 10:11:13 · 298 阅读 · 0 评论 -
ThreadLocal技术分享
学习一个东西首先要知道为什么要引入它,就是我们能用它来干什么。所以我们先来看看ThreadLocal对我们到底有什么用,然后再来看看它的实现原理。ThreadLocal如果单纯从名字上来看像是“本地线程"这么个意思,只能说这个名字起的确实不太好,很容易让人产生误解,ThreadLocalVariable(线程本地变量)应该是个更好的名字。我们先看一下官方对ThreadLocal的描述:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 g转载 2020-07-04 09:23:31 · 599 阅读 · 1 评论 -
Code Review最佳实践
我一直认为Code Review(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题。包括像Google、微软这些公司,Code Review都是基本要求,代码合并之前必须要有人审查通过才行。然而对于我观察到的大部分软件开发团队来说,认真做Code Review的很少,有的流于形式,有的可能根本就没有Code Review的环节,代码质量只依赖于事后的测试。也有些团队想做好代码审查,但不知道怎么做比较好。网上关于如何做Code Review的文章已经..转载 2020-06-28 20:27:20 · 287 阅读 · 0 评论 -
如何利用http缓存机制
Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。浏览器缓存也包含很多内容:HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。在具体了解 HTTP 缓存之前先来明确几个术语: 缓存命中率:从缓存中得到数据的请求数与所有请求数的比率。理想状态是越高越好。 过期内容:超过设置的有效时间,被标记为“陈旧”的内容。通常过期内容不能用于回复客户端的请求,必须重新向源服务器请求新的内转载 2020-06-28 20:14:23 · 420 阅读 · 0 评论 -
跨域问题解决方案
前言前后端数据交互经常会碰到请求跨域,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容。本文完整的源代码请猛戳github博客,纸上得来终觉浅,建议大家动手敲敲代码。一、什么是跨域?1.什么是同源策略及其限制内容?同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。同源策略限制内容有:Cookie、Loca..转载 2020-06-20 16:46:52 · 845 阅读 · 0 评论 -
SpringAOP实现方式
一、AOP是什么?AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对AspectJ和Spring AOP的实现进行分析和介绍。二、springaop如何实现的?Spring AOP中转载 2020-06-20 09:28:25 · 213 阅读 · 0 评论 -
MySql主从同步(binlog方式)
部署环境机器A:192.168.2.63(主)机器B:192.168.2.94(从)mysql-5.6.23主(master)配置修改mysql安装目录下my.ini配置文件log_bin=mysql-bin-1 #文件名mysql-bin-1server_id=1 #服务ID,用于区分服务,范围1~2^32-1#MySQL 磁盘写入策略以及数据安全性#每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去innodb_fl..转载 2020-06-15 09:00:29 · 3045 阅读 · 0 评论 -
fullGC过于频繁怎么办
fullgc过于频繁有可能会造成oom,有可能不会。首先明确一下,这篇文章的重点是分析后面一种情况,即应用在频繁的fullgc,但并没有出现oom。我们来想一下为什么会出现fullgc,触发原因有很多种,但归根到底都是因为内存空间不足了(system.gc的情况不考虑)。系统在频繁的fullgc,但并没有出现oom,说明每次回收的时候,肯定清理了部分内存空间。那这里就有2种情况,gc之后清理的内存空间大不大?1、如果每次gc之后剩余的空间不大,说明有一部分顽固对象一直没法被回收,导致可用内存转载 2020-06-11 20:56:08 · 2850 阅读 · 1 评论 -
Java使用限流处理大并发的请求
在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购、秒杀等。这个时候如何避免将大量的请求同时发送到业务系统。第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞。该方法有效的阻止了大量的请求同时访问业务系统,但对用户不友好。第二种方法:使用过滤器,保证一定数量的请求能够正常访问系统,多余的请求先跳转到排队页面,由排队页面定时发起请求。过滤器实现如下:public class ServiceFilter implements Filter { pr...转载 2020-06-11 08:29:18 · 505 阅读 · 0 评论 -
SimpleDateFormat线程不安全
以前没有注意到SimpleDateFormat线程不安全的问题,写时间工具类,一般写成静态的成员变量,不知,此种写法的危险性!在此讨论一下SimpleDateFormat线程不安全问题,以及解决方法。为什么SimpleDateFormat不安全?直接上一个例子,日期格式化成字符串:package com.anjz.test.simpleDateFormat;import java.text.DateFormat;import java.text.SimpleDateFormat;impo.转载 2020-06-10 22:08:47 · 278 阅读 · 0 评论 -
为什么说ArrayList是线程不安全的
一.概述对于ArrayList,相信大家并不陌生。这个类是我们平时接触得最多的一个列表集合类。面试时相信面试官首先就会问到关于它的知识。一个经常被问到的问题就是:ArrayList是否是线程安全的?答案当然很简单,无论是背来的还是自己看过源码,我们都知道它是线程不安全的。那么它为什么是线程不安全的呢?它线程不安全的具体体现又是怎样的呢?我们从源码的角度来看下。二.源码分析首先看看这个类所拥有的部分属性字段:public class ArrayList<E> extends A转载 2020-06-10 21:57:44 · 275 阅读 · 1 评论 -
为什么说TCP是可靠连接
序言我们平常经常说UDP是不可靠连接,TCP是可靠连接,然而TCP为什么是可靠的呢1. TCP和UDP的优缺点TCP缺点:[1] 三次握手四次挥手,传输更多包,浪费一些带宽[2] 为了进行可靠通信,双方都要维持在线,通信过程中服务器server可能出现非常大的并发连接,浪费了系统资源,甚至会出现宕机[3] 确认重传也会浪费一些带宽,且在不好的网络中,会不断的断开和连接,降低了传输效率UDP优点:[1] 没有握手,起步快延时小[2] 不需要维持双方在线,server不用维护巨..转载 2020-06-05 09:18:18 · 4045 阅读 · 0 评论 -
TCP协议为什么可靠
我们都知道,TCP和UDP协议的区别在于TCP可以提供可靠的网络数据传输,但UDP不能。为什么TCP比较可靠呢?可能有人会回答,TCP是面向连接的,而UDP不是。连接是什么呢?它是一个像水管一样的东西,把所有的数据往连接里一放就保证了数据完整有序到达吗?其实不是的。TCP/IP详解对整个数据传输过程有着详细的说明。我试着把其中关键的部分抽取出来,解释一下TCP协议到底是怎么保证传输的可靠性的。建立连接连接是什么当提到连接,我们本能的会把它想成一根水管或者绳子,建立连接就是把这个水管或者绳转载 2020-06-04 22:18:33 · 1517 阅读 · 0 评论 -
Java之动态代理
简介在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理。这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类。代理优点有:隐藏委托类的实现 解耦,不改变委托类代码情况下做一些额外处理,比如添加初始判断及其他公共操作根据程序运行前代理类是否已经存在,可以将代理分为静态代理和动态代理。动态代理实现方式主要有两种,分别是JDK动态代理和CGlib动态代理。二者的主要区别是JDK动态代理转载 2020-05-24 20:11:26 · 222 阅读 · 0 评论 -
十分钟理解Java之动态代理
本篇文章会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理。由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:)概述什么是代理我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品。关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者”对我们来说是不可见的;其次,微商代理主要以朋友圈的人为目标客户,这就相当于为厂家做了一次对客户群体的“过滤”。我们把微商代理和厂家进一步抽象转载 2020-05-24 20:02:51 · 225 阅读 · 0 评论 -
跨域请求CORS要点
前端开发的童鞋,应该都有听过跨域请求,但这其中的细节可能还不清楚,比如:<pre>什么是跨域请求? 为什么会存在跨域请求? 跨域请求是怎么工作的? 如何解决跨域请求? </pre>1. 什么是跨域请求跨域请求 - 访问其他域名的资源,随着业务的复杂化及前后端的分离,我们需要经常访问其他域名的资源,因此这里就涉及到跨域访问,下图给出了跨域访问的例子image2. 为什么会存在跨域请求可能有童鞋就说了,何必这么麻烦,直接允许访问不就行了,也许前期就是这转载 2020-05-24 15:02:21 · 905 阅读 · 0 评论 -
Java锁:悲观/乐观/阻塞/自旋/公平锁/闭锁,锁消除CAS及synchronized的三种锁级别
JAVA LOCK 大全[TOC]一、广义分类:乐观锁/悲观锁1.1 乐观锁的实现CAS (Compare and Swap)乐观锁适合低并发的情况,在高并发的情况下由于自旋,性能甚至可能悲观锁更差。CAS是一种算法,CAS(V,E,N),V:要更新的变量 E:预期值 N:新值。如果多个线程进行CAS操作,只有一个会成功,其余的会失败(允许再次尝试)。 CAS是乐观锁的一种带自选的实现算法(对象和类的关系)。 操作系统保证CAS的执行是CPU原子指令。1.2 sun.misc.转载 2020-05-16 15:10:59 · 460 阅读 · 0 评论 -
ReentrantLock和Synchronized区别,公平锁和非公平锁区别
1 ReentrantLock和synchronized区别(1) synchronized 是Java的一个内置关键字,而ReentrantLock是Java的一个类。(2) synchronized只能是非公平锁。而ReentrantLock可以实现公平锁和非公平锁两种。(3) synchronized不能中断一个等待锁的线程,而Lock可以中断一个试图获取锁的线程。(4) synchronized不能设置超时,而Lock可以设置超时。(5) synchronized会自...转载 2020-05-16 14:51:42 · 4726 阅读 · 1 评论 -
彻底理解Synchronized底层实现原理
这篇文章会记录Synchronized的常用使用场景与Synchronized的底层实现原理。虽然我们平时经常会在多线程中使用Synchronized关键字,但可能对于这个我们很熟悉的关键字的底层到底是怎样实现的没有过多关注。作为开发者,既然使用到了,可以试着去一步一步揭开下它的底层面纱。为什么要使用Synchronized?首先我们来看下这段代码public class Demo { private static int count=0; public /*synch.转载 2020-05-16 11:30:00 · 4371 阅读 · 2 评论 -
Java泛型详解
我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数、小数和字符串,例如:x = 10、y = 10x = 12.88、y = 129.65x = “东京180度”、y = “北纬210度”针对不同的数据类型,除了借助方法重载,还可以借助自动装箱和向上转型。我们知道,基本数据类型可以自动装箱,被转换成对应的包装类;Object 是所有类的祖先类,任何一个类的实例都可以向上转型为...转载 2020-05-16 09:57:43 · 277 阅读 · 0 评论 -
Spring MVC @Validated的使用
@Valid是javax.validation里的。@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能@Validated的特殊用法1、分组当一个实体类需要多种验证方式时,例:对于一个实体类的id来说,新增的时候是不需要的,对于更新时是必须的。可以通过groups对验证进行分组分组接口类(通过向groups分配不同类的class对象,达到分组目的):package com.valid.interfaces;publi.转载 2020-05-11 19:56:23 · 599 阅读 · 0 评论 -
揭开Java 泛型类型擦除神秘面纱
泛型,一个孤独的守门者。大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。文章开始的地方,先给大家奉上一道经典的测试题。List<String> l1 =newAr...转载 2020-04-25 22:10:53 · 119 阅读 · 0 评论 -
VUE入门环境搭建及demo运行
vue简介:Vue.js 是一套构建用户界面的渐进式框架。他自身不是一个全能框架——只聚焦于视图层。因此它非常容易学习,非常容易与其它库或已有项目整合。在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动复杂的单页应用。第一步:安装node.js 下载链接https://nodejs.org/en/node简介Node.js是一个Javascript运行环境。实际上它...转载 2020-04-22 13:45:16 · 411 阅读 · 0 评论 -
扫码登陆实现原理
需求介绍首先,介绍下什么是扫码登录。现在,大部分同学手机上都装有qq和淘宝,天猫等这一类的软件。而开发这些app的企业,都有他们相对应的网站。为了让用户在使用他们的网站时,登录更加方便和安全。这些企业提供了, 使用手机,扫一扫,就可以登录的服务。网页登录时的效果如下:有很多小伙伴可能会感到很神奇,网页上只是显示了个二维码,它怎么就知道是哪个手机扫到了二维码,并且进行登录的呢?而且,...转载 2020-01-06 09:33:33 · 210 阅读 · 0 评论 -
sftp常用命令介绍
前面的博文中, 我们已经学习了sftp服务器的搭建, 所以这里就不再赘述了, 定sftp服务器的用户名和密码分别为user和password. 下面, 我们来学习一下linux中常用的sftp命令, 当然, 需要linux支持sftp哈。1. sftp user@ip你要用sftp, 当然得登录到sftp服务器啊, 在linux的shell中执行上面...转载 2019-12-03 15:55:55 · 2108 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier并发容器
如何让一段程序并发的执行,并最终汇总结果?使用CyclicBarrier 在多个关口处将多个线程执行结果汇总, CountDownLatch 在各线程执行完毕后向总线程汇报结果。CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。这样应该就清...转载 2019-12-03 15:43:46 · 100 阅读 · 0 评论 -
sleep和wait方法的区别
sleep()和 wait()有什么区别?对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。当调用wait()方法的时候,线程会放...转载 2019-12-03 15:18:38 · 104 阅读 · 0 评论 -
对象的notify和notifyAll方法的区别
notify()和notifyAll()有什么区别?如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notif...转载 2019-12-03 15:16:33 · 89 阅读 · 0 评论 -
经常出错的一道题
publicclassAddTest{publicstaticvoidmain(String[]args){inti=0;i=i++;System.out.println("i="+i);}}输出结果是多少呢?自己思考后继续往下看效果更好哦=================分界线=...转载 2019-11-29 10:10:57 · 141 阅读 · 0 评论 -
使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
一、相关环境 - Intellij IDEA 2016.2Ultimate - Tomcat 8.0.35 - JDK 1.8.0_92 - Spring 4.2.6 - MySql 5.7 - Maven 3.3.9 - Bootstrap 3.3.5 以上是我要做的这个demo所需要的东西,当...转载 2019-11-27 16:15:31 · 127 阅读 · 0 评论 -
使用Intellij IDEA来发SpringMVC网站(二)
注意:承接上一文:使用IntelliJ IDEA开发SpringMVC网站(一)开发环境五、SpringMVC框架配置进行完上面的配置,那就说明现在基本的开发环境已经搭建好了,现在要开始进行SpringMVC的网站开发。1、web.xml配置 打开src\main\webapp\WEB-INF\下的web.xml文件,稍微更新一下web.xml的版本,可以支持更高级的...转载 2019-11-27 16:14:50 · 281 阅读 · 0 评论 -
ConcurrentHashMap原理详解
一、背景:线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他...转载 2019-11-25 14:43:24 · 324 阅读 · 0 评论 -
为什么阿里开发手册明确说明 Arrays.asList() 不能使用其修改方法?
引语: 问题分析: 总结: 引语:阿里巴巴java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException()我们来看一下为什么会出现这种情况.问题分析:我们做个测试publicstat...转载 2019-11-25 09:08:13 · 160 阅读 · 0 评论 -
java线程池的四种用法及使用场景
# 如下方式存在的问题new Thread() { @Override public void run() { // 业务逻辑 }}.start();1、首先频繁的创建、销毁对象是一个很消耗性能的事情;2、如果用户量比较大,导致占用过多的资源,可能会导致我们的服务由于资源不足而宕机;3、综上所述,在实际的开发中,这种操作其实是不可取的一种方式。# 使用线程池...转载 2019-11-23 10:50:25 · 838 阅读 · 0 评论 -
【IDE工具】是时候扔掉Postman了,又一个被低估的IDEA插件出来了
# 前言接口调试是每个软件开发从业者必不可少的一项技能,一个项目的的完成,可能接口测试调试的时间比真正开发写代码的时间还要多,几乎是每个开发的日常工作项。所谓工欲善其事必先利其器,在没有尝到IDEA REST真香之前,postman(chrome的一款插件)确实是一个非常不错的选择,具有完备的REST Client功能和请求历史记录功能。但是当使用了IDEA REST之后,po...转载 2019-11-22 21:16:36 · 1484 阅读 · 0 评论 -
spring知识点总结
1. 一般问题1.1. 不同版本的 Spring Framework 有哪些主要功能?1.2. 什么是 Spring Framework?1.3. 列举 Spring Framework 的优点。1.4. Spring Framework 有哪些不同的功能?1.5. Spring Framework 中有多少个模块,它们分别是什么?1.6. 什么是 Spring 配置...转载 2019-11-22 20:52:47 · 297 阅读 · 0 评论 -
线程池的原理解析
线程池的定义 Executors创建线程池的几种方式 ThreadPoolExecutor对象 线程池执行任务逻辑和线程池参数的关系 Executors创建返回ThreadPoolExecutor对象 OOM异常测试 如何定义线程池参数 如果只想知道原因可以直接拉到总结那线程池的定义管理一组工作线程。通过线程池复用线...转载 2019-11-22 20:11:53 · 131 阅读 · 0 评论 -
别在 Java 代码里乱打日志了,这才是打印日志的正确姿势!
使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 实现方式统一使用: Logback框架 打日志的正确方式什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分...转载 2019-11-19 21:16:08 · 217 阅读 · 0 评论 -
零拷贝的实现原理
"狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过" "哦,这个知识点,我之前应该有讲过,你没注意到?" "这东西工作中用不到,可能被我忽略了" "啧啧啧..." "哎,有空和我讲讲?""先从简单开始,实现下这个场景:从一个文件中读出数据并将数据传到另一台服务器上?""为啥写这个?""你先写""行..."1...转载 2019-11-15 09:46:55 · 193 阅读 · 0 评论 -
类加载器的双亲委派模型
类加载器的知识,主要包括:JVM中有哪些类加载器?它们之间是什么关系?什么是双亲委派机制?双亲委派模型四种类加载器从JVM的角度看,类加载器主要有两类:Bootstrap ClassLoader和其他类加载,Bootstrap ClassLoader是C++语言实现,是虚拟机自身的一部分;其他类加载器都是Java语言实现,不属于虚拟机,全部继承自抽象类java.lang.C...转载 2019-11-15 09:09:35 · 146 阅读 · 0 评论