自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 Java中线程安全集合类

Java中线程安全类可以分为三大类。

2024-04-07 16:17:35 631

原创 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

原创 CAS的特点

结合CAS和volatile可以实现无锁并发,适用于线程数较少、多核CPU的场景下。

2024-04-02 10:35:07 214

原创 ReentrantLock

与synchronized一样,它支持可重入。

2024-03-31 16:00:24 117

原创 Java线程饥饿

此外,死锁也是一种特殊的线程饥饿情况,其中线程无法获得所需的所有资源。

2024-03-31 15:34:09 240

原创 Java线程:活锁

如果两个线程互相改变对方的结束条件,就可能导致双方谁也无法结束。活锁是指,线程没有发生阻塞,但依然执行不下去的情况。相当于一个抽水一个注水,水池永远不会空或者满。

2024-03-31 15:30:10 594

原创 Java多线程:定位死锁

检测死锁可以使用jconsole工具,或使用jps定位进程id,再用jstack定位死锁。

2024-03-31 15:22:54 356

原创 线程的状态转换

线程的状态转换涵盖了新建、就绪、运行、阻塞、等待、计时等待和终止等状态。以下是详细介绍:

2024-03-31 15:09:49 219

原创 线程: park & unpark(2)

与Object的wait & notify相比。

2024-03-26 15:43:48 289

原创 线程: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

原创 Java中Wait-Ify-api介绍

它们都是线程之间进行协作的手段,都属于Object对象的方法。首先必须获得此对象的锁,才能调用此方法。

2024-03-25 17:28:15 132

原创 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

原创 Leetcode454:四数相加II

这个题不同于三数和另一个四数相加,这是四个数组。所以我们想办法,把其办成两数相加。

2024-01-07 22:49:33 988 1

原创 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

原创 Leetcode438. 找到字符串中所有字母异位词

【代码】Leetcode438. 找到字符串中所有字母异位词。

2024-01-03 21:29:09 687 1

原创 Leetcode24:两两交换链表中的节点

【代码】Leetcode:两两交换链表中的节点。

2023-12-29 22:09:53 631 1

原创 Leetcode-142:环形链表II

这道题目,不仅考察对链表的操作,而且还需要一些数学运算。

2023-12-27 10:35:22 520 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++文档(一些问题的解决方法)

主要是设计无人机蜂群网络仿真过程中,从初学OMNeT++软件到能灵活使用各种接口所遇到的各种问题,其中也从官方提供的手册中提取出较为常用的接口进行说明,提供一些实用的接口使用方法,最后将其总结成文档 github链接:https://github.com/wangrongwei/omnetpp_primer 我只是搬运工

2023-06-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除