
java
文章平均质量分 90
春天的早晨
https://github.com/Allenmcc
展开
-
大事务问题
大事务引发的问题:死锁,锁等待,回滚时间长 接口超时,数据库主从延迟,并发情况下数据库连接池被打满1.@Transactional注解是通过Spring的AOP起作用的,但是如果使用不当,事务功能可能会失效。2.@Transactional注解一般加在某个业务方法上,会导致整个业务方法都在这个事务中,粒度太大,不好控制事务范围。文章目录1.少于@Transactional注解2.将查询(select)方法放到事务外2.1 新加上一个service方法2.2 在该Service类中注入自己2.3 在该.转载 2022-05-03 20:14:56 · 1236 阅读 · 0 评论 -
Java中的值传递和引用传递
问?当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。如果参数类型是基本数据类转载 2021-12-18 16:43:03 · 816 阅读 · 3 评论 -
SynchronousQueue实现原理
文章目录前言SynchronousQueue简单使用SynchronousQueue实现原理公平模式下的模型:非公平模式下的模型:总结前言SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加;可以认为SynchronousQueue是一个缓存值为1的阻塞队列,但是 isEmpty()方法永远返回是true,remainingCapacity() 方法永远返回是0,remove()和removeAll() 方法转载 2021-07-11 21:34:25 · 476 阅读 · 0 评论 -
CountDownLatch的使用场景及原理
文章目录CountDownLatch的两种使用场景场景1 让多个线程等待:模拟并发,让并发线程一起执行场景2 让单个线程等待:多个线程(任务)完成后,进行汇总合并CountDownLatch 工作原理CountDownLatch与Thread.joinCountDownLatch与CyclicBarrierCountDownLatch的两种使用场景先来看看 CountDownLatch 的源码注释;/** * A synchronization aid that allows one or more转载 2021-05-03 20:47:49 · 1269 阅读 · 0 评论 -
LinkedHashMap底层原理
文章目录前言正文LinkedHashMap的特点LinkedHashMap的基本结构LinkedHashMap的初始化LinkedHashMap保存元素LinkedHashMap保存元素利用LinkedHashMap实现LRU算法缓存总结前言在集合中,除了常用的HashMap,还有今天我们要说的LinkedHashMap.为什么会有LinkedHashMap这个集合呢?因为我们在迭代HashMap的时候是无序的,我们希望有一个有序的map来方便我们的使用,这个时候就有了LinkedHashMap.正文转载 2021-03-27 16:34:34 · 1510 阅读 · 0 评论 -
从ConcurrentHashMap的演进看Java多线程核心技术
文章目录线程不安全的HashMapHashMap工作原理HashMap数据结构HashMap寻址方式resize死循环transfer方法单线程rehash多线程并发下的rehashFast-fail产生原因线程安全解决方案Java 7基于分段锁的ConcurrentHashMap数据结构寻址方式同步方式size操作不同之处Java 8基于CAS的ConcurrentHashMap数据结构寻址方式同步方式size操作本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线转载 2021-03-26 22:14:41 · 137 阅读 · 0 评论 -
Java 之 Serializable 序列化和反序列化
文章目录1. 序列化和反序列化的概念2.什么情况下需要序列化3.如何实现序列化第一种:transient不序列化第二种:静态属性不能被序列化第三种:serialVersionUID 的作用和用法serialVersionUID 的值怎么设置jdk api 文档里关于接口 Serializable 的描述关于 serialVersionUID 的描述遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化b,作用。为啥要实现这个 Serializab转载 2020-08-04 11:03:58 · 457 阅读 · 0 评论 -
java 泛型
概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(...转载 2018-06-10 18:49:32 · 188 阅读 · 0 评论 -
Java内部类及内部接口
public class ParcellA {//外部类 private int pMember;//声明一个私有成员 private static int pstMember;//声明一个私有静态成员 private final int pfMember=9;//常量值 private final static int pfsMember=0;//常量静态成员...转载 2018-06-03 23:02:47 · 9515 阅读 · 4 评论 -
Java 抽象类 接口 继承 实现
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。 抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。 人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它(类实现多个接口,实现多个动作). 所以,在高级语言上,一个类只能继承一个类(抽象类,jav转载 2016-07-23 17:21:14 · 5972 阅读 · 1 评论 -
Java泛型详解
例子我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。 假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数、小数和字符串,例如: x = 10、y = 10 x = 12.88、y = 129.65 x = “东京180度”、y = “北纬210度”针对不同的数据类型,除了借助方法重载,还可以借助自动装箱和向上转型。我们知道,基转载 2016-12-04 21:25:53 · 511 阅读 · 0 评论 -
Java 关键字final、static
final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 final类不能被继承,没有子类,final类中的方法默认是final的。 final方法不能被子类的方法覆盖,但可以被继承。 final成员变量表示常量,只能被转载 2016-08-28 15:49:55 · 624 阅读 · 0 评论 -
JUnit的各种断言
为什么需要单元测试在开发软件的过程中,用户需要实际运行所编写的代码以确保程序的正确性。当软件变得越来越大,再去添加新的功能或做一些新的改动时,就很容易带来新的问题,甚至会使程序无法正常运行。然而要手动的运行代码,测试代码的可行性也是非常枯燥以及非常耗费时间的事情。 为了减少这种手动测试,可以通过创建单元测试来自动完成测试的工作。当修改代码或者添加新功能后,可以执行单元测试来保证代码运行无误。所有测转载 2017-10-22 22:52:37 · 640 阅读 · 0 评论 -
Java ThreadPoolExecutor 线程池
概述ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。 先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池 核心构造方法讲解Thread转载 2016-12-25 16:07:47 · 1847 阅读 · 0 评论 -
guava实现内存缓存
guava缓存google guava中有cache包,此包提供内存缓存功能。内存缓存需要考虑很多问题,包括并发问题,缓存失效机制,内存不够用时缓存释放,缓存的命中率,缓存的移除等等。 当然这些东西guava都考虑到了。guava中使用缓存需要先声明一个CacheBuilder对象,并设置缓存的相关参数,然后调用其build方法获得一个Cache接口的实例。请看下面的代码和注释,注意在注释中指定了C转载 2017-09-17 22:35:10 · 1080 阅读 · 0 评论 -
Field获取java类中的成员变量名
利用反射机制获取成员变量的变量名 PartnerDto partnerDto; Map<String,Object> partnerCustomerMap = partnerDto.getCustomData(); Field[] fields = partnerDto.getClass().getDeclaredFields(); if(fields != null转载 2017-07-11 22:17:08 · 17291 阅读 · 0 评论 -
使用javassist生成新类
javassistjavassist是一个开源的分析、编辑和创建Java字节码的类库。不需要了解虚拟机指令,就能动态生成类或者改变类的结构。ClassPoolClassPool是缓存CtClass对象的容器,所有的CtClass对象都在ClassPool中。所以,CtClass对象很多时,ClassPool会消耗很大的内存,为了避免内存的消耗,创建ClassPool对象时可以使用单例模转载 2017-07-11 21:36:19 · 1941 阅读 · 0 评论 -
Java 代码 编译和执行过程
java 编译 执行过程转载 2016-07-24 14:42:43 · 11580 阅读 · 2 评论 -
struts.xml配置文件(package,namespace,action)
struts2.0 xml配置struts.xml文件是整个Struts2框架的核心。 struts.xml文件内定义了Struts2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD S转载 2017-02-20 10:00:44 · 655 阅读 · 0 评论 -
Java 浮点数 float和double类型的表示范围和精度
隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数。有时候会产生让人觉得莫名其妙的事情。 如在Java中, 0.99999999f==1f //true 0.9f==1f //false 要明白这些,首先要搞清楚float和double在内存结构1.内存结构float和double的范围是由指数的位数来决定的。 float的指数位转载 2017-03-19 13:49:55 · 1485 阅读 · 0 评论 -
Java反射机制详解 及 Method.invoke
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。...转载 2018-06-10 22:04:18 · 409 阅读 · 0 评论 -
Java静态变量的初始化(static块的本质)
public class Test { static { _i = 20; } public static int _i = 10; public static void main(String[] args) { System.out.println(_i); } } 上述代码会打印出...转载 2018-06-26 22:45:47 · 14945 阅读 · 1 评论 -
CMS垃圾回收机制
文章目录什么是CMS使用场景缺点实现机制周期性Old GC触发条件晋升担保失败周期性Old GC过程1. InitialMarking(初始化标记,整个过程STW)2. Marking(并发标记)3. Precleaning(预清理)4. AbortablePreclean(可中断的预清理)5. FinalMarking(并发重新标记,STW过程)主动Old GC什么是CMSCMS全称 Con...转载 2019-07-08 22:24:32 · 727 阅读 · 0 评论 -
java Collections.sort排序原理
事实上Collections.sort方法底层就是调用的Arrays.sort方法,而Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。快速排序主要是对那些基本类型数据(int,short,long等)排序, 而归并排序用于对Object类型进行排序。使用不同类型的排序算法主要是由于快速排序是不稳定的,而归并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前...转载 2019-06-23 11:31:27 · 18410 阅读 · 0 评论 -
volatile和synchronized的区别
文章目录一、volatile二、synchronized三、区别一、volatile它所修饰的变量不保留拷贝,直接访问主内存中的。在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,...转载 2019-06-08 15:39:18 · 9210 阅读 · 0 评论 -
分布式锁的几种使用方式(redis、zookeeper、数据库)
问题Q:一个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费synchronizedlockdb lockQ:两个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费分布式锁我们需要怎么样的分布式锁?可以保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行。这把锁要是一把可重入锁(避免死锁)这把锁...转载 2019-04-06 16:23:01 · 493 阅读 · 0 评论 -
静态代理和动态代理
文章目录什么是代理静态代理动态代理第一步:生成TimeProxy源码第二步:编译TimeProxy源码第三步:加载到内存中并创建对象第四步:增加InvocationHandler接口测试代码生成的TimeProxy.java源码MyInvocationHandler.java如何使用JDK实现揭秘Proxy.javaInvocationHandler答疑解惑invoke方法的第一个参数proxy到...转载 2019-03-17 21:19:43 · 252 阅读 · 0 评论 -
Java中Volatile关键字
基本概念先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另...转载 2019-03-02 21:06:04 · 198 阅读 · 0 评论 -
Java中的String、StringBuilder以及StringBuffer
文章目录String类深入理解String、StringBuffer、StringBuilderString str="hello world"和String str=new String("hello world")的区别String、StringBuffer以及StringBuilder的区别不同场景下三个类的性能测试常见的关于String、StringBuffer的面试题String类S...转载 2019-03-02 18:36:34 · 327 阅读 · 0 评论 -
HashMap,ConcurrentHashMap常见问题
文章目录原理Put方法的原理Get方法的原理HashMap默认初始长度并发情况下死锁java8对hashMap做了什么优化原理众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。对于HashMap,我们最常使...转载 2019-02-23 18:55:34 · 2358 阅读 · 2 评论 -
并发,并行,异步,多线程
例子一你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的)你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。例子二并发是两个队列,使用一台咖啡机,并行是两个队列,使用两台咖啡机。如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去...转载 2019-02-23 16:44:00 · 3020 阅读 · 1 评论 -
java 接口做实参
文章目录题目实现题目利用接口做参数,写个计算器,能完成±*/运算(1)定义一个接口Compute含有一个方法int computer(int n,int m);(2)设计四个类分别实现此接口,完成±*/运算(3)设计一个类UseCompute,含有方法:public void useCom(Compute com, int one, int two)此方法要求能够:用传递过来的对...转载 2018-10-02 17:10:04 · 482 阅读 · 0 评论 -
BeanUtil 工具类
@Log4jpublic class BeanUtil { /** * 封装{@link org.apache.commons.collections.CollectionUtils#collect}方法和{@link org.springframework.beans.BeanUtils#copyProperties}方法,常用与批量将Bean转换为DTO * ...原创 2018-08-05 20:57:04 · 2087 阅读 · 0 评论 -
java 继承创建父类对象
代码public class A { int a=1; double d=2.0; void show(){ System.out.println("Class A: a="+a +"\td="+d); }}public class B extends A{ float a=3.0f; String d="Jav...原创 2018-07-21 19:34:15 · 5293 阅读 · 1 评论 -
SSO 单点登录
简介SSO英文全称Single Sign On 单点登录是一种控制多个相关但彼此独立的系统访问权限的机制, 拥有这一权限的用户 可以使用单一的ID和密码访问某个或多个系统从而避免使用不同的用户名或密码,或者通过某种配置无缝地登录每个系统,它是目前比较流行的企业业务整合的解决方案之一,例如我们使用mis号登陆过公司的一个系统后,再登陆其他系统不用再次输入用户名和密码 单系统登录...原创 2018-07-29 10:42:31 · 13821 阅读 · 0 评论 -
java 异常处理 Throwable Error 和Exception
Java异常类层次结构图:异常的英文单词是exception,字面翻译就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用、数组下标越界、内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图。错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误,在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便转载 2016-06-03 15:43:41 · 28816 阅读 · 1 评论 -
java 深入理解ThreadLocal
相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!看看JDK中的源码是怎么写的:This class provides thread-local varia转载 2017-01-07 13:49:14 · 2670 阅读 · 0 评论 -
OC中@interface、@implementation、@protocal
Java中的interface和implementation从事java开发的程序员们都知道,在java中interface是接口的意思,java中类是用class声明,接口用interface声明,是两个独立的部分,只有在类声明要实现某个接口时,他们两者才建立了关系,例如:interface AI{ void print(); }; class AC{ }; 这时候,AI转载 2016-08-22 17:19:31 · 4981 阅读 · 0 评论 -
java Map List和Set区别
java集合的三种类型Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。世间上本来没有集合,(只有数组参考C语转载 2016-08-09 16:09:11 · 427 阅读 · 0 评论 -
java OutOfMemoryError
认识问题:首先我们通过下面这个 测试程序 来认识这个问题: 运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse 3.4, 测试程序:import java.util.concurrent.CountDownLatch; public class TestNativeOutOfMemoryError {转载 2016-09-11 13:20:27 · 427 阅读 · 0 评论