- 博客(52)
- 收藏
- 关注
原创 Redisson内置延迟队列RDelayedQueue
当我们将一个消息添加到RDelayedQueue时,我们会为这个消息设置一个score,这个score代表了消息的延迟时间。Sorted Set是一个有序集合,其中的每个元素都会关联一个分数(score),Redis根据这个分数来为集合中的元素进行排序。Redissonson的RDelayedQueue提供了一种简单而有效的延迟队列实现,但在实际应用中,我们仍然需要面对一些挑战。在分布式系统中,延迟队列是一种非常有用的数据结构,它允许我们将任务或消息延迟到指定的时间再进行处理。
2024-07-19 11:24:43 544
原创 Jwt令牌
JWT全称: JSON Web Token定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。简洁:是指jwt就是一个简单的字符串。可以在请求参数或者是请求头当中直接传递。自包含:指的是jwt令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求在jwt令牌中存储自定义的数据内容。如:可以直接在jwt令牌中存储用户的相关信息。简单来讲,
2024-07-19 11:21:12 308
原创 CountDownLatch介绍和使用【Java多线程并发】
CountDownLatch 内部维护了一个计数器,该计数器初始值为 N,代表需要等待的线程数目,当一个线程完成了需要等待的任务后,就会调用 countDown() 方法将计数器减 1,当计数器的值为 0 时,等待的线程就会开始执行。例如:在多线程中,一个节点需要等待其他节点的加入后才能执行某个任务,可以使用 CountDownLatch 控制节点的加入,等所有节点都加入完成后再执行任务。例如:一个大型的任务需要被拆分成多个子任务并交由多个线程并行处理,等所有子任务都完成后再将处理结果进行合并。
2024-04-07 11:31:18 601
原创 Java中的Semaphore
Semaphore是一个计数信号量,用来管理一定数量的许可证。每个线程在访问共享资源之前,需要先获取一个许可证,如果许可证已经被其他线程占用,则需要等待,直到许可证可用。当线程使用完共享资源后,需要释放许可证,使其他线程可以继续访问。其中permits表示许可证的数量,即同一时间内允许的并发访问线程数。线程在使用完共享资源后,应该释放许可证,以便其他线程可以获取许可证。
2024-04-07 10:45:26 418
原创 tampedLock详解
StampedLock是比ReentrantReadWriteLock更快的一种锁,支持乐观读、悲观读锁和写锁。和ReentrantReadWriteLock不同的是,StampedLock支持多个线程申请乐观读的同时,还允许一个线程申请写锁。乐观读并不加锁StampedLock的底层并不是基于AQS的。
2024-04-06 17:54:11 323
原创 ReentrantReadWriteLock——读写锁原理
用的是同一个Sycn同步器,因此等待队列,state等也是使用同一个t1成功上锁,流程与ReentrantLock加锁相比没有特殊之处,是写锁使用state的低16位,而读锁占了state的高16位。
2024-04-06 17:52:48 959
原创 并发编程 — AtomicMarkableReference 详解
AtomicMarkableReference 与 AtomicStampedReference 一样也可以解决 ABA的问题,两者唯一的区别是,AtomicStampedReference 是通过 int 类型的版本号,而 AtomicMarkableReference 是通过 boolean 型的标识来判断数据是否有更改过。
2024-04-02 11:27:20 437
原创 Java线程:活锁
如果两个线程互相改变对方的结束条件,就可能导致双方谁也无法结束。活锁是指,线程没有发生阻塞,但依然执行不下去的情况。相当于一个抽水一个注水,水池永远不会空或者满。
2024-03-31 15:30:10 594
原创 线程:park & unpark
先park再unpark的方式是容易理解的。但还有一个场景,先unpark后再次执行park方法,也不会阻塞调用了park方法的线程。理解为park方法就是校验获取一个通行令牌,而unpark方法是获取到一个通行令牌的过程。先执行unpark方法,代表先获得了通行令牌。那么在另一个线程调用park方法时,校验到这个令牌存在,消耗掉这个令牌然后就可以继续往下走。park,unpark这两个方法都是LockSupport类名下的方法,park用来暂停线程,unpark用来将暂停的线程恢复。
2024-03-26 15:40:17 451
原创 LibFuzzer初认识
当我们面对大规模的开源项目以及需要进行长时间的测试工作时,如何继续保持fuzz的高效进行以得到crash便是我们要继续研究的课题,这就涉及到一些对编译选项的设置以及对fuzz的一些额外条件的设定,这些都会可能会影响到fuzz的效率,等待这我们进一步的研究。PS:我觉得在学习libfuzzer的过程中,我们不能仅仅局限局限于获得了一个crash,还要进一步的去定位漏洞之所在,分析漏洞产生的原因,思考漏洞的利用方法和修补方式,这才是正确对待fuzz的态度以及漏洞挖掘的魅力所在。(即完成了编译插桩)
2024-03-25 22:02:44 807
原创 Sleep(long n)和wait(long n)的区别
sleep是Thread线程方法,wait是Object的方法 sleep不需要和synchronized配合使用,而wait需要和synchronized一起使用 sleep在睡眠时不会释放对象锁,但wait在等待时会释放对象锁
2024-03-25 17:39:09 111
原创 JUC:锁消除
JIT编译器在编译的时候,进行逃逸分析。分析synchronized锁对象是不是只可能被一个线程加锁,不存在其他线程来竞争加锁的情况。这时就可以消除该锁了,提升执行效率。StringBuffer的append为同步方法。但上述的appendStr中的sb对象没有传递到方法外,不会被其他线程引用,不存在锁竞争的情况,因此可以进行锁消除。编译就不用加入monitorenter和monitorexit指令。
2024-03-25 16:28:08 177
原创 批量重偏向和批量撤销
批量重偏向:如果一个类的大量对象被一个线程T1执行了同步操作,也就是大量对象先偏向了T1,T1同步结束后,另一个线程也将这些对象作为锁对象进行操作,会导偏向锁重偏向的操作。批量撤销:当一个偏向锁如果撤销次数到达40的时候就认为这个对象设计的有问题;那么JVM会把这个对象所对应的类所有的对象都撤销偏向锁;并且新实例化的对象也是不可偏向的。synchronized批量重偏向与批量撤销。
2024-03-25 16:20:47 322
原创 JVM参数-XX:+HeapDumpOnOutOfMemoryError
这个参数的意思是当程序出现OOM的时候就会在当前工程目录生成一个dump文件
2024-03-09 17:02:56 191
原创 jmap-各种option参数说明
jmap(JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。开发人员可以在控制台输入命令"jmap -help"查阅jmap工具的具体使用方式和一些标准选项配置。
2024-03-08 11:07:32 439
原创 Leetcode106.从中序与后序遍历序列构造二叉树
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第五步:切割后序数组,切成后序左数组和后序右数组。第一步:如果数组大小为零的话,说明是空节点了。看到二叉树的遍历就首先想到递归。第六步:递归处理左区间和右区间。
2024-01-18 21:12:46 708
原创 JVM与HotSpot
JVM是虚拟机的规范,HotSpot是jvm的具体实现HotSpot包括一个解释器和两个编译器(client 和 server,二选一的),解释与编译混合执行模式,默认启动解释执行。编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时)。解释器: 解释器用来解释class文件(字节码),java是解释语言(书上这么说的)。server启动慢,占用内存多,执行效率高,适用于服务器端应用。
2024-01-16 21:52:56 976
原创 Collections.reverse()方法
Collections.reverse() 方法可以对list集合进行逆序(翻转)经过执行Collections.reverse()方法后,为3,2,1。例如,list原本的顺序为1,2,3。
2024-01-15 17:50:53 750
原创 二叉树的遍历(递归法)
在递归的过程中,如何算是递归结束了呢?当然是当前遍历的节点为空,那么本层递归就要结束了。所以,如果当前遍历的这个节点为空,就直接return。参数中需要传入list来存放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,因此递归函数的返回类型就是void。前序遍历是根左右,所以逻辑如下。①确定递归函数的参数和返回值。③确定单层递归的逻辑。
2024-01-14 16:18:16 1381
原创 Leetcode 347:前K个高频元素
看到这道题一开始的思路是:使用map:键存放nums,值存放nums出现的次数。然后通过对值排序的方法找出前k个元素。官方题解给出的是用优先级队列做,而且用的是小顶堆。大顶堆的话,每次移除的都是最大的元素(×)
2024-01-12 15:43:19 601
原创 Leetcode239:滑动窗口最大值
看到这道题,首先的思路一定是两个循环嵌套。但是,这样做必定超时。①就是一定保持队列的对头一定是最大值。这是一道典型的单调队列的题。
2024-01-11 15:28:42 720
原创 Leetcode20:有效的括号
这个题目的意思就是和消消乐一样,左右括号必须匹配。③右括号多了:( ){ [ ] } ) ) )①左括号多了:例如( [ ]{ }②括号不匹配:( )[ { ) ]
2024-01-10 08:45:00 545
原创 Java Stack类
堆栈只定义了默认构造函数,用来创建一个空栈。堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
2024-01-09 10:19:18 593
原创 Leetcode459:重复的字符串
基于这个思想,可以每次移动k个字符,直到匹配移动 length - 1 次。但是这样对于重复字符串很长的字符串,效率会非常低。为了避免这种无用的环绕,可以创建一个新的字符串 str,它等于原来的字符串 S 再加上 S 自身,这样其实就包含了所有移动的字符串。一开始 acd (acd) ,移动一次 ac(dac)d,移动两次 a(cda)cd。其实都包含在了 str 中了。比如字符串:S = acd,那么 str = S + S = acdacd。现在字符串和原字符串匹配了,所以可以得出结论存在重复的子串。
2024-01-08 11:51:05 625
原创 Leetcode349和350 两个数组的交集问题的思考
题目要求的是数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。不考虑输出结果的顺序。翻译过来就是,如果一个数组有3个4,一个数组有4个4。这时候使用set不合适,因为在JAVA中set是无序,且不包含重复元素的。Leetcode 350:两个数组的交集II。Leetcode 349:两个数组的交集I。题目要求的是输出结果中的每个元素一定是。所以我们考虑使用set。因此,我们考虑使用map。
2024-01-06 12:30:00 496 1
原创 Java Arrays.copyOfRange的用法
original:第一个参数为要拷贝的数组对象。from:第二个参数为拷贝的开始位置(包含)to:第三个参数为拷贝的结束位置(不包含)将一个数组拷贝至另一个数组中。
2024-01-05 02:15:00 701 1
原创 JAVA Map.getOrDefault() 方法
该方法出现在:字母异位词分组getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。
2024-01-04 09:42:17 863 1
原创 Fuzzing101:Exercise 5 - LibXML2 翻译+解题
现在,需要创建一个XML字典。让我们首先得到我们的fuzzing目标。为您想要fuzzing的项目创建一个新的目录。XML 解析库进行模糊测试。目标是在 LibXML2 2.9.4 中找到。首先,我们需要获取一些 XML 样本。我们将使用此存储库中提供的。下载并解压libxml2 - 2.9.4.tar.gz。在本次练习中,我们将对。
2023-12-26 16:15:03 599 1
OMNeT++文档(一些问题的解决方法)
2023-06-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人