java
文章平均质量分 61
java学习总结
stay hungry,stay you
stay hungry,stay young
展开
-
强引用 软引用 弱引用 虚引用 以及WeakHashMap简单介绍
虚引用应该可以说是最弱的一种java对象引用方式,其它的引用方式至少还能get到对象,而虚引用的句柄是获取不到对象的。// 新建一个对象// 存储被回收的对象// phantomReference使用虚引用指向这个内存空间到此我们的句柄就通过虚引用指向了新建的User// 获取不到 打印为null使用它可以实现简单缓存,并不建议线上环境使用它来,这里只是来帮助理解原理,是用哈希表实现Map接口,key是类型(弱引用类型),Entry在被自动删除当key不在被使用时候(即不可达时,原创 2024-06-03 22:09:11 · 468 阅读 · 1 评论 -
ThreadPoolExecutor创建线程池详解
该接口是真正的线程池接口。上面的ThreadPoolExecutor以及下面的都是该接口的实现类。Future submit(Runnable task):提交Runnable任务到线程池,返回Future对象,由于Runnable没有返回值,也就是说调用Future对象get()方法返回null。Future submit(Callable task):提交Callable任务到线程池,返回Future对象,调用Future对象get()方法可以获取Callable的返回值。原创 2024-06-02 12:56:26 · 1083 阅读 · 0 评论 -
阻塞队列BlockingQueue(FIFO)
BlockingQueue接口与Queue接口【Queue 和 BlockingQueue 都是在 Java 5 中加入的】原创 2024-06-01 12:05:01 · 712 阅读 · 0 评论 -
容量为0多线程操作的SynchronousQueue(FIFO)
SynchronousQueue是一个没有数据缓冲的,生产者线程对其的插入操作put必须等待消费者的移除操作take。SynchronousQueue的优点在于其直接性和高效性,它实现了线程间的即时数据交换,无需中间缓存,确保了数据传输的实时性和准确性,同时,其灵活的阻塞机制使得线程同步变得简单而直观,适用于需要精确协调的生产者-消费者模型。如上图所示,SynchronousQueue 最大的不同之处在于,它的容量为 0,所以没有一个地方来暂存元素,导致每次取数据都要先阻塞,直到有数据被放入;原创 2024-05-31 20:06:53 · 910 阅读 · 0 评论 -
无界延迟队列DelayQueue
DelayQueue是一个无界的,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。原创 2024-05-30 23:04:26 · 610 阅读 · 0 评论 -
优先级非线程安全PriorityQueue和线程安全PriorityBlockingQueue
PriorityBlockingQueue类实现了接口(所以是线程安全的),它是一个线程安全的队列,继承自类,而类又实现了Queue接口。PriorityBlockingQueue是一个有界的队列,其容量可以在构造函数中进行指定,若不指定则默认大小为。同时,PriorityBlockingQueue也支持根据元素的优先级进行排序,这是由于PriorityBlockingQueue内部实现了一个堆数据结构。至于方法和PriorityQueue其实差不多不多赘述。原创 2024-05-28 20:50:39 · 771 阅读 · 0 评论 -
链表类型的无界阻塞线程安全队列-ConcurrentLinkedQueue(FIFO)和ConcurrentLinkedDeque
链表类型的无界阻塞线程安全队列原创 2024-05-26 15:11:09 · 742 阅读 · 0 评论 -
链表类型的有界或无界阻塞线程安全队列-LinkedBlockingQueue(FIFO)和LinkedBlockingDeque
链表类型的无界阻塞队列原创 2024-05-25 10:40:52 · 304 阅读 · 0 评论 -
数组类型的有界阻塞线程安全队列-ArrayBlockingQueue(FIFO)
数组类型的有界阻塞队列原创 2024-05-24 20:35:28 · 821 阅读 · 0 评论 -
反射获取或修改对象属性的值
反射操作原创 2024-05-23 21:04:14 · 951 阅读 · 0 评论 -
Bean的异步初始化@SofaAsyncInit
其核心就是通过拦截器将标记为SofaAsyncInit注解的bean放入AsyncTaskExecutor异步线程池里面开启异步任务进行加载,所以会节省时间。但是如果两个bean之间注入是有关联的,那肯定不能异步执行只能一个注入了再注入另一个。这里可以清楚的看到通过拿到注解,获取到方法、方法名、通过Spring的上下文事件监听模式,将Class文件进行反射加载。原创 2024-05-19 15:44:42 · 161 阅读 · 0 评论 -
@EventListener事件监听(监听某个实体)
实现对登录名的监听,从而实现某些需求。被监听对象是SysUserDto。原创 2024-05-18 16:40:58 · 214 阅读 · 0 评论 -
自定义注解@CustomValidation
自定义注解原创 2024-05-17 22:19:20 · 242 阅读 · 0 评论 -
RSA非对称加密解密,前端公钥加密后端私钥解密
之后在以密文的形式传给后端(这里调用登录接口queryzhuce()方法),然后后端利用私钥解密获取到真正的明文。RSA非对称加密解密,前端公钥加密后端私钥解密,可以防止陌生人直接通过后端接口篡改数据。通过后端接口getJSEncryptPublic获取公钥之后,直接套函数加密。这里安装jsencrypt这个库进行RSA的加密。后端:sprintboot(Java)如下此时pass是加密后的密文。工具类:hutool。原创 2024-05-13 22:19:04 · 607 阅读 · 0 评论 -
@PostConstruct解决@Autowired 注入为 NULL的问题
@PostConstruct的注入是在类和静态方法变量都加载完后标注@PostConstruct注解的方法才开始注入。发现为null,自己尝试在dao接口@Respority 和 @Compent 但是不行!!!!!!如下解决:@Servicepublic class SPIServiceImpl2 implements SPIService{ @Autowired private SPIDao spiDao2;...原创 2020-04-28 14:39:41 · 1455 阅读 · 1 评论 -
子线程中获取父线程中的ThreadLocal值(InheritableThreadLocal)
从这里可以看出,在子线程中直接用父线程的ThreadLocal对象获取父线程的ThreadLocal值不可能获取到,所以可以在父线程中利用InheritableThreadLocal赋值,然后在子线程中用父线程的InheritableThreadLocal对象获取父线程的值。ThreadLocal 线程之间是隔绝的,各自的ThreadLocal会给自己建一个副本缓存,只存自己都东西。所以想在一个线程中获取另一个线程的东西必须用InheritableThreadLocal。原创 2024-04-14 10:09:33 · 327 阅读 · 0 评论 -
SortedMap和NavigableMap都是接口Map
TreeMap(class 类)实现NavigableMap(是一个接口inferface),然后NavigableMap继承SortedMap(是一个接口inferface)SortedMap是个接口(接口是特殊的抽象类)不能直接new,所以只能new TreeMap()NavigableMap也是个接口(接口是特殊的抽象类)不能直接new,所以只能new TreeMap()SortedMap:NavigableMap和SortedMap方法基本功能一致。。原创 2024-03-10 13:29:14 · 174 阅读 · 0 评论 -
Spring事务回滚规则,是否只读,超时时间,事务失效
默认情况下,事务只有遇到运行期异常(RuntimeExcertion的子类)以及 Error 时才会回滚,在遇到检查型(Checked Exception)异常时不会回滚。像 1/0,空指针这些是RuntimeException,而IOException 则算是 Checked Exception,换言之,默认情况下,如果发生IOException并不会导致事务回滚。原创 2023-12-21 14:33:09 · 623 阅读 · 0 评论 -
Spring事务浅析,传播特性,隔离级别
数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么一起成功,要么一起失败,是一个不可分割的工作单元。在我们日常工作中,涉及到事务的场景非常多,一个service 中往往需要调用不同的 dao 层方法,这些方法要么同时成功要么同时失败,我们需要在service层确保这一点。说到事务最典型的案例就是转账了:张三要给李四转账 500块钱,这里涉及到两个操作,从张三的账户上减去500块钱,给李四的账户添加500块钱,这两个操作要么同时成功要么同时失败,如何确保他们同时成功或者同时失败呢?原创 2023-12-19 17:30:44 · 938 阅读 · 0 评论 -
代理和AOP
这种代理在我们日常生活中其实非常常见,例如房屋中介就相当于是一个代理,当房东需要出租房子的时候,需要发布广告、寻找客户、清理房间。这就是一个静态代理。动态代理讲究在不改变原类原方法的情况下,增强目标方法的功能,例如,大家平时使用的Spring 事务功能,在不改变目标方法的情况下,就可以通过动态代理为方法添加事务处理能力。编译时增强,这种有点类似于 Lombok的感觉,就是在编译阶段就直接生成了代理类,将来运行的时候,就直接运行这个编译生成的代理类,AspectJ就是这样一种编译时增强的工具。原创 2023-12-19 13:42:33 · 848 阅读 · 0 评论 -
为什么不建议在 MySQL 中使用 UTF-8?
mysql utf-8难道真是utf-8吗原创 2022-06-12 12:07:45 · 103 阅读 · 0 评论 -
java8 常用操作及解释
java8常用操作原创 2022-06-12 11:52:44 · 322 阅读 · 0 评论 -
BigDecimal 使用不当丢失精度
BigDecimal 转换时转换为String原创 2022-06-11 21:28:57 · 1313 阅读 · 0 评论 -
Lambda 表达式中的 forEach停止循环
lambda foreach 停止循环原创 2022-06-11 20:56:09 · 2998 阅读 · 0 评论 -
异步运行理解
异步(我的理解): 1:有多个线程同时执行,一个线程执行(main)当执行到一个地方时等待另一个线程得执行完成,两者同一时刻都在运行,最后main线程把其他线程得结果返回。 2:有多个线程同时执行,一个线程执行(main),先把需要异步执行得代码跳过直接执行后面得代码不会等待其他线程执行完,于此同时其他线程也在执行需要异步的代码。第一种例子:public class DataController { public static void main(String[] args) {原创 2022-01-21 16:44:10 · 652 阅读 · 0 评论 -
Java8 CompletableFuture处理异步任务
CompletableFuture:在处理异步任务的时候的作用Java8 CompletableFuture原创 2021-08-28 09:54:41 · 2179 阅读 · 0 评论 -
ThreadLocal多线程之间存取数据互不干扰
原理理解参考ThreadLocal多线程之间互不干扰public class ThreadLocalController { private static ThreadLocal<List<String>> threadLocal = new ThreadLocal<>(); public void setThreadLocal(List<String> value) { threadLocal.set(value);原创 2021-02-24 16:36:19 · 476 阅读 · 0 评论 -
DelayQueue延迟队列
/** * 延迟队列 时间越长最迟从队列中输出 */public class DelayQueueController implements Delayed { //名称 private String name; //时长 private long time; public DelayQueueController(String name, long time, TimeUnit unit) { this.name = name;原创 2021-02-23 17:19:17 · 128 阅读 · 1 评论 -
PriorityBlockingQueue优先级队列
谁级别高谁先输出/** * 优先级队列 */public class PriorityBlockingQueueController { static class Ticket implements Comparable<Ticket> { private int level; public Ticket(int level) { this.level = level; } @Over原创 2021-02-23 17:16:47 · 150 阅读 · 0 评论 -
ConcurrentHashMap的使用和理解
(一) ConcurrentHashMap实现 数据在多线程之间的可见性 //这种类似于volatile 可以实现多线程操作数据时数据在多个线程之间的可见性 static Map<Long, String> conMap = new ConcurrentHashMap<Long, String>(); public static void main (String[]args) throws InterruptedException {原创 2021-02-23 16:32:33 · 1151 阅读 · 3 评论 -
可重入锁ReentrantLock
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock(一)简介ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。原创 2021-02-23 10:32:07 · 137 阅读 · 0 评论 -
CountDownLatch的使用和理解
@RequestMapping(value = "/getThread", method = RequestMethod.GET) @ResponseBody public String getData(){ CountDownLatch latch = new CountDownLatch(4); new Thread(() -> { try { //第一个线程被阻塞 ...原创 2021-02-20 18:31:33 · 121 阅读 · 0 评论 -
异常统一处理方法
本人另一种对字段校验方法自己正常的controller@Controller@RequestMapping("/exception")public class ExceptionController { @RequestMapping(value = "/typehao", method = RequestMethod.GET) public ModelAndView getPages(String type) throws Exception{ if ("erro原创 2020-10-29 18:33:36 · 230 阅读 · 0 评论 -
java.util.Objects工具类
Objects原创 2020-10-27 21:33:32 · 153 阅读 · 0 评论 -
多个for循环嵌套的break
单独break在内层,如下这种遇到只是跳出内层for循环public static void main(String[] args) { for(int i=0;i<10;i++){ for (int j=0;j<10;j++){ if (j==2){ System.out.println("数字:"+j+"\n"); break;原创 2020-10-26 23:44:34 · 6551 阅读 · 1 评论 -
对实体类字段的校验
import javax.validation.ConstraintViolation;import javax.validation.Validator;import java.util.HashMap;import java.util.Map;import java.util.Set;@Controller@RequestMapping(value = "/kafka")public class KafkaController { //import javax.validatio原创 2020-10-26 23:27:58 · 962 阅读 · 0 评论 -
java本地内存缓存类LocalCache
具体介绍:1)调用save()方法,可以添加缓存,并指定过期时间。2)调用load()方法可以从本地缓存中读取数据,如果缓存过期了,则返回null,业务层需要从数据库等持久化存储库中查询数据,并再次缓存起来。3)也可以调用clearCache()方法手动删除指定key缓存。4)定时任务会每隔5分钟定时清理一次已过期的缓存数据。工具类(可以直接拿来用)import com.alibaba.fastjson.parser.ParserConfig;import com.alibaba.fastjs原创 2020-10-25 22:26:17 · 1484 阅读 · 0 评论 -
@Autowired和@Resource的使用
@Autowired和@Resource 区别原创 2020-10-25 21:29:02 · 239 阅读 · 0 评论 -
利用流读取文件中的内容(InputStream)
读取上述文件中内容。运行后实际读取位置:两种方式:1:getClassLoader方式 public static void main(String[] args) { //当前页面的类名EsTest ClassLoader classLoader = new EsTest().getClass().getClassLoader(); InputStream resourceAsStream = classLoader.getResourceAsSt.原创 2020-10-25 21:23:15 · 1480 阅读 · 0 评论 -
Spring Boot 多数据源配置的学习
Spring Boot 多数据源配置原创 2020-07-30 16:27:24 · 92 阅读 · 0 评论