Linux常用的命令
参考网址https://wangchujiang.com/linux-command/list.html#!kw=ls
https://wangchujiang.com/
https://github.com/jaywcjlove/linux-command
linux的目录结构
/bin: bin是Binaries(二进制文件的缩写),这个目录中存放的是经常使用的命令
/boot: 存放的是linux的核心文件,包括一些连接文件及镜像文件
/dev: 是Device(设备)的缩写 存放的linux的外部设备
/etc: linux的系统配置文件
/home: 用户的主目录
/lib: library(可选) 系统最基本的动态连接口库
/media: 挂载目录 ,例如u盘光驱等
/mnt: 用户临时文件挂载目录
opt: optional(可选) 用户的软件安装目录 比如oracle
proc: 是Processes(进程) 的缩写 /proc 是一种伪文件系统(虚拟的文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它 ...
常见的轮询算法
常见的轮询算法123456789101112131415161718class ServerIps { public static final Map<String, Integer> WEIGHT_LIST = new HashMap<>(); static { // total weight is 50 WEIGHT_LIST.put("192.168.0.1", 2); WEIGHT_LIST.put("192.168.0.2", 8); WEIGHT_LIST.put("192.168.0.3", 3); WEIGHT_LIST.put("192.168.0.4", 6); WEIGHT_LIST.put("192.168.0.5", 5); WEIGHT_LIST.put("192.168.0.6", 5) ...
bitmap
bitMap实现:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273package com.yzw.arithmetic.first;import java.util.HashSet;import java.util.Random;public class BitMap { private long[] bytes = null; public BitMap(int max) { /*当我们往里添加数据的时候至少需要 1个长度的数字 long类型的大小为8个字节即64 所以long数组开始的大小为 ((max + 64) >> 6) = ((max + 64) / 64)*/ bytes = new long[((max + 64) >> 6) ...
java线程停止的两种的方式
interrupt()方法
其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。
结论:
对一个线程,调用 interrupt() 时, ① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出InterruptedException异常。仅此而已。 ② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。
也就是说,一个线程如果有被中断的需求,那么就可以这样做。 ① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。 ② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
示例:
1234567891011121314151617181920212223242526272829cla ...
spring + redis 实现分布式锁
spring + redis 实现分布式锁定义枚举
1234567@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RepeatSubmit {}
实现redis锁
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130/** * 重复拦截器处理器 * * @author * @date 2021-5-12 **/ ...
java中的 Lambda表达式和匿名内部类的区别
java中的 Lambda表达式和匿名内部类的区别123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960package com.yzw.test;/** * 1.8 Lambda表达式和匿名内部类的区别 * <p> * 所需类型不同 * 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 * Lambda表达式:只能是接口 * <p> * 使用限制不同 * 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 * 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式 * <p> * 实现原理不同 * 匿名内部类:编译之后,产生一个单独的.class字节码文件 * Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成 */public class LambdaDemo { ...
枚举工具类
java 枚举工具类:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153class YZWEnumUtil { /** * 使用code 获取 value * * @param value * @param cla * @param <T> * @param <E ...
实现滑动时间窗口限流算法
Java 实现滑动时间窗口限流算法123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354package com.yzw.test;import java.time.LocalTime;import java.util.*;import java.util.concurrent.ConcurrentHashMap;public class SlideWindow { /** * 队列id和队列的映射关系,队列里面存储的是每一次通过时候的时间戳,这样可以使得程序里有多个限流队列 */ private volatile static Map<String, List<Long>> MAP = new ConcurrentHashMap<>(); private SlideWindow() { } public static synchron ...
数据库幂等性
数据库方式实现接口幂等性幂等性:对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。
以对接支付宝充值为例,如果我们系统对接支付宝充值功能,需要给支付宝提供一个回调接口,支付宝回调信息中会携带(out_trade_no【商户订单号】,trade_no【支付宝交易号】),trade_no在支付宝中是唯一的,out_trade_no在商户系统中是唯一的。
回调接口实现有以下实现方式。
(1)普通方式
过程如下:
1.接收到支付宝支付成功请求2.根据trade_no查询当前订单是否处理过3.如果订单已处理直接返回,若未处理,继续向下执行4.开启本地事务5.本地系统给用户加钱6.将订单状态置为成功7.提交本地事务
对于同一笔订单,如果支付宝同时通知多次,同时到达第2步时候,查询订单都是未处理的,会继续向下执行,最终本地会给用户加两次钱。
此方式适用于单机,通知按顺序执行的情况,只能用于自己测试。
(2)JVM加锁方式
方式(1)中由于并发出现了问题,此时我们使用java中的Lock加锁,来防止并发操作,过程如下:
1.接收到支付宝支付成功请求2.调用java中的Lock加锁3.根据tra ...
java内存模型
Java内存区域(运行时数据区域)和内存模型(JMM)
Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。
而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。
JVM主内存与工作内存Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量(线程共享的变量)存储到内存和从内存中取出变量这样底层细节。
Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
这里的工作内存是 JMM 的一个抽象概念,也叫本地内存,其存储了该线程以读 / 写共享变量的副本。
就像每个处理器内核拥有私有的高速缓存,JMM 中每个线程拥有私有的本地内存。
不同线程之间无法直接访问对方工作内存中的变量,线程间的通信一般有两种方式进行,一是通过消息传递, ...