Java
文章平均质量分 86
MayMatrix
J2EE .
展开
-
hystrix高可用架构:基于本地缓存的 fallback 降级机制
在 GetBrandNameCommand 中,run() 方法的正常逻辑是去调用品牌服务的接口获取到品牌名称,如果调用失败,报错了,那么就会去调用 fallback 降级机制。我们现在有个包含 brandId 的商品数据,假设正常的逻辑是这样:拿到一个商品数据,根据 brandId 去调用品牌服务的接口,获取品牌的最新名称 brandName。假如说,品牌服务接口挂掉了,那么我们可以尝试从本地内存中,获取一份稍过期的数据,先凑合着用。// 如果调用失败,报错了,那么就会去调用fallback降级机制。转载 2023-06-30 17:31:48 · 270 阅读 · 0 评论 -
java并发编程——AQS
你可能会问,不需要设置 node.prev = tail 吗,当然需要,但是此时 Node 结点是没有进入队列的,我们对 Node 结点操作不存在竞争问题,也就不需要保证 CAS 操作,只需要在后面设置 tail 指针时进行一次 CAS 操作,如果 CAS 操作失败表示 tail 已经被改变,重新设置 node.prev = tail,直至 CAS 操作成功从而保证了前置域的原子性。从源码中可以看出来,每次 CAS 操作之前设置的是当前的结点的前置结点 node.prev,即保证了前置域设置的原子性。转载 2023-02-23 15:24:55 · 576 阅读 · 0 评论 -
Java8内存模型及溢出场景—永久代(PermGen)和元空间(Metaspace)
从上述结果可以看出,JDK 1.6下,会出现“PermGen Space”的内存溢出,而在 JDK 1.7和 JDK 1.8 中,会出现堆内存溢出,并且 JDK 1.8中 PermSize 和 MaxPermGen 已经无效。方法区也是所有线程共享。注意,这里我指定了堆内存的大小为16M,所以这个地方显示的count=14(这个数字不是固定的),至于为什么会是14或其他数字,需要根据 GC 日志来判断,具体原因会在下篇文章中给大家解释。这段程序以2的指数级不断的生成新的字符串,这样可以比较快速的消耗内存。转载 2023-02-23 15:21:58 · 1870 阅读 · 0 评论 -
Java中transient关键字的详细总结
本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。1. 序列化Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。转载 2023-02-23 15:13:00 · 270 阅读 · 0 评论 -
Java volatile关键字最全总结:原理剖析与实例讲解
即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括:(1)基本类型的读取和赋值操作,且赋值必须是值赋给变量,变量之间的相互赋值不是原子性操作。(2)所有引用reference的赋值操作。转载 2023-02-23 15:11:00 · 150 阅读 · 0 评论 -
Java8虚拟机内存模型JVM
参考资料:《深入理解Java虚拟机 JVM高级特性与最佳实践》第二版。转载 2023-02-23 15:08:53 · 668 阅读 · 0 评论 -
Java 泛型中的通配符
extends Animal>,指定了范围只能是Animal的子类,但是用List,没法做到缩小范围。我们说Java的泛型是伪泛型,那是因为泛型信息只存在于代码编译阶段,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程为类型擦除。首先其实我们并不关心传进来的集合内是什么对象,我们只关系我们需要转换的集合内是什么对象,所以我们传进来的集合就可以用List转载 2023-02-17 17:30:55 · 188 阅读 · 0 评论 -
Spring中的@Transactional使用
SpringBoot @Transactional的rollbackFor属性1.简单回顾Java Exception该图摘自:https://blog.csdn.net/zhangerqing/article/details/8248186一方面,我们可以将异常分为运行时异常(RuntimeException)和非运行时异常(Exception中除了RuntimeException及其子类以外的)。另一方面,我们可以将异常分为受控异常(checked exceptions)和不受控异.转载 2021-06-03 14:10:04 · 357 阅读 · 0 评论 -
【基础理论】Jenkins CI/DI持续集成&部署
一.CI/DI持续集成&部署一、什么是持续集成?持续集成是一个开发的实践,需要开发人员定期集成代码到共享存储库。这个概念是为了消除发现的问题,后来出现在构建生命周期的问题。持续集成要求开发人员有频繁的构建。最常见的做法是,每当一个代码提交时,构建应该被触发。1、CI/DI简介互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:编码 --> 构建 --> 集成 --> 测试 --> 交付 --> 部署正如你在上图中看转载 2021-05-25 17:40:32 · 1009 阅读 · 0 评论 -
Top 16 的 Java 工具类,你用过几个?
在Java中,实用程序类是定义一组执行通用功能的方法的类这篇文章展示了最常用的Java实用工具类及其最常用的方法。类列表及其方法列表均按受欢迎程度排序。数据基于从GitHub随机选择的50,000个开源Java项目。希望您可以通过浏览列表来了解已经提供和流行的功能的一些想法,以使您知道不需要自己实现。这些方法的名称通常指示它们的作用。如果方法名称不够直观,您还可以查看其他开发人员如何在其开源项目中使用它们。 org.apache.commons.io.IOUtils closeQuiet转载 2021-05-24 09:52:35 · 145 阅读 · 0 评论 -
Apache Tomcat 8.5 安全配置与高并发优化
优化配置参考一(APR与内存配置)第一步:配置user登录tomcat 参考:https://www.cnblogs.com/kevincaptain/p/10370794.html第二步:性能优化 2.1tomcat的运行模式有3种:bio: tomcat7.0默认的模式,性能非常低下,没有经过任何优化处理和支持.阻塞式I/O操作,表示Tomcat使用的是传统Java I/O操作(即java.io包及其子包)。Tomcat7以下版本默认情况下是以bio模式运行的,..转载 2021-03-24 11:05:59 · 1406 阅读 · 0 评论 -
Tomcat配置优化 maxTread maxConnections 理解
properties.yml配置: (spring版本2.1.3RELEASE) 能点住ctrl左键点击跳转说明配置是正确的server:#tomcat配置tomcat:# 当所有线程都在使用时,建立连接的请求的等待队列长度,默认100accept-count: 1000# 线程池维持最小线程数,默认10min-spare-threads: 4# 允许最大连接数,默认10000,当达到临界值时,系统可能会基于accept-count继续接受连接max-connections: 10000转载 2021-03-24 11:00:57 · 2080 阅读 · 0 评论 -
SpringBoot之Configuration注解功能列表
在SpringBoot中可以通过@Configuration对某个类注解将该类申明为配置类,以此在代替先前spring版本中配置xml中的功能,并且增加了可读性与维护性。并且在注解类中的类方法中可以通过@Bean对该类方法返回的对象注入到Spring容器中,其方法名也是该对象在spring容器中的对象名。//简单的配置类及对象注入到spring容器中。@Configurationpublic class DemoConfiguration { @Bean() public Stri转载 2020-07-30 19:48:27 · 519 阅读 · 1 评论 -
SpringBoot解耦的扩展机制 Spring Factories功能详解
SpringBoot解耦的扩展机制 Spring Factories介绍及使用https://blog.csdn.net/truelove12358/article/details/107697845Spring Factories功能详解:组件提供者如何编写出仅需系统开发者进行包引入就可以对spring进行bean注入等操作? 其实在spring库中有提供自动化配置的库spring-boot-autoconfigure,我们只需要引入这个库包就可以对已引入的AOP、JDBC、TX..转载 2020-07-30 19:44:15 · 398 阅读 · 0 评论 -
SpringBoot解耦的扩展机制 Spring Factories介绍及使用
Spring Boot中有一种非常解耦的扩展机制:Spring Factories。这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的。什么是 SPI机制SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java SPI机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的转载 2020-07-30 19:28:58 · 1165 阅读 · 0 评论 -
Java中的SPI机制
1 SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码.转载 2020-07-30 19:17:22 · 364 阅读 · 0 评论 -
jstack定位线程堆栈信息【案例汇总】
1.CPU利用率过高,代码定位找到CPU利用率持续比较高的进程, 命令:top找到CPU使用率较高的线程ID(TID):命令:ps p 16480 -L -o pcpu,pid,tid,time,tname,cmd此处为:16498将获取的线程号(十进制数)转换成十六进制printf "%x\n" 16498结果:4072结合进程号和线程号,利用jstack查到异常代码所在行jstack -l <pid> | grep <thr...转载 2020-06-10 10:18:26 · 3531 阅读 · 0 评论 -
什么是内存屏障(Memory Barrier)以及在java中的应用
1. 指令重排序程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理由是为了提升程序运行时的性能。这种内存乱序问题主要是由两种原因引起的:编译器在编译时进行了编译优化,导致指令重排; 在多cpu环境下,为了尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能。在这种模型下会存在一个现象,即缓存中的数据与主内存的数据并不是实时同步的,各CPU(或CPU核心)间缓存的数据也不是实时同步的。这导致在同一个时间点,各转载 2020-06-02 15:05:28 · 2474 阅读 · 0 评论 -
※HashMap底层实现原理(全)
HashMap底层实现原理(上)本来想先在专栏里简单的说一下二叉树,红黑树的内容后再说HashMap的,但看到评论区里不断的出现HashMap这个词,怕大家等得着急,本篇文章就先说说HashMap吧,前面讲ArrayList和LinkedList时把源码说得很细,只要理解了这两块内容,本篇内容也很好理解,先来看看HashMap在Map这个大家族中的位置。上图中,白色部分是接口,黄色部分是要重点了解的,最好是看一遍源码,绿色部分已经过时,不常用了,但是面试中可能会问到。这里先简单的说一下这几个Ma转载 2020-05-29 12:48:03 · 495 阅读 · 0 评论 -
深入理解HashMap底层原理剖析(JDK1.8) 扩容方法resize()
接下来会从以下几个方面介绍 HashMap 源码相关知识: 1、HashMap 存储结构 2、HashMap 各常量、成员变量作用 3、HashMap 几种构造方法 4、HashMap put 及其相关方法 5、HashMap get 及其相关方法 6、HashMap remove 及其相关方法 7、HashMap 扩容方法 resize() 介绍方法时会包含方法实现相关细节。 先来看一下 HashMap 的继承图: HashMap 根据键的转载 2020-05-29 12:41:59 · 1861 阅读 · 0 评论 -
Java中HashMap底层原理源码分析
在介绍HashMap的同时,我会把它和HashTable以及ConcurrentHashMap的区别也说一下,不过本文主要是介绍HashMap,其实它们的原理差不多,都是数组加链表的形式存储数据,另外本文所介绍的都是JDK1.8版本的。在介绍之前,先看下Map家族的继承体系图:其中,TreeMap是基于树实现...转载 2020-05-07 21:31:09 · 200 阅读 · 0 评论 -
Spring PropertyPlaceholderConfigurer 用法
PropertyPlaceholderConfigurer 用法一、PropertyPlaceholderConfigurer 的继承体系二、PropertyPlaceholderConfigurer 的基本概念三、PropertyPlaceholderConfigurer 的基本使用PropertyPlaceholderConfigurer 引入外部属性文件PropertyPlaceholder...转载 2020-04-10 19:09:14 · 1293 阅读 · 0 评论 -
JDK8 JVM内存模型
正文内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行不同的JVM对于内存的划分方式和管理机制存在着部分差异结合JVM虚拟机规范,来探讨经典的JVM内存布局运行时内存:1 Program Counter Register (程序计数寄存...转载 2019-09-04 08:52:53 · 5488 阅读 · 1 评论 -
常量池、字符串常量池的整理
由于之前研究了一下JVM的内存划分,对里面方法区的常量池一知半解,于是想要探究一下先看这篇 写得比较清晰https://blog.csdn.net/tophawk/article/details/78704074(jdk1.8版本)https://blog.csdn.net/youyou1543724847/article/details/52337257以下内容有点儿乱,还未整理...转载 2019-09-26 12:56:36 · 208 阅读 · 0 评论 -
java.math.BigDecimal类的用法 解决double计算精度问题
在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。下边我们介绍BigDecimal类: BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念。一般的fl转载 2015-09-17 15:34:53 · 1333 阅读 · 0 评论 -
JAVA代理模式
1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到三个角色: 抽象角色:声明真实对象和代理对象的共同接口; 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻转载 2013-09-05 16:35:14 · 486 阅读 · 0 评论 -
java调用matlab:二、在服务端(客户机)搭建运行环境和常见问题解决
在服务端(客户机)搭建matlab运行环境1.下载MCR到客户机https://cn.mathworks.com/products/compiler/matlab-runtime.html注意对应的版本和位数,我的是matlab2012b x64就下载这个二、安装下载下来的MCR,一路下一步安装就可以了,无需注册码。检查 环境变量>>Path中是否已经有了C:\Program File...原创 2018-04-11 12:59:36 · 3078 阅读 · 2 评论 -
java调用matlab:一、生成文件,本机调用
Java代码实现的计算难免会显得不够高效。而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便。或者有些时候会涉及到使用Java调用MatLab展现一些二维三维图。因此用到Java调用MatLab。我的需求是要在获取一维曲线任一点的插值,计划在服务端调用matlab function获取返回值。文章分为两部分:一、生成文件,本机调用成功二、在服务器搭建运行...原创 2018-04-11 11:24:55 · 2352 阅读 · 0 评论 -
Java内存分配与管理 1
Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象) ◆堆:存放转载 2014-07-26 09:49:35 · 473 阅读 · 0 评论 -
java中,多个线程同时调用同一个静态方法的问题
我的原来程序是这样设计的,对于一些常用的方法,都用静态方法来实现,在多线程程序中直接调用,静态方法由于没有使用静态变量,所以没有进行线程同步。类似以下程序:class ThreadI {public static void main(String[] arg) {TestI p = new TestI("thread 1");new TestI("thread 2"转载 2014-07-26 09:46:48 · 19200 阅读 · 0 评论 -
java中到底传值还是引用
JAVA中的传递都是值传递吗?有没有引用传递呢? 在回答这两个问题前,让我们首先来看一段代码: Java代码 publicclass ParamTest { // 初始值为0 protectedint num =0; // 为方法参数重新赋值 publicvoid change(int i转载 2013-11-22 21:39:19 · 865 阅读 · 0 评论 -
Java中Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。下面看例子:package org.thread.demo; class MyThread extends Th转载 2013-09-05 15:52:46 · 615 阅读 · 0 评论 -
java反射详解
java反射详解原文地址:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。下面开始正文。【案例1】通过一个对象获得完整的包名和类名转载 2013-09-04 17:45:59 · 702 阅读 · 0 评论 -
Java注解
一、理解注解 Annotation( 注解 ) 是 JDK5.0 及以后版本引入的一个特性 。 注解是(@interface) Java 的一个新的类型(与接口很相似 ) ,它与类(Class)、接口(interface)、枚举(enum)是在同一个层次。我们可以定义注解、声明注解、获得注解,并且根据获得的注解做相应的处理,许多框架都大量应用了注解,以后继续学习。 二、对于java.lan转载 2013-08-28 15:17:50 · 723 阅读 · 0 评论 -
Java调用C#dll全过程
Java调用C#dll全过程Java调用默认邮件程序(Windows live mail & IBM Lotus)的同时加上附件目录 ——看目录者,原地满血满蓝复活!1.吐槽Java2.实现的功能描述及概述3.Java调用C# dll 步骤4.总结------------------------------原创 2013-08-13 12:06:58 · 7549 阅读 · 0 评论 -
Java 生成 outLook .msg 文件
如何用Java创建MSG文件看了各种网站,找到两个要钱的JMSG jar: http://www.independentsoft.com/jmsg/tutorial/createmessage.htmlAspose http://www.aspose.com/java/total-component.aspx 和一个不要钱的 Apache POI,不要钱的却转载 2013-08-20 11:00:52 · 3375 阅读 · 1 评论 -
java+内存分配 2
Java的内存分配 Java程序运行时的内存结构分成:方法区、栈内存、堆内存、本地方法栈几种。 方法区 存放装载的类数据信息,包括:基本信息:每个类的全限定名、每个类的直接超类的全限定名、该类是类还是接口、该类型的访问修饰符、直接超接口的全限定名的有序列表。每个已装载类的详细信息:运行时常量池、字段信息、方法信息、静态变量、到类classloader的引用、到类class的转载 2014-07-26 09:52:49 · 407 阅读 · 0 评论 -
jdbc----mysql的select、insert、update、delete 基本语句
jdbc----mysql的select、insert、update、delete (2008-12-21 22:01:34)转载▼标签: 杂谈分类: jdbc学习//-----------------------------------select---------------------------------转载 2014-08-29 17:10:03 · 3263 阅读 · 0 评论 -
java 二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
一.二进制,位运算,移位运算1.二进制对于原码, 反码, 补码而言, 需要注意以下几点:(1).Java中没有无符号数, 换言之, Java中的数都是有符号的;(2).二进制的最高位是符号位, 0表示正数, 1表示负数;(3).正数的原码, 反码, 补码都一样;(4).负数的反码=它的原码符号位不变, 其他位取反;(5).负数的补码=它的反码转载 2015-08-01 08:57:00 · 462 阅读 · 0 评论 -
JAVA集合类汇总
一、集合与数组数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。二、层次关系如图所示:图中,实线边框的是实现类,折线边框的是抽象类,而点线边框的是接口Collection接口是集合类的根接口,Java中没有提供这个接口的直转载 2017-05-10 10:30:35 · 578 阅读 · 0 评论