java
文章平均质量分 72
喜鹊先生Richard
眼界之外,是更大的世界。
展开
-
Java项目 log4j2 配置日志写入指定文件
一、背景由于业务需要,需要将服务部分埋点日志写入指定文件,然后进行日志收集,进行数据分析统计。需要通过修改log4j2配置,引入对应logger打印日志实现。二、log4j2.xml配置三、Java使用案例四、文件写入效果五、易踩坑点引入类时要注意,以下为正确的类博主在使用时,误引入了错误的类,导致日志没有写入指定文件。而后通过debug发现logger对象异常,又参考官方文档才发现问题。六、参考资料log4j2配置官方文档......原创 2022-07-29 18:13:12 · 2541 阅读 · 3 评论 -
redission中pipeline的使用案例
一、如何在redission使用pipelineRedisson supports pipelining. Multiple operations can be batched as a single atomic operation. This is facilitated by the RBatch class. Multiple commands are aggregated against an RBatch object instance before they are executed.RB原创 2021-09-17 22:55:29 · 2394 阅读 · 0 评论 -
idea&jar包 配置远程调试
一、jar包启动配置jar包在启动时加入如下参数java -Xdebug -Xrunjdwp:transport=dt_socket,address=8788,server=y,suspend=n -jar xxx.jar二、Idea配置远程调试(此处的debug端口号即为tomcat启动参数配置的端口)原创 2020-12-02 14:49:56 · 407 阅读 · 0 评论 -
idea&Tomcat 配置远程调试
一、tomcat服务配置修改启动脚本(脚本位置:~/apache-tomcat-7.0.103/bin/startup.sh)在startup.sh内添加远程调试相关从参数(vim start.sh)declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8788"修改后重新启动tomcat容原创 2020-10-07 14:47:56 · 342 阅读 · 0 评论 -
java包装类的比较
java包装类比较注意事项:包装类对象直接比较的值是对象地址若要进行value值的比较需要获取真实值,或者直接调用equals方法code: @Test public void basicTest() { Long t1 = new Long(1L); Long t2 = new Long(1L); System.out.pr...原创 2020-03-05 12:00:32 · 388 阅读 · 0 评论 -
JAVA泛型机制
JAVA泛型机制【什么是泛型机制?】泛型是JDK1.5以后出来的新特性,其目的是为了解决类型转换的安全问题,是一个类安全机制。泛型格式:通过<>来定义要操作的引用数据类型【泛型机制有什么好处?】类型安全将运行时期出现的问题(ClassCastException),转移到编译时期。消除强制类型转换使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的提...原创 2018-09-28 20:46:06 · 801 阅读 · 0 评论 -
JVM之垃圾回收机制
JVM之垃圾回收机制关于垃圾回收机制(GC)的学习,我准备从以下几个问题开始:什么是GC?对象在堆中如何存在?如何判断哪些垃圾需要回收?如何进行垃圾回收?补充内容一、什么是GC在C++中,当我们每new一个对象之后,我们都需要手动将它回收。java的设计者为解决这一问题,采用java虚拟机的自动内存管理, 将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。这个机制就...原创 2018-10-08 18:07:17 · 494 阅读 · 0 评论 -
java多线程之ThreadLocal的使用
一、什么是ThreadLocal?多线程之间的通信可以通过共享变量来实现(通常以 public static 来修饰共享变量),当有多个线程对共享变量进行操作时,为保证其安全性,我们通常需要对其进行同步处理来保证安全性。但是这又会造成程序执行效率的降低。在某些情况下,若我们是对共享变量的副本进行操作,而非直接操作其本体,那么就可以在既保证效率的情况下又保证其安全性(如数据库连接池获取conne...原创 2018-10-26 20:51:51 · 922 阅读 · 0 评论 -
volatile关键字的奥妙
volatile关键字的奥妙【什么是volatile关键字】 volatile关键字并非java的首创,在C与C++中就已经存在。 volatile是针对保证线程安全的轻量级解决方案(java中synchronized同样可用于保证线程安全,但是对程序性能影响有点大)【volatile的特性】保障了线程之间的可见性,这其中可见性的保证是基于CPU的内存屏障指令,被JSR-1...原创 2018-09-15 16:05:30 · 204 阅读 · 0 评论 -
JVM之加载java类
JVM之加载java类【什么是类加载?】工程文件中编写的.java文件存储着需要计算机执行的程序逻辑,.java文件经过Java编译器编译成拓展名为.class文件,.class文件中保存着Java代码经转换后的字节码指令。当需要使用某个类时,java虚拟机将会加载它的.class文件,并创建对应的Class对象,将class文件加载到虚拟机的内存,这个过程就是类加载。【类加载的基本过程】...原创 2018-09-27 20:01:14 · 277 阅读 · 0 评论 -
乐观锁与悲观锁
【什么是乐观锁与悲观锁?】乐观锁:乐观地看待事物,每次去取数据的时候都认为别人不会在此期间对数据进行修改,所以不上锁。但是在更新的时候会判断一下别人是否对数据改动过,若判断为改动过,则重新取数据、重新判断改动。若判断为未改动过,则更新数据。其中,判断是否发生改动有两种实现方式:版本号机制和CAS算法悲观锁:悲观地看待事物,每次去取数据的时候都认为别人会在此期间对数据进行修改,所以拿数据都...原创 2018-09-21 15:09:58 · 506 阅读 · 0 评论 -
ConcurrentHashMap原理解析
ConcurrentHashMap原理解析【什么是ConcurrentHashMap?】众所周知,Hashmap是一种非常高效的数据结构,但是依旧有它的缺陷。那就是在并发插入数据时,有可能会出现带环链表,让下一次的读操作出现死循环。于是为了避免HashMap的线程安全问题,ConcurrentHashMap应运而生。【ConcurrentHashMap原理】ConcurrentHashMa...原创 2018-09-20 09:06:05 · 261 阅读 · 0 评论 -
关于包装类,String类在堆栈中的存在,以及其为值传递效果的相关测试和思考
首先来看一段代码:public class T180806 { static Integer a1 = new Integer(2); public static void main(String[] args) { Integer a = new Integer(1); Test(a); System.out.println...原创 2018-08-07 21:51:28 · 383 阅读 · 0 评论 -
关于址传递的思考
首先看一段代码:public class T180806 { public static void main(String[] args) { MyNum c1 = new MyNum(2); MyNum c = new MyNum(1); Test(c,c1); System.out.println("c = "+c...原创 2018-08-08 09:14:30 · 240 阅读 · 0 评论 -
Java内存分配(完整,但较粗糙)
java内存分布图,欢迎大家指正原创 2018-08-13 22:13:19 · 205 阅读 · 0 评论 -
自定义异常类的讲解与使用(购物车判断库存是否足够)
在项目开发中,异常类的使用是非常重要的。 在这里,我将通过一个案例,记录并讲解一下如何在项目中使用自定义异常类。 案例背景 一个用户购买商品的场景,用户选择某一商品,点击购买并选择购买数量,程序后台检索该商品库存,如库存数量大于等于购买数量,则允许购买(返回结果success),否则不允许购买。 实现思路 主函数: 实例化一个商品类,调用购买服务,返回购买的状态信息,打印状态信息p......原创 2018-08-16 20:03:40 · 2252 阅读 · 0 评论 -
包装类、8种基本类型,以及String类型的互相转换
基本类型——》包装类 构造器: Integer a = new Integer(1); 包装类——》基本类型 Integer a = new Integer(“22”); int b = a.intValue();包装类—–》String Integer a = new Integer(“22”); String str = a.toString()...原创 2018-08-20 20:10:19 · 1176 阅读 · 0 评论 -
a = a++与 a = ++a详解
以前对a++与++a的理解仅限于: a++先赋值后计算,++a先计算后赋值。 单从应用的角度来讲,这么简单理解是没有问题的。这篇博客用来深入理解测试二者真正的区别。一句话说到前头, a++与++a均为先计算后赋值,不同的是: a++中变量先压栈,后计算,最后赋值于a; ++a中变量先计算,后压栈,最后赋值于a.详解如下: 先了解一些反编译的基础知识: JVM指令详解,可以看这......原创 2018-08-25 13:00:23 · 15161 阅读 · 0 评论 -
ArrayList源码学习
【ArrayList源码学习】 在学习了Snailclimb前辈所写的ArrayList源码分析后,所做的思维概括总结图。 学习地址思维概括总结图如下: 采用ProcessOn作图,这里是原视图网址...原创 2018-09-12 17:59:31 · 194 阅读 · 0 评论 -
HashMap源码学习
HashMap源码学习【什么是HashMap】HashMap是数组+链表组成的,用来存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些Entry分散存储在一个数组当中,这个数组就是HashMap的主干(插入位置通过hash函数决定)。数组的长度是有限的,当插入的Entry越来越多时,再完美的hash函数也会发生冲突(冲突即通过hash函数得到的插入位置内有值)...原创 2018-09-14 17:16:46 · 231 阅读 · 0 评论 -
JAVA中的反射机制
Reflect 反射机制原创 2017-11-09 01:20:13 · 195 阅读 · 0 评论