
java
Wolf-Z
思想需要记录
展开
-
基于redis实现分布式锁(单节点)
2、锁需要添加过期时间,并且获取锁和设置过期时间要保证原子性,这里使用Lua脚本(Lua脚本在redis执行是原子性的)执行【问题2】解锁时检查value值是否和当前线程的value一致,一致才能解锁【问题3】问题2:锁要有过期时间(一个线程获取锁后宕机,导致其它线程都获取不到锁)1、redis的SETNX是key不存在时,才能set成功【问题1】问题1:获取锁的唯一性(多个线程不能同时获取一个锁)2、多节点的分布式锁可使用redlock等框架实现。问题3:释放锁时,只能释放自己(本线程)创建的锁。原创 2023-04-10 16:16:48 · 812 阅读 · 0 评论 -
springboot如何优雅的打印项目日志
HttpServletRequest 包装器,用于缓存从输入流和读取器读取的所有内容,并允许通过字节数组检索此内容。因为request的数据流只能读取一次,通过过滤器读取一次后,后面的业务处理会读不到数据。通过ContentCachingRequestWrapper将请求包装,可以进行多次读取。兼容多种servlet版本,保证在任何 servlet 容器上每个请求调度一次执行。使用filter拦截请求,打印出请求、响应,及耗时。源代码如下,第一次获取输入流时,复制了一份。原创 2023-04-10 10:08:28 · 1356 阅读 · 0 评论 -
dump内存
1、查看java应用pidtop | grep java2、输出内存信息jmap -dump:live,format=b,file=out.hprof pid3、使用MAT等工具对内存进行分析原创 2021-11-17 11:37:44 · 1030 阅读 · 0 评论 -
查看实时gc日志
如何查看实时GC日志1、先使用top命令查看Java应用的pidtop | grep java2、输入如下命令查看gc情况(pid替换为之前查到的值,1000代表1秒打印一次, 100代表打印100次)jstat -gcutil pid 1000 100原创 2021-11-17 11:08:37 · 2105 阅读 · 0 评论 -
简单好用的批量执行工具-Java
解决问题批量执行任务时,总是需要关注许多的边界问题Example比如需要打印1-100的数字,每一批10个List<Integer> workList = new ArrayList<>();for (int i = 0; i < 100; i++) { workList.add(i + 1);}BatchUtil.process(10, workList, (list) -> { System.out.printl原创 2021-11-17 10:59:45 · 5953 阅读 · 0 评论 -
bug排查与解决
命令执行jar包将项目和依赖分开打包,依赖copy 到lib目录下<build> <finalName>name</finalName> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <plugins> <plugin> <原创 2020-12-04 11:20:08 · 181 阅读 · 0 评论 -
SpringBoot2.x访问静态资源问题-超简单解决方法
在application.properties中添加如下图配置spring.mvc.static-path-pattern=/**亲测,如下四个文件夹都可以访问到:官方文档如下:不知道为什呢官方文档的 /resources/** 反倒访问不到,有知道答案的可以留言...原创 2019-11-01 14:48:37 · 3652 阅读 · 5 评论 -
SpringBoot项目中前端页面通过URL访问本地文件夹(访问静态文件)
文章目录前端页面通过URL访问本地文件夹在application.yml中添加配置实现WebMvcConfigurer接口前端页面中进行访问前端页面通过URL访问本地文件夹因为SpringBoot项目中使用的嵌入Tomcat,所以前端页面不能像以前那样直接将从Tomcat很目录访问文件。解决办法:继承WebMvcConfigurer接口对访问URL进行拦截,然后将访问文件的URL映射至本地文件夹在application.yml中添加配置首先在本地创建文件夹accessFile: reso原创 2020-05-22 09:25:59 · 11478 阅读 · 1 评论 -
超简单spring5源码编译(IDEA)
下载spring5.x国内直接在GitHub下载会很慢,所以这里我通过码云来下载1、首先在github搜索spring-framework选择版本并复制链接2、注册码云,创建新库,导入已有仓库,粘贴复制的链接,创建完成就可以在码云直接下载,速度贼快本地安装Gradle,这个网上有教程很简单Gradle下载链接我下载的是4.10.3版本开始编译1、解压spring5.x源码...原创 2020-02-16 11:54:01 · 888 阅读 · 0 评论 -
java排序算法总结
用Java实现排序:冒泡排序、插入排序、选择排序、Shell排序、快速排序、归并排序、堆排序、基数排序冒泡算法两个两个进行比较,交换位置public class PopSort { public static int[] sort(int[] a){ boolean sorted=true; for(int i=0;i<a.length-...原创 2018-10-21 16:47:31 · 156 阅读 · 0 评论 -
java随机数陷阱
public class RandomTrap { static StringBuffer stringBuffer=new StringBuffer('D');//D被作为Int值传入 static StringBuffer stringBuffer2=new StringBuffer("AB"); public static void main(String[] args...原创 2018-10-17 11:06:03 · 285 阅读 · 0 评论 -
Hash Map的分拣存储思想
HashMap分拣存储字母/** * 统计每个单词出现的个数 * 存储到map中 * */public class Map01 { public static void main(String[] args){ String str="my name is zhangrui i am is a student and my school is xian";...原创 2018-10-25 14:41:27 · 200 阅读 · 0 评论 -
对字符串和时间的比较排序
详情见代码:public class Test{ public static <T extends Comparable<T>> void sort(T[] arr){ boolean sorted=true; for(int i=0;i<arr.length-1;i++){ for(int j=0...原创 2018-10-25 22:42:05 · 1450 阅读 · 0 评论 -
ArrayList和LinkedList的简单实现
ArrayListpublic class ArrrayList1 { Object[] elementData; int size; public ArrrayList1() { this(10); } public ArrrayList1(int c){ if(c>0){ element...原创 2018-10-23 19:04:23 · 183 阅读 · 0 评论 -
TreeMap和TreeSet对Comparable和Comparator的使用
TreeSet使用Comparator/** * 解耦方式,业务排序类 */import java.util.Arrays;import java.util.TreeSet;public class TreeSet1 { public static void main(String[] args){ Human h1=new Human("zhang"...原创 2018-10-26 18:20:31 · 424 阅读 · 0 评论 -
I/O和NIO
I/O阻塞和NIO非阻塞传统Java IO是基于阻塞I/O模式,这意味着,当一个线程在调用read()和write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间不能再干任何事情,不仅如此,传统的输入流,输出流都是通过字节的移动来处理的(即使不直接去处理字节流,但底层的实现还是依赖于字节处理)。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据...原创 2018-10-26 18:25:49 · 173 阅读 · 0 评论 -
Quque和Stack
Deque是一个具有队列和栈属性的双向队列Quque(先进先出)import java.util.ArrayDeque;import java.util.Queue;public class MyQuque { public static void main(String[] args){ Queue<Request> queue=new Arr...原创 2018-10-26 21:18:48 · 301 阅读 · 0 评论 -
Hashtable和HashMap
Hashtable和HashMap的主要区别 主要:Hashtable线程安全,同步,效率相对低下 HashMap线程不安全,非同步,效率相对 父类:Hashtable是Dictionary, HashMap是AbstractMap null:Hashtable键与值不能为null , HashMap键最多一个null,值可以多个nullProperties作用:读取资源配置文...原创 2018-10-26 23:54:57 · 122 阅读 · 0 评论 -
实现简单的Map
Mapmap是有数组+链表实现的,代码如下:public class MyMap { LinkedList[] data;//链表 int size; public MyMap(){ this(10); } public MyMap(int c){ data=new LinkedList[c]; } ...原创 2018-10-24 18:46:53 · 283 阅读 · 0 评论 -
引用分类和三个实现Map
一、引用分类强引用:StrongReference:引用指向对象,gc(Garbage collection)运行时不回收软引用:SoftReference gc运行时可能回收(jvm内存不够)弱引用:WeakReference gc运行时立即回收虚引用:PhantomReference 类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQue...原创 2018-10-27 10:26:37 · 154 阅读 · 0 评论 -
文件夹的复制
import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;/** * 文件夹的拷贝 * 文件复制 copyFile * 文件夹创建 mkdirs() * 递归查找子孙级 * */public class Demo02 { public static voi...原创 2018-10-30 22:08:54 · 147 阅读 · 0 评论 -
装饰模式
package com.io;/** * 扩音器 * 类与类之间的关系 * 1、依赖:形参 |局部变量 * 2、关联:属性 * 聚合:属性 整体与部分 不一致的生命周期 人与手 * 组合:属性 整体与部分 一致的生命周期 人与大脑 * 3、继承:父子类关系 * 4、实现:接口与实现类的关系 */public class DeMo11...原创 2018-11-06 17:28:42 · 113 阅读 · 0 评论 -
多线程
一、程序 进程 线程 1、程序:指令集 静态概念 2、进程:操作系统 调度程序 动态概念 3、线程:在进程内多条执行路径thread的缺点是Java只能单继承静态代理模式/** * 静态代理 设计模式 * 1、真实角色 * 2、代理角色 * 3、实现同一个接口 */public class StaticProxy {}interface Marray...原创 2018-11-09 19:47:34 · 114 阅读 · 0 评论 -
编码与解码
字符->二进制 编码 二进制->字符 解码import java.io.UnsupportedEncodingException;/** * 编码与解码 * 字符->二进制 编码 * 二进制->字符 解码 */public class Demo04 { public static void main(String[] args) thr...原创 2018-11-02 13:03:18 · 445 阅读 · 0 评论 -
网络编程
一、网络:将不同区域的计算机连接到一起 局域网 城域网 互联网二、IP地址 确定网络上一个绝对地址|位置 -->房子的地址三、端口号:区分计算机软件的 -->房子的房门 2个字节 0-65535 共65536 个 1、在同一个协议下 端口号不能重复 不同协议下可以重复 2、1024以下的不要使用 80-->http 21-->ftp四、资源定位:UR...原创 2018-11-09 23:13:01 · 94 阅读 · 0 评论 -
节点流输入输出流
节点流字节数组输入流:ByteArrayInputStream read(byte[] b,int off,int len)+close() 输出流:ByteArrayOutputStream write(byte[] b,int off,int len)+toByteArray() 新增方法不要使用多态import java.io...原创 2018-11-02 22:59:10 · 226 阅读 · 0 评论 -
处理流
处理流输入流:DataInputStream输出流:DataOutputStream数据+类型的输入输出import java.io.*;/** * 数据类型(基本+String)处理流 * DataInputStream * DataOutputStream * java.io.EOFException 没有读取到相关的内容 */public class Dem...原创 2018-11-04 23:23:09 · 227 阅读 · 0 评论 -
文件的分割与合并
import java.io.*;import java.util.*;public class MySplitFile { private String srcPath;//被分割的文件目录 private String destPath;//分割的目的文件夹 private String fileName;//分割的文件名 private long beg...原创 2018-11-07 19:34:57 · 281 阅读 · 0 评论 -
IO总结
节点流:离数据源|程序最近的流 处理流:装饰模式、提高性能、增强功能 1、字节流 1)输入流:InputStream FileInputStream ByteArrayInputStream 操作:read(字节数组) a)、中间容器 byte[] flush=new byte[长度]...原创 2018-11-07 20:55:21 · 107 阅读 · 0 评论 -
序列化与反序列化
引用类型(对象)保留数据+类型反序列化 输入流:ObjectInputStream readObject()序列化 输出流:ObjectOutputStream writeObject()注意:1、先序列化后反序列化,顺序保持一致2、不是所有对象都可以序列化,java.Io.Serializable 不是所有属性都需要序列化,tran...原创 2018-11-05 19:31:26 · 162 阅读 · 0 评论 -
流的关闭
import java.io.Closeable;import java.io.IOException;/** * 工具类关闭流 * 可变参数:... 只能形参最后一个位置,处理方式与数组一致 */public class FileUtil01 { public static void close(Closeable ...io){ for(Closeabl...原创 2018-11-05 21:34:44 · 307 阅读 · 0 评论 -
打印流
import java.io.*;import java.util.Scanner;/** * System.in * System.out * System.err * -->重定向 * setIn() * setOut() * setErr() * FileDescriptor.in * FileDescriptor.out */public class S...原创 2018-11-05 22:17:13 · 107 阅读 · 0 评论 -
简单聊天室
利用多线程实现多个客户端向服务器发送数据并接收数据的功能服务端:import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util...原创 2018-11-16 16:31:13 · 192 阅读 · 1 评论 -
java脚本引擎Rhino
//定义function test(){ var a=3; var b=5; print("invoke js file:"+(a+b));}//执行test(); import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngi...原创 2018-11-25 20:37:35 · 350 阅读 · 0 评论 -
注解 反射
反射会使性能变慢 使用反射读取注解的信息,模拟处理注解的过程import java.lang.annotation.Annotation;import java.lang.reflect.Field;/** * 使用反射读取注解的信息,模拟处理注解的过程 */public class Demo01 { public static void main(String[]...原创 2018-11-25 10:06:29 · 200 阅读 · 0 评论 -
xml文档的解析
<?xml version="1.0" encoding="utf-8" ?><web-app> <servlet> <servlet-name>login</servlet-name> <servlet-class>rui.server.httpser原创 2018-11-25 10:21:14 · 97 阅读 · 0 评论 -
动态编译
import javax.tools.JavaCompiler;import javax.tools.ToolProvider;import java.io.*;public class Demo01 { public static void main(String[] args) throws IOException { String string="" + ...原创 2018-11-25 12:44:58 · 136 阅读 · 0 评论 -
HttpServer
HTTP响应格式HTTP协议规定,响应与请求一样,由三部分组成,分别是:1、HTTP协议版本、状态代码、描述2、响应头(Response Head)3、响应正文(Response Content)import java.io.IOException;import java.net.ServerSocket;/** * 创建服务器 */public class Se...原创 2018-11-25 12:58:37 · 982 阅读 · 0 评论 -
字节码操作
Java常见动态性的两种实现方式:字节码操作(效率高一点)反射使用javassist库 局限性:jdk5.0新语法不支持(包括泛型、枚举)、不支持注解修改,但可以通过底层javassist类库解决具体参见:javassist.bytecode.annotation不支持数组的初始化,如string[]{"1","2"},除非数组的容量为1不支持内部类和匿名类不支...原创 2018-11-29 15:21:56 · 272 阅读 · 0 评论 -
Annotation
应用反射的API,获取类的信息(类的名字、属性、方法、构造器等) import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * 应用反射的API,获取类的信息(类的名字、属性、方法、构造器等) */public class Dem...原创 2018-11-29 15:34:53 · 155 阅读 · 0 评论