From b9761e988fdee513d5eb95d77a218925ed0a02cd Mon Sep 17 00:00:00 2001 From: fybug <1006291762@qq.com> Date: Thu, 22 May 2025 13:38:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9E=B6=E6=9E=84=E4=BD=BF?= =?UTF-8?q?=E5=85=B6=E6=9B=B4=E5=AE=B9=E6=98=93=E7=BB=B4=E6=8A=A4=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + build.gradle | 7 +- jar/PDConcurrent_bin.jar | Bin 21042 -> 27050 bytes jar/PDConcurrent_sources.jar | Bin 18618 -> 23648 bytes .../java/fybug/nulll/pdconcurrent/SyLock.java | 16 +- .../java/fybug/nulll/pdconcurrent/i/Lock.java | 49 +---- .../fybug/nulll/pdconcurrent/i/ReadLock.java | 60 ++++++ .../nulll/pdconcurrent/i/ReadWriteLock.java | 203 ----------------- .../fybug/nulll/pdconcurrent/i/TryLock.java | 45 +--- .../nulll/pdconcurrent/i/TryReadLock.java | 61 ++++++ .../pdconcurrent/i/TryReadWriteLock.java | 204 ------------------ .../nulll/pdconcurrent/i/TryWriteLock.java | 61 ++++++ .../fybug/nulll/pdconcurrent/i/WriteLock.java | 60 ++++++ .../nulll/pdconcurrent/i/package-info.java | 2 +- .../pdconcurrent/i/simple/LockSimple.java | 36 ++++ .../pdconcurrent/i/simple/ReadLockSimple.java | 35 +++ .../pdconcurrent/i/simple/TryLockSimple.java | 36 ++++ .../i/simple/TryReadLockSimple.java | 35 +++ .../i/simple/TryWriteLockSimple.java | 35 +++ .../i/simple/WriteLockSimple.java | 35 +++ .../pdconcurrent/i/simple/package-info.java | 9 + .../fybug/nulll/pdconcurrent/lock/RWLock.java | 2 +- .../nulll/pdconcurrent/package-info.java | 2 +- 23 files changed, 486 insertions(+), 509 deletions(-) create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/ReadWriteLock.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/TryReadWriteLock.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/simple/package-info.java diff --git a/README.md b/README.md index 6b083dc..4f957a7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ +

Icon +

# PDConcurrent diff --git a/build.gradle b/build.gradle index 7b26077..0a57b75 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ tasks.withType(JavaCompile).configureEach { } group 'fybug.nulll' -version = '0.1.0' +version = '0.1.3' java { toolchain { @@ -53,12 +53,13 @@ dependencies { // lombok testCompileOnly "org.projectlombok:lombok:+" testAnnotationProcessor "org.projectlombok:lombok:+" - testRuntimeOnly "org.junit.jupiter:junit-jupiter:5.12.0+" + testImplementation platform('org.junit:junit-bom:5.10.0') + testRuntimeOnly "org.junit.jupiter:junit-jupiter:5.12.0-RC2" } test { dependencies { - testImplementation "org.junit.jupiter:junit-jupiter:5.12.0+" + testImplementation "org.junit.jupiter:junit-jupiter:5.12.0-RC2" } useJUnitPlatform() } diff --git a/jar/PDConcurrent_bin.jar b/jar/PDConcurrent_bin.jar index 7c201907b4d9571e7718389e537db8c357499f93..110ed946a8e69be780d0c311d65e7ae7948dd92d 100644 GIT binary patch delta 12501 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 a%@9bSu7q+w4FCY){V8-mx+TSjyZ-~mGGChj diff --git a/jar/PDConcurrent_sources.jar b/jar/PDConcurrent_sources.jar index e3154d1e5af5524fde7b237cd5877ad67a2b35db..e75492de20527190730270db4095627637c8c2a4 100644 GIT binary patch delta 14095 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 diff --git a/src/main/java/fybug/nulll/pdconcurrent/SyLock.java b/src/main/java/fybug/nulll/pdconcurrent/SyLock.java index 32216c4..e21646b 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/SyLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/SyLock.java @@ -1,7 +1,9 @@ package fybug.nulll.pdconcurrent; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.i.ReadWriteLock; -import fybug.nulll.pdconcurrent.i.TryReadWriteLock; +import fybug.nulll.pdconcurrent.i.simple.ReadLockSimple; +import fybug.nulll.pdconcurrent.i.simple.TryReadLockSimple; +import fybug.nulll.pdconcurrent.i.simple.TryWriteLockSimple; +import fybug.nulll.pdconcurrent.i.simple.WriteLockSimple; import fybug.nulll.pdconcurrent.lock.ObjLock; import fybug.nulll.pdconcurrent.lock.RWLock; import fybug.nulll.pdconcurrent.lock.ReLock; @@ -9,7 +11,7 @@ import jakarta.validation.constraints.NotNull; /** *

并发管理.

- * 通过传入回调的方式隐藏内部的并发管理方法,并支持复用内部的try块,通过传入的回调插入到catch,finally块中执行
+ * 通过传入回调的方式隐藏内部的并发管理方法,并支持复用内部的 try 块,通过传入的回调插入到 catch,finally 块中执行
* {@code lock()}方法用于根据传入的{@link LockType}申请不同的锁类型进行执行
* {@code read()}方法用于使用读锁执行,{@code write()}用于使用写锁执行,只有在使用读写锁实现{@link RWLock}才有区别。其余实现两个之间无区别
* {@code trylock()}类型的方法为尝试获取锁的实现,这意味着并不是一定能获取到锁,但也意味着不需要等待
@@ -18,11 +20,12 @@ import jakarta.validation.constraints.NotNull; * 使用 {@code new**Lock()} 的方法获取不同并发管理的实例
* * @author fybug - * @version 0.1.2 + * @version 0.1.3 * @since PDConcurrent 0.0.1 */ +@SuppressWarnings("unused") public -interface SyLock extends ReadWriteLock, TryReadWriteLock { +interface SyLock extends ReadLockSimple, WriteLockSimple, TryReadLockSimple, TryWriteLockSimple { /** * 获取传统并发实现 * @@ -30,7 +33,6 @@ interface SyLock extends ReadWriteLock, TryReadWriteLock { * * @see ObjLock */ - @SuppressWarnings("unused") @NotNull static ObjLock newObjLock() { return new ObjLock(); } @@ -42,7 +44,6 @@ interface SyLock extends ReadWriteLock, TryReadWriteLock { * * @see ReLock */ - @SuppressWarnings("unused") @NotNull static ReLock newReLock() { return new ReLock(); } @@ -54,7 +55,6 @@ interface SyLock extends ReadWriteLock, TryReadWriteLock { * * @see RWLock */ - @SuppressWarnings("unused") @NotNull static RWLock newRWLock() { return new RWLock(); } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java b/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java index 7c5a94f..de52725 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java @@ -10,15 +10,16 @@ import jakarta.validation.constraints.NotNull; /** *

基础锁管理.

- * 通过传入回调的方式隐藏内部的并发管理方法,并支持复用内部的try块,通过传入的回调插入到catch,finally块中执行
- * {@code lock()}方法用于根据传入的{@link LockType}申请不同的锁类型进行执行
+ * 通过传入回调的方式隐藏内部的并发管理方法,并支持复用内部的 try 块,通过传入的回调插入到 catch,finally 块中执行
+ * {@code lock()} 方法用于根据传入的 {@link LockType} 申请不同的锁类型进行执行
* 有可抛出异常的方法变体,可在传入的接口中抛出异常 * * @author fybug - * @version 0.0.1 + * @version 0.0.2 * @see LockType * @since i 0.0.1 */ +public interface Lock { /** * 使用锁执行指定回调 @@ -44,11 +45,6 @@ interface Lock { * 使用锁执行指定回调 *

* {@link #lock(LockType, trySupplier, Function, Function)}的无返回变体 - * - * @param lockType 锁类型 - * @param run 执行的回调 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调 */ default void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Consumer catchby, @@ -85,33 +81,10 @@ interface Lock { */ R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function finaby) throws Exception; - /** - * 使用锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function)}的简易变体 - * - * @param lockType 锁类型 - * @param run 带返回的回调 - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R lock(@NotNull LockType lockType, @NotNull trySupplier run) throws Exception - { return lock(lockType, run, null); } - /** * 使用锁执行指定回调 *

* {@link #lock(LockType, trySupplier, Function)}的无返回变体 - * - * @param lockType 锁类型 - * @param run 执行的回调 - * @param finaby 进入finally块后的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 */ default void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception { @@ -123,18 +96,4 @@ interface Lock { return null; }); } - - /** - * 使用锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Runnable)}的简易变体 - * - * @param lockType 锁类型 - * @param run 执行的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void lock(@NotNull LockType lockType, @NotNull tryRunnable run) throws Exception - { lock(lockType, run, null); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java new file mode 100644 index 0000000..1824694 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java @@ -0,0 +1,60 @@ +package fybug.nulll.pdconcurrent.i; +import java.util.function.Consumer; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryRunnable; +import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdconcurrent.i.simple.LockSimple; +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; + +/** + *

并发管理读锁支持拓展.

+ * {@link Lock}的拓展,增加 {@code read()} 类方法用于隐藏 {@link LockType} 参数 + * + * @author fybug + * @version 0.0.1 + * @see LockType#READ + * @see Lock + * @since i 0.0.2 + */ +@SuppressWarnings("unused") +public +interface ReadLock extends LockSimple { + /** + * 使用读锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function, Function)}指定读锁的变种 + */ + default + R read(@NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) + { return lock(LockType.READ, run, catchby, finaby); } + + /** + * 使用读锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable, Consumer, Runnable)}指定读锁的变种 + */ + default + void read(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) + { lock(LockType.READ, run, catchby, finaby); } + + /** + * 使用读锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function)}指定读锁的变种 + */ + default + R read(@NotNull trySupplier run, @Nullable Function finaby) throws Exception + { return lock(LockType.READ, run, finaby); } + + /** + * 使用读锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable, Runnable)}指定读锁的变种 + */ + default + void read(@NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception + { lock(LockType.READ, run, finaby); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/ReadWriteLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/ReadWriteLock.java deleted file mode 100644 index 63a7d1e..0000000 --- a/src/main/java/fybug/nulll/pdconcurrent/i/ReadWriteLock.java +++ /dev/null @@ -1,203 +0,0 @@ -package fybug.nulll.pdconcurrent.i; -import java.util.function.Consumer; -import java.util.function.Function; - -import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.fun.tryRunnable; -import fybug.nulll.pdconcurrent.fun.trySupplier; -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; - -/** - *

并发管理读写支持拓展.

- * {@link Lock}的拓展,增加{@code read()}、{@code write()}类方法用于隐藏{@link LockType}参数 - * - * @author fybug - * @version 0.0.1 - * @see LockType#READ - * @see LockType#WRITE - * @see Lock - * @since i 0.0.1 - */ -@SuppressWarnings("unused") -public -interface ReadWriteLock extends Lock { - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function, Function)}指定读锁的变种 - * - * @param run 带返回的回调 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调,传入前两个回调的返回值 - * @param 要返回的数据类型 - * - * @return 回调返回的内容 - */ - default - R read(@NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) - { return lock(LockType.READ, run, catchby, finaby); } - - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Consumer, Runnable)}指定读锁的变种 - * - * @param run 执行的回调 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调 - */ - default - void read(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) - { lock(LockType.READ, run, catchby, finaby); } - - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function)}指定读锁的变种 - * - * @param run 带返回的回调 - * @param finaby 进入finally块后的回调,传入前一个回调的返回值,遇到异常传入{@code null} - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R read(@NotNull trySupplier run, @Nullable Function finaby) throws Exception - { return lock(LockType.READ, run, finaby); } - - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier)}指定读锁的变种 - * - * @param run 带返回的回调 - * @param 要返回的数据类型 - * - * @return 回调返回的内容 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R read(@NotNull trySupplier run) throws Exception - { return lock(LockType.READ, run); } - - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Runnable)}指定读锁的变种 - * - * @param run 执行的回调 - * @param finaby 进入finally块后的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void read(@NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception - { lock(LockType.READ, run, finaby); } - - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable)}指定读锁的变种 - * - * @param run 执行的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void read(@NotNull tryRunnable run) throws Exception - { lock(LockType.READ, run); } - - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function, Function)}指定写锁的变种 - * - * @param run 带返回的回调 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调,传入前两个回调的返回值 - * @param 要返回的数据类型 - * - * @return 回调返回的内容 - */ - default - R write(@NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) - { return lock(LockType.WRITE, run, catchby, finaby); } - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Consumer, Runnable)}指定写锁的变种 - * - * @param run 执行的回调 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调 - */ - default - void write(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) - { lock(LockType.WRITE, run, catchby, finaby); } - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function)}指定写锁的变种 - * - * @param run 带返回的回调 - * @param finaby 进入finally块后的回调,传入前一个回调的返回值,遇到异常传入{@code null} - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R write(@NotNull trySupplier run, @Nullable Function finaby) throws Exception - { return lock(LockType.WRITE, run, finaby); } - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier)}指定写锁的变种 - * - * @param run 带返回的回调 - * @param 要返回的数据类型 - * - * @return 回调返回的内容 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R write(@NotNull trySupplier run) throws Exception - { return lock(LockType.WRITE, run); } - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Runnable)}指定写锁的变种 - * - * @param run 执行的回调 - * @param finaby 进入finally块后的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void write(@NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception - { lock(LockType.WRITE, run, finaby); } - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable)}指定写锁的变种 - * - * @param run 执行的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void write(@NotNull tryRunnable run) throws Exception - { lock(LockType.WRITE, run); } -} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java index b6d120f..73c6043 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java @@ -14,9 +14,10 @@ import jakarta.validation.constraints.NotNull; * {@link Lock}的拓展,增加{@code trylock()}类方法用于适配需要立刻判断是否获取到锁并即刻往下执行的情况 * * @author fybug - * @version 0.0.1 + * @version 0.0.2 * @since i 0.0.1 */ +public interface TryLock { /** * 尝试使用锁执行指定回调 @@ -44,11 +45,6 @@ interface TryLock { * 尝试使用锁执行指定回调 *

* {@link #trylock(LockType, tryFunction, Function, Function)}的无返回变体 - * - * @param lockType 锁类型 - * @param run 执行的回调,传入参数是否获取到锁 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调 */ default void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, @Nullable Consumer catchby, @@ -87,33 +83,10 @@ interface TryLock { R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function finaby) throws Exception; - /** - * 尝试使用锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function)}的简易变体 - * - * @param lockType 锁类型 - * @param run 带返回的回调,传入参数是否获取到锁 - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R trylock(@NotNull LockType lockType, @NotNull tryFunction run) throws Exception - { return trylock(lockType, run, null); } - /** * 尝试使用锁执行指定回调 *

* {@link #trylock(LockType, tryFunction, Function)}的无返回变体 - * - * @param lockType 锁类型 - * @param run 执行的回调,传入参数是否获取到锁 - * @param finaby 进入finally块后的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 */ default void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception { @@ -125,18 +98,4 @@ interface TryLock { return null; }); } - - /** - * 尝试使用锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Runnable)}的简易变体 - * - * @param lockType 锁类型 - * @param run 带返回的回调,传入参数是否获取到锁 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void trylock(@NotNull LockType lockType, @NotNull tryConsumer run) throws Exception - { trylock(lockType, run, null); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java new file mode 100644 index 0000000..2f8b22d --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java @@ -0,0 +1,61 @@ +package fybug.nulll.pdconcurrent.i; +import java.util.function.Consumer; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryConsumer; +import fybug.nulll.pdconcurrent.fun.tryFunction; +import fybug.nulll.pdconcurrent.i.simple.TryLockSimple; +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; + +/** + *

TryLock 读锁支持拓展.

+ * {@link TryLock}的拓展,增加 {@code tryread()} 类方法用于隐藏 {@link LockType} 参数 + * + * @author fybug + * @version 0.0.1 + * @see LockType#READ + * @see TryLock + * @since i 0.0.2 + */ +@SuppressWarnings("unused") +public +interface TryReadLock extends TryLockSimple { + /** + * 尝试使用读锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function, Function)}指定读锁的变种 + */ + default + R tryread(@NotNull tryFunction run, @Nullable Function catchby, + @Nullable Function finaby) + { return trylock(LockType.READ, run, catchby, finaby); } + + /** + * 尝试使用读锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer, Consumer, Runnable)}指定读锁的变种 + */ + default + void tryread(@NotNull tryConsumer run, @Nullable Consumer catchby, @Nullable Runnable finaby) + { trylock(LockType.READ, run, catchby, finaby); } + + /** + * 尝试使用读锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function)}指定读锁的变种 + */ + default + R tryread(@NotNull tryFunction run, @Nullable Function finaby) throws Exception + { return trylock(LockType.READ, run, finaby); } + + /** + * 尝试使用读锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer, Runnable)}指定读锁的变种 + */ + default + void tryread(@NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception + { trylock(LockType.READ, run, finaby); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadWriteLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadWriteLock.java deleted file mode 100644 index a3ff383..0000000 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadWriteLock.java +++ /dev/null @@ -1,204 +0,0 @@ -package fybug.nulll.pdconcurrent.i; -import java.util.function.Consumer; -import java.util.function.Function; - -import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.fun.tryConsumer; -import fybug.nulll.pdconcurrent.fun.tryFunction; -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; - -/** - *

TryLock 读写支持拓展.

- * {@link TryLock}的拓展,增加{@code tryread()}、{@code trywrite()}类方法用于隐藏{@link LockType}参数 - * - * @author fybug - * @version 0.0.1 - * @see LockType#READ - * @see LockType#WRITE - * @see TryLock - * @since i 0.0.1 - */ -@SuppressWarnings("unused") -public -interface TryReadWriteLock extends TryLock { - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function, Function)}指定读锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调,传入前两个回调的返回值 - * @param 要返回的数据类型 - * - * @return 回调返回的内容 - */ - default - R tryread(@NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby) - { return trylock(LockType.READ, run, catchby, finaby); } - - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Consumer, Runnable)}指定读锁的变种 - * - * @param run 执行的回调,传入参数是否获取到锁 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调 - */ - default - void tryread(@NotNull tryConsumer run, @Nullable Consumer catchby, @Nullable Runnable finaby) - { trylock(LockType.READ, run, catchby, finaby); } - - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function)}指定读锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * @param finaby 进入finally块后的回调,传入前两个回调的返回值,遇到异常传入{@code null} - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R tryread(@NotNull tryFunction run, @Nullable Function finaby) throws Exception - { return trylock(LockType.READ, run, finaby); } - - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction)}指定读锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R tryread(@NotNull tryFunction run) throws Exception - { return trylock(LockType.READ, run); } - - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Runnable)}指定读锁的变种 - * - * @param run 执行的回调,传入参数是否获取到锁 - * @param finaby 进入finally块后的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void tryread(@NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception - { trylock(LockType.READ, run, finaby); } - - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer)}指定读锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void tryread(@NotNull tryConsumer run) throws Exception - { trylock(LockType.READ, run); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function, Function)}指定写锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调,传入前两个回调的返回值 - * @param 要返回的数据类型 - * - * @return 回调返回的内容 - */ - default - R trywrite(@NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby) - { return trylock(LockType.WRITE, run, catchby, finaby); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Consumer, Runnable)}指定写锁的变种 - * - * @param run 执行的回调,传入参数是否获取到锁 - * @param catchby 进入catch块后的回调,传入当前异常 - * @param finaby 进入finally块后的回调 - */ - default - void trywrite(@NotNull tryConsumer run, @Nullable Consumer catchby, @Nullable Runnable finaby) - { trylock(LockType.WRITE, run, catchby, finaby); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function)}指定写锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * @param finaby 进入finally块后的回调,传入前两个回调的返回值,遇到异常传入{@code null} - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R trywrite(@NotNull tryFunction run, @Nullable Function finaby) throws Exception - { return trylock(LockType.WRITE, run, finaby); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction)}指定写锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * @param 要返回的数据类型 - * - * @return 回调返回的内容,遇到异常不返回 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - R trywrite(@NotNull tryFunction run) throws Exception - { return trylock(LockType.WRITE, run); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Runnable)}指定写锁的变种 - * - * @param run 执行的回调,传入参数是否获取到锁 - * @param finaby 进入finally块后的回调 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void trywrite(@NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception - { trylock(LockType.WRITE, run, finaby); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer)}指定写锁的变种 - * - * @param run 带返回的回调,传入参数是否获取到锁 - * - * @throws Exception 异常类型根据实际运行时回调抛出决定 - */ - default - void trywrite(@NotNull tryConsumer run) throws Exception - { trylock(LockType.WRITE, run); } -} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java new file mode 100644 index 0000000..75f55b7 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java @@ -0,0 +1,61 @@ +package fybug.nulll.pdconcurrent.i; +import java.util.function.Consumer; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryConsumer; +import fybug.nulll.pdconcurrent.fun.tryFunction; +import fybug.nulll.pdconcurrent.i.simple.TryLockSimple; +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; + +/** + *

TryLock 写锁支持拓展.

+ * {@link TryLock}的拓展,增加 {@code trywrite()} 类方法用于隐藏 {@link LockType} 参数 + * + * @author fybug + * @version 0.0.1 + * @see LockType#WRITE + * @see TryLock + * @since i 0.0.2 + */ +@SuppressWarnings("unused") +public +interface TryWriteLock extends TryLockSimple { + /** + * 尝试使用写锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function, Function)}指定写锁的变种 + */ + default + R trywrite(@NotNull tryFunction run, @Nullable Function catchby, + @Nullable Function finaby) + { return trylock(LockType.WRITE, run, catchby, finaby); } + + /** + * 尝试使用写锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer, Consumer, Runnable)}指定写锁的变种 + */ + default + void trywrite(@NotNull tryConsumer run, @Nullable Consumer catchby, @Nullable Runnable finaby) + { trylock(LockType.WRITE, run, catchby, finaby); } + + /** + * 尝试使用写锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function)}指定写锁的变种 + */ + default + R trywrite(@NotNull tryFunction run, @Nullable Function finaby) throws Exception + { return trylock(LockType.WRITE, run, finaby); } + + /** + * 尝试使用写锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer, Runnable)}指定写锁的变种 + */ + default + void trywrite(@NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception + { trylock(LockType.WRITE, run, finaby); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java new file mode 100644 index 0000000..5b6f574 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java @@ -0,0 +1,60 @@ +package fybug.nulll.pdconcurrent.i; +import java.util.function.Consumer; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryRunnable; +import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdconcurrent.i.simple.LockSimple; +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; + +/** + *

并发管理写锁支持拓展.

+ * {@link Lock}的拓展,增加 {@code write()} 类方法用于隐藏 {@link LockType} 参数 + * + * @author fybug + * @version 0.0.1 + * @see LockType#WRITE + * @see Lock + * @since i 0.0.2 + */ +@SuppressWarnings("unused") +public +interface WriteLock extends LockSimple { + /** + * 使用写锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function, Function)}指定写锁的变种 + */ + default + R write(@NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) + { return lock(LockType.WRITE, run, catchby, finaby); } + + /** + * 使用写锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable, Consumer, Runnable)}指定写锁的变种 + */ + default + void write(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) + { lock(LockType.WRITE, run, catchby, finaby); } + + /** + * 使用写锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function)}指定写锁的变种 + */ + default + R write(@NotNull trySupplier run, @Nullable Function finaby) throws Exception + { return lock(LockType.WRITE, run, finaby); } + + /** + * 使用写锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable, Runnable)}指定写锁的变种 + */ + default + void write(@NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception + { lock(LockType.WRITE, run, finaby); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/package-info.java b/src/main/java/fybug/nulll/pdconcurrent/i/package-info.java index 6ced81b..0449558 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/package-info.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/package-info.java @@ -3,7 +3,7 @@ * 提供基础功能接口与部分功能框架实现 * * @author fybug - * @version 0.0.1 + * @version 0.0.2 * @since PDConcurrent 0.1.2 */ package fybug.nulll.pdconcurrent.i; \ No newline at end of file diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java new file mode 100644 index 0000000..639d291 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java @@ -0,0 +1,36 @@ +package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryRunnable; +import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdconcurrent.i.Lock; +import jakarta.validation.constraints.NotNull; + +/** + *

基础锁管理简易拓展.

+ * + * @author fybug + * @version 0.0.1 + * @since simple 0.0.1 + */ +public +interface LockSimple extends Lock { + /** + * 使用锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function)}的简易变体 + */ + default + R lock(@NotNull LockType lockType, @NotNull trySupplier run) throws Exception + { return lock(lockType, run, null); } + + /** + * 使用锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable, Runnable)}的简易变体 + */ + default + void lock(@NotNull LockType lockType, @NotNull tryRunnable run) throws Exception + { lock(lockType, run, null); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java new file mode 100644 index 0000000..8515240 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java @@ -0,0 +1,35 @@ +package fybug.nulll.pdconcurrent.i.simple; +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryRunnable; +import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdconcurrent.i.ReadLock; +import jakarta.validation.constraints.NotNull; + +/** + *

并发读锁支持简易拓展.

+ * + * @author fybug + * @version 0.0.1 + * @since simple 0.0.1 + */ +@SuppressWarnings("unused") +public +interface ReadLockSimple extends ReadLock { + /** + * 使用读锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier)}指定读锁的变种 + */ + default + R read(@NotNull trySupplier run) throws Exception + { return lock(LockType.READ, run); } + + /** + * 使用读锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable)}指定读锁的变种 + */ + default + void read(@NotNull tryRunnable run) throws Exception + { lock(LockType.READ, run); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java new file mode 100644 index 0000000..8e8976a --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java @@ -0,0 +1,36 @@ +package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryConsumer; +import fybug.nulll.pdconcurrent.fun.tryFunction; +import fybug.nulll.pdconcurrent.i.TryLock; +import jakarta.validation.constraints.NotNull; + +/** + *

TryLock 简易拓展.

+ * + * @author fybug + * @version 0.0.1 + * @since simple 0.0.1 + */ +public +interface TryLockSimple extends TryLock { + /** + * 尝试使用锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function)}的简易变体 + */ + default + R trylock(@NotNull LockType lockType, @NotNull tryFunction run) throws Exception + { return trylock(lockType, run, null); } + + /** + * 尝试使用锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer, Runnable)}的简易变体 + */ + default + void trylock(@NotNull LockType lockType, @NotNull tryConsumer run) throws Exception + { trylock(lockType, run, null); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java new file mode 100644 index 0000000..fd495f2 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java @@ -0,0 +1,35 @@ +package fybug.nulll.pdconcurrent.i.simple; +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryConsumer; +import fybug.nulll.pdconcurrent.fun.tryFunction; +import fybug.nulll.pdconcurrent.i.TryReadLock; +import jakarta.validation.constraints.NotNull; + +/** + *

TryLock 读锁支持简易拓展.

+ * + * @author fybug + * @version 0.0.1 + * @since simple 0.0.1 + */ +@SuppressWarnings("unused") +public +interface TryReadLockSimple extends TryReadLock { + /** + * 尝试使用读锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction)}指定读锁的变种 + */ + default + R tryread(@NotNull tryFunction run) throws Exception + { return trylock(LockType.READ, run); } + + /** + * 尝试使用读锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer)}指定读锁的变种 + */ + default + void tryread(@NotNull tryConsumer run) throws Exception + { trylock(LockType.READ, run); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java new file mode 100644 index 0000000..9146936 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java @@ -0,0 +1,35 @@ +package fybug.nulll.pdconcurrent.i.simple; +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryConsumer; +import fybug.nulll.pdconcurrent.fun.tryFunction; +import fybug.nulll.pdconcurrent.i.TryWriteLock; +import jakarta.validation.constraints.NotNull; + +/** + *

TryLock 写锁支持简易拓展.

+ * + * @author fybug + * @version 0.0.1 + * @since simple 0.0.1 + */ +@SuppressWarnings("unused") +public +interface TryWriteLockSimple extends TryWriteLock { + /** + * 尝试使用写锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction)}指定写锁的变种 + */ + default + R trywrite(@NotNull tryFunction run) throws Exception + { return trylock(LockType.WRITE, run); } + + /** + * 尝试使用写锁执行指定回调 + *

+ * {@link #trylock(LockType, tryConsumer)}指定写锁的变种 + */ + default + void trywrite(@NotNull tryConsumer run) throws Exception + { trylock(LockType.WRITE, run); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java new file mode 100644 index 0000000..fbaa870 --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java @@ -0,0 +1,35 @@ +package fybug.nulll.pdconcurrent.i.simple; +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.fun.tryRunnable; +import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdconcurrent.i.WriteLock; +import jakarta.validation.constraints.NotNull; + +/** + *

并发写锁支持简易拓展.

+ * + * @author fybug + * @version 0.0.1 + * @since simple 0.0.1 + */ +@SuppressWarnings("unused") +public +interface WriteLockSimple extends WriteLock { + /** + * 使用写锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier)}指定写锁的变种 + */ + default + R write(@NotNull trySupplier run) throws Exception + { return lock(LockType.WRITE, run); } + + /** + * 使用写锁执行指定回调 + *

+ * {@link #lock(LockType, tryRunnable)}指定写锁的变种 + */ + default + void write(@NotNull tryRunnable run) throws Exception + { lock(LockType.WRITE, run); } +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/package-info.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/package-info.java new file mode 100644 index 0000000..9b0b93a --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/package-info.java @@ -0,0 +1,9 @@ +/** + *

接口简易拓展包.

+ * 提供部分方法简易变体的拓展接口 + * + * @author fybug + * @version 0.0.1 + * @since PDConcurrent 0.1.3 + */ +package fybug.nulll.pdconcurrent.i.simple; \ No newline at end of file diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java b/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java index ea25e36..4845fad 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java @@ -195,7 +195,7 @@ class RWLock extends AbstractSyLock { // 更新对应锁计数 if ( lockType == LockType.READ ) READ_LOCK_COUNTER.getAndIncrement(); - else //noinspection ConstantValue + else // noinspection ConstantValue if ( lockType == LockType.WRITE ) WRITE_LOCK_COUNTER.getAndIncrement(); } else if ( l.isEmpty() ) { diff --git a/src/main/java/fybug/nulll/pdconcurrent/package-info.java b/src/main/java/fybug/nulll/pdconcurrent/package-info.java index bcd81f6..53f2a46 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/package-info.java +++ b/src/main/java/fybug/nulll/pdconcurrent/package-info.java @@ -5,7 +5,7 @@ * 附带{@code try***}的功能接口包{@link fybug.nulll.pdconcurrent.fun},在java原有的功能接口的基础上允许抛出异常 * * @author fybug - * @version 0.1.2 + * @version 0.1.3 * @since JDK 23+ */ package fybug.nulll.pdconcurrent; \ No newline at end of file -- Gitee