From ee0ff6ae3ceb14ca0abb8d3c25b08aee8364d7c5 Mon Sep 17 00:00:00 2001 From: fybug <1006291762@qq.com> Date: Sun, 8 Jun 2025 11:07:08 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8F=90=E5=8F=96=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++-- build.gradle | 38 +++++++-- jar/PDConcurrent.jar | Bin 0 -> 22361 bytes jar/PDConcurrent_all.jar | Bin 0 -> 43921 bytes jar/PDConcurrent_bin.jar | Bin 27050 -> 24260 bytes jar/PDConcurrent_sources.jar | Bin 23648 -> 20997 bytes lib/PDUtilFunctionExpand_bin.jar | Bin 0 -> 2573 bytes .../nulll/pdconcurrent/fun/package-info.java | 8 -- .../nulll/pdconcurrent/fun/tryConsumer.java | 50 ------------ .../nulll/pdconcurrent/fun/tryFunction.java | 41 ---------- .../nulll/pdconcurrent/fun/tryRunnable.java | 75 ------------------ .../nulll/pdconcurrent/fun/trySupplier.java | 42 ---------- .../nulll/pdconcurrent/i/AbstractSyLock.java | 32 ++++---- .../java/fybug/nulll/pdconcurrent/i/Lock.java | 23 +++--- .../fybug/nulll/pdconcurrent/i/ReadLock.java | 13 +-- .../fybug/nulll/pdconcurrent/i/TryLock.java | 24 +++--- .../nulll/pdconcurrent/i/TryReadLock.java | 15 ++-- .../nulll/pdconcurrent/i/TryWriteLock.java | 15 ++-- .../fybug/nulll/pdconcurrent/i/WriteLock.java | 13 +-- .../pdconcurrent/i/simple/LockSimple.java | 8 +- .../pdconcurrent/i/simple/ReadLockSimple.java | 8 +- .../pdconcurrent/i/simple/TryLockSimple.java | 8 +- .../i/simple/TryReadLockSimple.java | 8 +- .../i/simple/TryWriteLockSimple.java | 8 +- .../i/simple/WriteLockSimple.java | 8 +- .../nulll/pdconcurrent/lock/ObjLock.java | 28 ++++--- .../nulll/pdconcurrent/package-info.java | 3 +- 27 files changed, 154 insertions(+), 329 deletions(-) create mode 100644 jar/PDConcurrent.jar create mode 100644 jar/PDConcurrent_all.jar create mode 100644 lib/PDUtilFunctionExpand_bin.jar delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/fun/package-info.java delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/fun/tryConsumer.java delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/fun/tryFunction.java delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/fun/tryRunnable.java delete mode 100644 src/main/java/fybug/nulll/pdconcurrent/fun/trySupplier.java diff --git a/README.md b/README.md index 4f957a7..e887932 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -

Icon -

# PDConcurrent @@ -9,10 +7,6 @@ ![Gradle 8.10.2](https://img.shields.io/badge/Gradle-8.10.2-04303b.svg "tool") ![Apache 2](https://img.shields.io/badge/license-Apache%202-blue.svg "License") -[//]: # (-- [Java Doc](https://apidoc.gitee.com/fybug/PDConcurrent) --) - -[//]: # (-- [项目主页](https://fybug.gitee.io/projectsby/PDConcurrent.html) --) - ------------------------------------------------------------------------------- ## 简介 @@ -125,12 +119,19 @@ void main(String[] args) { 请导入其 `jar` 文件,文件在 **发行版** 或项目的 **jar** 文件夹下可以找到 -> PDConcurrent_bin.jar 为编译包 +> PDConcurrent.jar 为不包含依赖库的包 +> +> PDConcurrent_bin.jar 为包含了依赖库的包 +> +> PDConcurrent_all.jar 为包含了依赖库与源码的包 > > PDConcurrent_sources.jar 为源码包 **发行版中可以看到全部版本
项目下的 jar 文件夹是当前最新的每夜版** +依赖的同系列项目 +- [PDConcurrent](https://github.com/fybug/PDUtilFunctionExpand) + 可通过 **WIKI** 或者 **doc文档** 深入学习本工具 ## 分支说明 diff --git a/build.gradle b/build.gradle index 0a57b75..418869b 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ tasks.withType(JavaCompile).configureEach { } group 'fybug.nulll' -version = '0.1.3' +version = '0.1.4' java { toolchain { @@ -82,15 +82,41 @@ tasks.withType(Jar).configureEach { } /** 编译包 */ -tasks.register('PDConcurrent_bin', Jar) { +tasks.register('build_by', Jar) { + archiveFileName = 'PDConcurrent.jar' + archiveClassifier = 'bin' + // 打包编译输出 + from sourceSets.main.output +} + +/** 编译包 */ +tasks.register('build_bin', Jar) { archiveFileName = 'PDConcurrent_bin.jar' archiveClassifier = 'bin' // 打包编译输出 from sourceSets.main.output + from { + // implementation 相关的引入解压并打包入新的jar中 + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } +} + +/** 源码包 */ +tasks.register('build_all', Jar) { + archiveFileName = 'PDConcurrent_all.jar' + archiveClassifier = 'all' + // 打包编译输出 + from sourceSets.main.output + // 打包源码 + from sourceSets.main.allSource + from { + // implementation 相关的引入解压并打包入新的jar中 + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } } /** 源码包 */ -tasks.register('PDConcurrent_sources', Jar) { +tasks.register('build_sources', Jar) { archiveFileName = 'PDConcurrent_sources.jar' archiveClassifier = 'sources' // 打包源码 @@ -98,6 +124,8 @@ tasks.register('PDConcurrent_sources', Jar) { } tasks.register('release') { - dependsOn PDConcurrent_bin - dependsOn PDConcurrent_sources + dependsOn build_by + dependsOn build_all + dependsOn build_bin + dependsOn build_sources } diff --git a/jar/PDConcurrent.jar b/jar/PDConcurrent.jar new file mode 100644 index 0000000000000000000000000000000000000000..8b170fceae9723c87638b06df6644f31a4528a40 GIT binary patch literal 22361 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 Yw@(XG@V7Szu`Oa-I_X&rJca@JAN8icTL1t6 literal 0 HcmV?d00001 diff --git a/jar/PDConcurrent_all.jar b/jar/PDConcurrent_all.jar new file mode 100644 index 0000000000000000000000000000000000000000..a70931962acc8576f6760c3a041a98eebaccc045 GIT binary patch literal 43921 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 literal 0 HcmV?d00001 diff --git a/jar/PDConcurrent_bin.jar b/jar/PDConcurrent_bin.jar index 110ed946a8e69be780d0c311d65e7ae7948dd92d..2e92440a21dccf66a3d344b8d1fcf2b78ae47e42 100644 GIT binary patch delta 17185 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 delta 19819 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 Kfe86=U;P(DK9g1e diff --git a/jar/PDConcurrent_sources.jar b/jar/PDConcurrent_sources.jar index e75492de20527190730270db4095627637c8c2a4..27e2bdbc77dc5c1013b350eae080f5ac3299e2cf 100644 GIT binary patch delta 12396 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 lDoKCI^E&0 传入的参数类型 - * - * @author fybug - * @version 0.0.2 - * @see Consumer - * @since fun 0.0.4 - */ -@SuppressWarnings("unused") -@FunctionalInterface -public -interface tryConsumer { - /** @see Consumer#accept(Object) */ - void accept(T t) throws Exception; - - /** @since 0.0.2 */ - @NotNull - default - tryConsumer andThen(@Nullable tryRunnable after) { - if ( after != null ) { - return t -> { - accept(t); - after.run(); - }; - } - return this; - } - - /** @since 0.0.2 */ - @NotNull - default - tryFunction andThen(@Nullable trySupplier after) { - if ( after != null ) { - return t -> { - accept(t); - return after.get(); - }; - } - return t -> { - accept(t); - return null; - }; - } -} diff --git a/src/main/java/fybug/nulll/pdconcurrent/fun/tryFunction.java b/src/main/java/fybug/nulll/pdconcurrent/fun/tryFunction.java deleted file mode 100644 index af64f16..0000000 --- a/src/main/java/fybug/nulll/pdconcurrent/fun/tryFunction.java +++ /dev/null @@ -1,41 +0,0 @@ -package fybug.nulll.pdconcurrent.fun; -import java.util.function.Function; - -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; - -/** - * @param 传入的参数类型 - * @param 返回的参数类型 - * - * @author fybug - * @version 0.0.2 - * @see Function - * @since fun 0.0.4 - */ -@SuppressWarnings("unused") -@FunctionalInterface -public -interface tryFunction { - /** @see Function#apply(Object) */ - R apply(T t) throws Exception; - - /** @since 0.0.2 */ - @NotNull - default - tryConsumer andThen(@Nullable tryConsumer after) { - if ( after != null ) - return t -> after.accept(apply(t)); - return this::apply; - } - - /** @since 0.0.2 */ - @NotNull - default - tryFunction andThen(@Nullable tryFunction after) { - if ( after != null ) - return t -> after.apply(apply(t)); - //noinspection unchecked - return (tryFunction) this; - } -} diff --git a/src/main/java/fybug/nulll/pdconcurrent/fun/tryRunnable.java b/src/main/java/fybug/nulll/pdconcurrent/fun/tryRunnable.java deleted file mode 100644 index 6733067..0000000 --- a/src/main/java/fybug/nulll/pdconcurrent/fun/tryRunnable.java +++ /dev/null @@ -1,75 +0,0 @@ -package fybug.nulll.pdconcurrent.fun; -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; - -/** - * @author fybug - * @version 0.0.2 - * @see Runnable - * @since fun 0.0.4 - */ -@SuppressWarnings("unused") -@FunctionalInterface -public -interface tryRunnable { - /** @see Runnable#run() */ - void run() throws Exception; - - /** @since 0.0.2 */ - @NotNull - default - tryRunnable andThen(@Nullable tryRunnable after) { - if ( after != null ) { - return () -> { - run(); - after.run(); - }; - } - return this; - } - - /** @since 0.0.2 */ - @NotNull - default - trySupplier andThen(@Nullable trySupplier after) { - if ( after != null ) { - return () -> { - run(); - return after.get(); - }; - } - return () -> { - run(); - return null; - }; - } - - /** @since 0.0.2 */ - @NotNull - default - tryRunnable andThen(@Nullable tryConsumer after) { - if ( after != null ) { - return () -> { - run(); - after.accept(null); - }; - } - return this; - } - - /** @since 0.0.2 */ - @NotNull - default - trySupplier andThen(@Nullable tryFunction after) { - if ( after != null ) { - return () -> { - run(); - return after.apply(null); - }; - } - return () -> { - run(); - return null; - }; - } -} diff --git a/src/main/java/fybug/nulll/pdconcurrent/fun/trySupplier.java b/src/main/java/fybug/nulll/pdconcurrent/fun/trySupplier.java deleted file mode 100644 index d59a835..0000000 --- a/src/main/java/fybug/nulll/pdconcurrent/fun/trySupplier.java +++ /dev/null @@ -1,42 +0,0 @@ -package fybug.nulll.pdconcurrent.fun; -import java.util.function.Supplier; - -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; - -/** - * @param 返回的参数类型 - * - * @author fybug - * @version 0.0.2 - * @see Supplier - * @since fun 0.0.4 - */ -@SuppressWarnings("unused") -@FunctionalInterface -public -interface trySupplier { - /** @see Supplier#get() */ - R get() throws Exception; - - /** @since 0.0.2 */ - @SuppressWarnings("unused") - @NotNull - default - tryRunnable andThen(@Nullable tryConsumer after) { - if ( after != null ) - return () -> after.accept(get()); - return this::get; - } - - /** @since 0.0.2 */ - @SuppressWarnings("unused") - @NotNull - default - trySupplier andThen(@Nullable tryFunction after) { - if ( after != null ) - return () -> after.apply(get()); - //noinspection unchecked - return (trySupplier) this; - } -} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java index f4dba53..430cd4c 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java @@ -3,8 +3,8 @@ import java.util.function.Function; import fybug.nulll.pdconcurrent.SyLock; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.fun.tryFunction; -import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdutilfunctionexpand.tryFunction; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -33,8 +33,8 @@ class AbstractSyLock implements SyLock { */ @Override public - R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function catchby, - @Nullable Function finaby) + R lock(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable Function catchby, @Nullable Function finaby) { R o = null; // 防止finally内的回调抛异常 @@ -44,10 +44,10 @@ class AbstractSyLock implements SyLock { lock(lockType); // 主要内容 o = run.get(); - } catch ( Exception e ) { + } catch ( Throwable e ) { // 异常处理 if ( catchby != null ) - o = catchby.apply(e); + o = catchby.apply((E) e); } finally { // 收尾 if ( finaby != null ) @@ -73,7 +73,9 @@ class AbstractSyLock implements SyLock { */ @Override public - R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function finaby) throws Exception { + R lock(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable Function finaby) throws E + { R o = null; // 防止finally内的回调抛异常 try { @@ -108,8 +110,8 @@ class AbstractSyLock implements SyLock { */ @Override public - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby) + R trylock(@NotNull LockType lockType, @NotNull tryFunction run, + @Nullable Function catchby, @Nullable Function finaby) { R o = null; // 防止finally内的回调抛异常 @@ -117,10 +119,10 @@ class AbstractSyLock implements SyLock { try { // 上锁 o = run.apply(trylock(lockType)); - } catch ( Exception e ) { + } catch ( Throwable e ) { // 异常处理 if ( catchby != null ) - o = catchby.apply(e); + o = catchby.apply((E) e); } finally { // 收尾 if ( finaby != null ) @@ -147,8 +149,8 @@ class AbstractSyLock implements SyLock { */ @Override public - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function finaby) - throws Exception + R trylock(@NotNull LockType lockType, @NotNull tryFunction run, + @Nullable Function finaby) throws E { R o = null; // 防止finally内的回调抛异常 @@ -172,11 +174,11 @@ class AbstractSyLock implements SyLock { * * @param lockType 锁类型 * - * @throws Exception 可能抛出的异常 + * @throws E 可能抛出的异常 * @implSpec 在此处实现上锁功能 */ protected abstract - void lock(@NotNull LockType lockType) throws Exception; + void lock(@NotNull LockType lockType) throws E; /** * 尝试上锁函数 diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java b/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java index de52725..1e7f174 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java @@ -3,8 +3,8 @@ 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.pdutilfunctionexpand.tryRunnable; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -38,8 +38,8 @@ interface Lock { * @implSpec 如果有传入 {@code finaby} 回调则返回值由{@code finaby}主导,传入{@code finaby}的值根据是否发生异常传入{@code run}的返回值或{@code catchby}的返回值
* 任意一个回调为空时直接穿透,使用上一个正确执行的值进行传递或者返回,传递值应默认为{@code null}用于应对{@code catchby}和{@code finaby}都为空但是发生了异常的情况 */ - R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function catchby, - @Nullable Function finaby); + R lock(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable Function catchby, @Nullable Function finaby); /** * 使用锁执行指定回调 @@ -47,13 +47,13 @@ interface Lock { * {@link #lock(LockType, trySupplier, Function, Function)}的无返回变体 */ default - void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Consumer catchby, - @Nullable Runnable finaby) + void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Consumer catchby, + @Nullable Runnable finaby) { lock(lockType, () -> { run.run(); return null; - }, catchby == null ? null : e -> { + }, catchby == null ? null : (E e) -> { catchby.accept(e); return null; }, finaby == null ? null : _ -> { @@ -75,11 +75,12 @@ interface Lock { * * @return 回调返回的内容,遇到异常不返回 * - * @throws Exception 异常类型根据实际运行时回调抛出决定 + * @throws E 异常类型根据实际运行时回调抛出决定 * @implSpec 如果有传入 {@code finaby} 回调则返回值由{@code finaby}主导,传入{@code finaby}的值根据是否发生异常传入{@code run}的返回值或{@code null}
* 任意一个回调为空时直接穿透,使用上一个正确执行的值进行传递或者返回,发生异常会执行{@code finaby}但是不会返回内容 */ - R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function finaby) throws Exception; + R lock(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable Function finaby) throws E; /** * 使用锁执行指定回调 @@ -87,7 +88,9 @@ interface Lock { * {@link #lock(LockType, trySupplier, Function)}的无返回变体 */ default - void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception { + void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Runnable finaby) + throws E + { lock(lockType, () -> { run.run(); return null; diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java index 1824694..18eab44 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java @@ -3,9 +3,9 @@ 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 fybug.nulll.pdutilfunctionexpand.tryRunnable; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -28,7 +28,8 @@ interface ReadLock extends LockSimple { * {@link #lock(LockType, trySupplier, Function, Function)}指定读锁的变种 */ default - R read(@NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) + R read(@NotNull trySupplier run, @Nullable Function catchby, + @Nullable Function finaby) { return lock(LockType.READ, run, catchby, finaby); } /** @@ -37,7 +38,7 @@ interface ReadLock extends LockSimple { * {@link #lock(LockType, tryRunnable, Consumer, Runnable)}指定读锁的变种 */ default - void read(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) + void read(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) { lock(LockType.READ, run, catchby, finaby); } /** @@ -46,7 +47,7 @@ interface ReadLock extends LockSimple { * {@link #lock(LockType, trySupplier, Function)}指定读锁的变种 */ default - R read(@NotNull trySupplier run, @Nullable Function finaby) throws Exception + R read(@NotNull trySupplier run, @Nullable Function finaby) throws E { return lock(LockType.READ, run, finaby); } /** @@ -55,6 +56,6 @@ interface ReadLock extends LockSimple { * {@link #lock(LockType, tryRunnable, Runnable)}指定读锁的变种 */ default - void read(@NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception + void read(@NotNull tryRunnable run, @Nullable Runnable finaby) throws E { lock(LockType.READ, run, finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java index 73c6043..855ce76 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java @@ -4,8 +4,8 @@ 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.pdutilfunctionexpand.tryConsumer; +import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -38,8 +38,8 @@ interface TryLock { * 如果有传入 {@code finaby} 回调则返回值由{@code finaby}主导,传入{@code finaby}的值根据是否发生异常传入{@code run}的返回值或{@code catchby}的返回值
* 任意一个回调为空时直接穿透,使用上一个正确执行的值进行传递或者返回,传递值应默认为{@code null}用于应对{@code catchby}和{@code finaby}都为空但是发生了异常的情况 */ - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby); + R trylock(@NotNull LockType lockType, @NotNull tryFunction run, + @Nullable Function catchby, @Nullable Function finaby); /** * 尝试使用锁执行指定回调 @@ -47,13 +47,13 @@ interface TryLock { * {@link #trylock(LockType, tryFunction, Function, Function)}的无返回变体 */ default - void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, @Nullable Consumer catchby, - @Nullable Runnable finaby) + void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, + @Nullable Consumer catchby, @Nullable Runnable finaby) { trylock(lockType, b -> { run.accept(b); return null; - }, catchby == null ? null : e -> { + }, catchby == null ? null : (E e) -> { catchby.accept(e); return null; }, finaby == null ? null : _ -> { @@ -75,13 +75,13 @@ interface TryLock { * * @return 回调返回的内容,遇到异常不返回 * - * @throws Exception 异常类型根据实际运行时回调抛出决定 + * @throws E 异常类型根据实际运行时回调抛出决定 * @implSpec 该方法实现时应尽量使用如 {@link ReentrantLock#tryLock()} 之类的方法获取锁,并将是否成功获取传入{@code run}回调中
* 如果有传入 {@code finaby} 回调则返回值由{@code finaby}主导,传入{@code finaby}的值根据是否发生异常传入{@code run}的返回值或{@code catchby}的返回值
* 任意一个回调为空时直接穿透,使用上一个正确执行的值进行传递或者返回,传递值应默认为{@code null}用于应对{@code catchby}和{@code finaby}都为空但是发生了异常的情况 */ - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function finaby) - throws Exception; + R trylock(@NotNull LockType lockType, @NotNull tryFunction run, + @Nullable Function finaby) throws E; /** * 尝试使用锁执行指定回调 @@ -89,7 +89,9 @@ interface TryLock { * {@link #trylock(LockType, tryFunction, Function)}的无返回变体 */ default - void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception { + void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, + @Nullable Runnable finaby) throws E + { trylock(lockType, b -> { run.accept(b); return null; diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java index 2f8b22d..97e548f 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java @@ -3,9 +3,9 @@ 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 fybug.nulll.pdutilfunctionexpand.tryConsumer; +import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -28,8 +28,8 @@ interface TryReadLock extends TryLockSimple { * {@link #trylock(LockType, tryFunction, Function, Function)}指定读锁的变种 */ default - R tryread(@NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby) + R tryread(@NotNull tryFunction run, @Nullable Function catchby, + @Nullable Function finaby) { return trylock(LockType.READ, run, catchby, finaby); } /** @@ -38,7 +38,8 @@ interface TryReadLock extends TryLockSimple { * {@link #trylock(LockType, tryConsumer, Consumer, Runnable)}指定读锁的变种 */ default - void tryread(@NotNull tryConsumer run, @Nullable Consumer catchby, @Nullable Runnable finaby) + void tryread(@NotNull tryConsumer run, @Nullable Consumer catchby, + @Nullable Runnable finaby) { trylock(LockType.READ, run, catchby, finaby); } /** @@ -47,7 +48,7 @@ interface TryReadLock extends TryLockSimple { * {@link #trylock(LockType, tryFunction, Function)}指定读锁的变种 */ default - R tryread(@NotNull tryFunction run, @Nullable Function finaby) throws Exception + R tryread(@NotNull tryFunction run, @Nullable Function finaby) throws E { return trylock(LockType.READ, run, finaby); } /** @@ -56,6 +57,6 @@ interface TryReadLock extends TryLockSimple { * {@link #trylock(LockType, tryConsumer, Runnable)}指定读锁的变种 */ default - void tryread(@NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception + void tryread(@NotNull tryConsumer run, @Nullable Runnable finaby) throws E { trylock(LockType.READ, run, finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java index 75f55b7..6c7b799 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java @@ -3,9 +3,9 @@ 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 fybug.nulll.pdutilfunctionexpand.tryConsumer; +import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -28,8 +28,8 @@ interface TryWriteLock extends TryLockSimple { * {@link #trylock(LockType, tryFunction, Function, Function)}指定写锁的变种 */ default - R trywrite(@NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby) + R trywrite(@NotNull tryFunction run, @Nullable Function catchby, + @Nullable Function finaby) { return trylock(LockType.WRITE, run, catchby, finaby); } /** @@ -38,7 +38,8 @@ interface TryWriteLock extends TryLockSimple { * {@link #trylock(LockType, tryConsumer, Consumer, Runnable)}指定写锁的变种 */ default - void trywrite(@NotNull tryConsumer run, @Nullable Consumer catchby, @Nullable Runnable finaby) + void trywrite(@NotNull tryConsumer run, @Nullable Consumer catchby, + @Nullable Runnable finaby) { trylock(LockType.WRITE, run, catchby, finaby); } /** @@ -47,7 +48,7 @@ interface TryWriteLock extends TryLockSimple { * {@link #trylock(LockType, tryFunction, Function)}指定写锁的变种 */ default - R trywrite(@NotNull tryFunction run, @Nullable Function finaby) throws Exception + R trywrite(@NotNull tryFunction run, @Nullable Function finaby) throws E { return trylock(LockType.WRITE, run, finaby); } /** @@ -56,6 +57,6 @@ interface TryWriteLock extends TryLockSimple { * {@link #trylock(LockType, tryConsumer, Runnable)}指定写锁的变种 */ default - void trywrite(@NotNull tryConsumer run, @Nullable Runnable finaby) throws Exception + void trywrite(@NotNull tryConsumer run, @Nullable Runnable finaby) throws E { 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 index 5b6f574..51dfbf1 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java @@ -3,9 +3,9 @@ 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 fybug.nulll.pdutilfunctionexpand.tryRunnable; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -28,7 +28,8 @@ interface WriteLock extends LockSimple { * {@link #lock(LockType, trySupplier, Function, Function)}指定写锁的变种 */ default - R write(@NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) + R write(@NotNull trySupplier run, @Nullable Function catchby, + @Nullable Function finaby) { return lock(LockType.WRITE, run, catchby, finaby); } /** @@ -37,7 +38,7 @@ interface WriteLock extends LockSimple { * {@link #lock(LockType, tryRunnable, Consumer, Runnable)}指定写锁的变种 */ default - void write(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) + void write(@NotNull tryRunnable run, @Nullable Consumer catchby, @Nullable Runnable finaby) { lock(LockType.WRITE, run, catchby, finaby); } /** @@ -46,7 +47,7 @@ interface WriteLock extends LockSimple { * {@link #lock(LockType, trySupplier, Function)}指定写锁的变种 */ default - R write(@NotNull trySupplier run, @Nullable Function finaby) throws Exception + R write(@NotNull trySupplier run, @Nullable Function finaby) throws E { return lock(LockType.WRITE, run, finaby); } /** @@ -55,6 +56,6 @@ interface WriteLock extends LockSimple { * {@link #lock(LockType, tryRunnable, Runnable)}指定写锁的变种 */ default - void write(@NotNull tryRunnable run, @Nullable Runnable finaby) throws Exception + void write(@NotNull tryRunnable run, @Nullable Runnable finaby) throws E { lock(LockType.WRITE, run, finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java index 639d291..a8d5384 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java @@ -2,9 +2,9 @@ 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 fybug.nulll.pdutilfunctionexpand.tryRunnable; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.validation.constraints.NotNull; /** @@ -22,7 +22,7 @@ interface LockSimple extends Lock { * {@link #lock(LockType, trySupplier, Function)}的简易变体 */ default - R lock(@NotNull LockType lockType, @NotNull trySupplier run) throws Exception + R lock(@NotNull LockType lockType, @NotNull trySupplier run) throws E { return lock(lockType, run, null); } /** @@ -31,6 +31,6 @@ interface LockSimple extends Lock { * {@link #lock(LockType, tryRunnable, Runnable)}的简易变体 */ default - void lock(@NotNull LockType lockType, @NotNull tryRunnable run) throws Exception + void lock(@NotNull LockType lockType, @NotNull tryRunnable run) throws E { 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 index 8515240..524975a 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java @@ -1,8 +1,8 @@ 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 fybug.nulll.pdutilfunctionexpand.tryRunnable; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.validation.constraints.NotNull; /** @@ -21,7 +21,7 @@ interface ReadLockSimple extends ReadLock { * {@link #lock(LockType, trySupplier)}指定读锁的变种 */ default - R read(@NotNull trySupplier run) throws Exception + R read(@NotNull trySupplier run) throws E { return lock(LockType.READ, run); } /** @@ -30,6 +30,6 @@ interface ReadLockSimple extends ReadLock { * {@link #lock(LockType, tryRunnable)}指定读锁的变种 */ default - void read(@NotNull tryRunnable run) throws Exception + void read(@NotNull tryRunnable run) throws E { 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 index 8e8976a..a142b79 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java @@ -2,9 +2,9 @@ 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 fybug.nulll.pdutilfunctionexpand.tryConsumer; +import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.validation.constraints.NotNull; /** @@ -22,7 +22,7 @@ interface TryLockSimple extends TryLock { * {@link #trylock(LockType, tryFunction, Function)}的简易变体 */ default - R trylock(@NotNull LockType lockType, @NotNull tryFunction run) throws Exception + R trylock(@NotNull LockType lockType, @NotNull tryFunction run) throws E { return trylock(lockType, run, null); } /** @@ -31,6 +31,6 @@ interface TryLockSimple extends TryLock { * {@link #trylock(LockType, tryConsumer, Runnable)}的简易变体 */ default - void trylock(@NotNull LockType lockType, @NotNull tryConsumer run) throws Exception + void trylock(@NotNull LockType lockType, @NotNull tryConsumer run) throws E { 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 index fd495f2..8b94cfd 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java @@ -1,8 +1,8 @@ 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 fybug.nulll.pdutilfunctionexpand.tryConsumer; +import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.validation.constraints.NotNull; /** @@ -21,7 +21,7 @@ interface TryReadLockSimple extends TryReadLock { * {@link #trylock(LockType, tryFunction)}指定读锁的变种 */ default - R tryread(@NotNull tryFunction run) throws Exception + R tryread(@NotNull tryFunction run) throws E { return trylock(LockType.READ, run); } /** @@ -30,6 +30,6 @@ interface TryReadLockSimple extends TryReadLock { * {@link #trylock(LockType, tryConsumer)}指定读锁的变种 */ default - void tryread(@NotNull tryConsumer run) throws Exception + void tryread(@NotNull tryConsumer run) throws E { 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 index 9146936..54e37bc 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java @@ -1,8 +1,8 @@ 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 fybug.nulll.pdutilfunctionexpand.tryConsumer; +import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.validation.constraints.NotNull; /** @@ -21,7 +21,7 @@ interface TryWriteLockSimple extends TryWriteLock { * {@link #trylock(LockType, tryFunction)}指定写锁的变种 */ default - R trywrite(@NotNull tryFunction run) throws Exception + R trywrite(@NotNull tryFunction run) throws E { return trylock(LockType.WRITE, run); } /** @@ -30,6 +30,6 @@ interface TryWriteLockSimple extends TryWriteLock { * {@link #trylock(LockType, tryConsumer)}指定写锁的变种 */ default - void trywrite(@NotNull tryConsumer run) throws Exception + void trywrite(@NotNull tryConsumer run) throws E { 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 index fbaa870..0e97709 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java @@ -1,8 +1,8 @@ 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 fybug.nulll.pdutilfunctionexpand.tryRunnable; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.validation.constraints.NotNull; /** @@ -21,7 +21,7 @@ interface WriteLockSimple extends WriteLock { * {@link #lock(LockType, trySupplier)}指定写锁的变种 */ default - R write(@NotNull trySupplier run) throws Exception + R write(@NotNull trySupplier run) throws E { return lock(LockType.WRITE, run); } /** @@ -30,6 +30,6 @@ interface WriteLockSimple extends WriteLock { * {@link #lock(LockType, tryRunnable)}指定写锁的变种 */ default - void write(@NotNull tryRunnable run) throws Exception + void write(@NotNull tryRunnable run) throws E { lock(LockType.WRITE, run); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java b/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java index 250ec5b..4de8a6c 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java @@ -3,8 +3,8 @@ import java.util.function.Function; import fybug.nulll.pdconcurrent.SyLock; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.fun.tryFunction; -import fybug.nulll.pdconcurrent.fun.trySupplier; +import fybug.nulll.pdutilfunctionexpand.tryFunction; +import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -73,8 +73,8 @@ class ObjLock implements SyLock { */ @Override public - R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function catchby, - @Nullable Function finaby) + R lock(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable Function catchby, @Nullable Function finaby) { R o = null; // 不上锁 @@ -82,10 +82,10 @@ class ObjLock implements SyLock { try { // 主要内容 o = run.get(); - } catch ( Exception e ) { + } catch ( Throwable e ) { // 异常处理 if ( catchby != null ) - o = catchby.apply(e); + o = catchby.apply((E) e); } finally { // 收尾 if ( finaby != null ) @@ -97,10 +97,10 @@ class ObjLock implements SyLock { try { // 主要内容 o = run.get(); - } catch ( Exception e ) { + } catch ( Throwable e ) { // 异常处理 if ( catchby != null ) - o = catchby.apply(e); + o = catchby.apply((E) e); } finally { // 收尾 if ( finaby != null ) @@ -126,7 +126,9 @@ class ObjLock implements SyLock { */ @Override public - R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function finaby) throws Exception { + R lock(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable Function finaby) throws E + { R o = null; // 不上锁 if ( lockType == LockType.NOLOCK ) { @@ -169,8 +171,8 @@ class ObjLock implements SyLock { */ @Override public - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function catchby, - @Nullable Function finaby) + R trylock(@NotNull LockType lockType, @NotNull tryFunction run, + @Nullable Function catchby, @Nullable Function finaby) { return lock(lockType, () -> run.apply(true), catchby, finaby); } /** @@ -188,7 +190,7 @@ class ObjLock implements SyLock { */ @Override public - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function finaby) - throws Exception + R trylock(@NotNull LockType lockType, @NotNull tryFunction run, + @Nullable Function finaby) throws E { return lock(lockType, () -> run.apply(true), finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/package-info.java b/src/main/java/fybug/nulll/pdconcurrent/package-info.java index 53f2a46..b60435b 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/package-info.java +++ b/src/main/java/fybug/nulll/pdconcurrent/package-info.java @@ -2,10 +2,9 @@ *

并发管理工具.

* 用于并发管理的工具,使用回调在并发域中执行代码。
* 根据实现的不同并发管理也不同,但都实现{@link fybug.nulll.pdconcurrent.SyLock}接口
- * 附带{@code try***}的功能接口包{@link fybug.nulll.pdconcurrent.fun},在java原有的功能接口的基础上允许抛出异常 * * @author fybug - * @version 0.1.3 + * @version 0.1.4 * @since JDK 23+ */ package fybug.nulll.pdconcurrent; \ No newline at end of file -- Gitee From 7a3ff38902820a11dece63867391f69e5d45faf9 Mon Sep 17 00:00:00 2001 From: fybug <1006291762@qq.com> Date: Sun, 8 Jun 2025 11:08:59 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=8F=90=E5=8F=96=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jar/PDConcurrent.jar | Bin 22361 -> 22361 bytes jar/PDConcurrent_all.jar | Bin 43921 -> 43947 bytes jar/PDConcurrent_bin.jar | Bin 24260 -> 24260 bytes jar/PDConcurrent_sources.jar | Bin 20997 -> 21023 bytes .../nulll/pdconcurrent/i/AbstractSyLock.java | 2 ++ .../nulll/pdconcurrent/lock/ObjLock.java | 1 + 6 files changed, 3 insertions(+) diff --git a/jar/PDConcurrent.jar b/jar/PDConcurrent.jar index 8b170fceae9723c87638b06df6644f31a4528a40..f8e7aac818f72d8e8c4d453d46a608790eed7ac9 100644 GIT binary patch delta 4456 zcmY*dcRbYpAHO5niObH&b+X6VE0IyzcW0f*$UL%&6S)XcQtqs9wnG_3Mz-vcQMP2p zk#f0`%pd3b==bRJct0M`*ZcW+zMk*#&+GO6Oq2pAN`cI#2Gl3c004A!01oS}cxGYh zLwK#o4Lm{|3<#zm8YoJ^JfI>4r-8~xSiwd0it0Z?jMH738t{)B@-|k}Lk`D8V}OBa zod%s)u&Fe9_K1!()(uz`85aQJu!`ZOwE(iztG)q*kQfm+WJ|f@ z-#D1)^+U>1MD?3z943-Jiq0}e>SM%Aqx|^Tfe0bN(-|oyOTyp)DZH`1O9z}=EwR_d zXe!1kzH~7irvU383=zVmatwaB7NH&Es`{MOT~%GvspB0uaXjL^>I>@e@DeJob~}~M zYbJ|p2~N(Qt}A^2>y2UuX!4f~t^KKXGHmyI zG}u8~FW%gOD3%8~#@q>L+kT8%qXV|gS3yR{LD$6%IALeT;V{UjiHWn>(@n3jHJq?0 zTELh>*Xo}g&3X#=KEW4ZP%jMBLFXguq%S{1HdX`Gr7ixub@CPlSx2F)W zr`J48tttybWn9%p&HdX_D;SgmCIUKS^CXKzp4PjAzjCo=fJbX!`c}^tvz*oZLg_*ctsAC{+x*!bt;;lRIs2Oz3O!i18O7W`z;2dIi<-P5?^#LJ~{WOH(C~U2A=SdXo^>1wyXG~=*Oj>0@^Vp z#-}%2#bmp5a<$~Tcz>LE=_1=N-|w8au;z84vSfJi+l(*fn@P>4ZRy_C$v}88-8P)? zeawuokPv62>MqWUl>eUFgHI~!EDFK;O zs+t+riWWjGEXjj`&{$*J>pGQR22nb1i!=(q0EanDIe&c#yMds&Cq)R2EIRNt4bFP; zQV)DtvAj?Z6FJ8^%Dm5K34J7;(WyTFToe36YnWx^ibsT^=CXZM5 zDo3)g+v%sM!voA7)rqv*Cd@PNN@I*gJ>?^f9=tpE-4SFNErG=6CF-1Knt=CD`~D{OTNopv?X3b#>a>26kiHjEyN$OA4jsP86Wg0ArQV;_34Jy8m6{;p3KWOs@k zwUxt-fDy*tC2bZ7^^2@P=!ElQu0qH%n|@AIV>R3Kd!k?s%+8#@S68}6 zKZa@St(4Aj=w)MWg?#iO&3t$TyiCKx?+V36?d8oeEM`8AQE+n^b{QQh7E~u7KX&Wg zu072^uS89PST+&%_&hspkuwg|>uk|9+n=0TzkgidxAx0S|Kq~VxMTZl`@g}_Vfp&i zOeA5(*&zhNn3inCC54Y{<-M6rQ0vA7%C_}f;zVTmMQaPPYjFnMxT`=)Ar+&*i%k&; zXXivOe9;wsyWO}QF@*WIic~yc?4_Yp8#C4{YD%^Fc}9~$D6(f!%1^}vXZmq~=BYdm zWcbRDgD(Qr$3do0-f^G@nLhRt7H^^WRjf*N9|u*?m&YsIR8(U$j8&c%JG@VSEmgtb}PQohNdtUS`!*$%MFmU$_cUo0YzU1cfddh*@ zzE7rN0uLd?*IdmlOiaJ_L`@4QY-qI~({qn-VS`wuLWZes!tuZRp8r-~A0ubTk(V*|HdO9A>>BD`()#M`Wp401wK9b#6H`~boGx-E!jTS~ zBM5b~ijvC{9G_C+(*>oP>$F#J&}cBC{PWur%%MhdiJ1cv7NrOgViFGe?Nd3R7bZ47 zmR2Gkzmj%K*h)Q0|5;Y$+7`*0#!Ky2>T6mrvCR&W$fhXq^GIF>TL)ouLlw`@8wd<8 zze99IlDPOS<74MAHbhe&^iC?)DTNUtzRXpXf1?{U8qyMO6 zcL7EQEm{7TYFTWkLD(c;5T%|Yfp;?TrQ7o_1 zM~CX5LlG?l2g_2HKg1q6p^@!!vLUnsV&fJ0K0Q@NwqUJc^Y;=f3ycht!O{tr(L8xm z^jg*HqgUsQ0uky3v)#6EnYT*;zHZ|guHKOHsQjmi7E3?hC1j-$k!l6cKO$RB|NeZl z%NqKK;nX)w#^i>EP;Qog&P|n$M;E=$Faui?GT%r{4MjZGVY7W*%zjp~U7m~Vr>a|% z10Q7S6(w|dy2e`2ja2fj)>{l(+}4-&Y=sjS8$A>E&t1Z;ctcvWV~R8?V9v!%Iz}a$(NoLHt&Cp z9auj3>Wf)-s5o%o#~o<3tYiHB8!JY(R*8*;0cicv!pc>CoynDU^b&e_+sg9Hz9#ppVK%jQS880^uuHg;U2FB)}l>QBABb29B(%VWUj!a`MV}J{X{cG;c2%SqAF7+ys~>E%E*HX*1=vg z{ROS5?#4WE$|{bz9E@t79_=}Hh}S*jno<(tx*18w%e>LCrU(5&37%g&QR;Uu!Jqe< zsyYdXEOS~S@x76I<^#RWlG|+x4WXUEoFeU?gsybO2S*EB)vFiH_VY>WS#UQuya-c# zj#&SEf8s#D&E-S9G%EY0R4tOa!JYQ*$LX7kCQ5_YTLeSJ8KWp~XpRW#;{z$tfoN}) zv&kDwp(0<{HqZ|SBJ2Bilt^(2V?Ss`lSwL#S-Vuf^O(B(Y>2bJ)KT(Ui^(w>nBKC_ zk99IT&eewl`v&_Z;0+j=w_>YOs6zp<| zZzUvshua{~;UQ`|8TfZH;s*pJnC|=C7v8fpYq;X^W;$a7W6xRL?b8XlW^vkQXIy{M zm#;~<(okRDD=x$Ij|q@}brxYVFcm6o0y2ZqkA&HS5$c2-_&&};td(>3+8~}=z0=9MVoADP8r?dH7;Ldg)U9&I z@UZEhd1>8WleA*7pjmH=9$c}1e0j7utkzKN{qX&fQ}dESyI3yEiLc(EIkDW3w3+Ir zcm7)nmIqPjF{`(MF#%5ugE^Cb@T>f^sgIkvdQzh|T?TZ~X7pZF@s6i;@>%+g^*i11 z&lbBvyC2@k1b@YHry&=H*)V-*`u8kED|B$>wCVvhy){xRdM|O&EWpic!~U9Z_`}rB z=wy_PqxUN@FyRL{@Tt?uRw#AMepqYfETB1cx+6O+ogvAqu(}7ENWvWrdmg)Z_bXc^ zi6kUS+*%veF{ZkViiz@bdP}-9q47kZZmr|x3D7ieGApx8&J;%ZI`@Djl)w7@La4g0 zW=4&G$tUrB>w`-%J7#SSSWAnWRX-kGU;NJfY`6RY=vAIUE2dMaSPU2kQ?-i&5UUG0%B;dBmpFU3;mipWZ zF?Dh7>>mfXF{$bqGc517X3%A&$?3NAOae z6{paq;vn1;v*S(EtX)|QJG?k6W&l9)ACFn7|2$}L+|n#ZH%(b|;Ak`V_zrRKPZ3F-DNjXZ8#9gvD_As$9r+5|o JhX)qO{{hkW3c&yX delta 4411 zcmY*dbyQT{*B)YI=p2R)2_>bwQzVA&Zb|8Oq*HidXk?HEK^l}2B&B9V5JW;HmF|-G zaCpD>x4i4D_3ZnsXYYOP`DZ`p&eUMc)L;;5t7BnP001Bm0BJIqO303N1N9=*7=IA1 zi@}1%KnxBvmSBjWaUMhL4>nR^)?xlja6%qGzykbL&9uRoWsna}091#W%9D^|w;VOI zKU9tasWiz|_BcC{QyRz9f@rz&{RjM;U`1A6$BB;hwjgG|3!nOwU1D7lU*c>vHKRIl zN2)X`rjoHXTg6Xaz*Imc zXjeQKatk(<8@W#&&svaUPc7gZ_;esaRh6?IXy&IMTSqtxG&OQuv5*u@4fs@(?^m5C zSSIN4w)L#=VpL5%?`!7wXQzP|={lPh*Ap8xl253@QB`d%ziHSl7S6MxNm$#>=*uZ*6aQ2XD z2bpY!X$EhxBZMv2mRHZ!MJZTIo{Wvg z?@03cy;X^O3UW{0(hvC|u}_8t`YD0OSwgr_e_p7|tf(j%O5v;TgdPXOiZpF<_ma4c zWEla4iP~og^3SiAQ^LUFQZ1D=5-~VSz0!Ngw{%Y<5ikj=zK>*!cOXj_O_&CXH8}_w zPh`ch?;%Ji6VM=c_K)Y1`ReFeKI*6APVumW9jSk zYtj%T@BWt+F_Y=^`t+iX70o>HX`w*I`oWCZ?{d14ElWshER%p|EOnFbGD>-K#Shw6 zOk2T6$FRU74V3!_OlAJLr@w41jcUQtq7zdZ^=q-Upx+~Lox{735GU@f)i*&U>h1A7 z?ZQXyoP~Dz(2i0wq~|rHv9#%=sPyV?=@DJj^~JjFI~8kbden4)Z;5vKC;~3yYA$V) zvTtHDK5p^Q)?sAXqhDL3K;5jf<)Y-Z$=Ur$UKs5-&8gBatb)Q*H!JxO)nLon)8Uuk zrtr)i=66dyvHq5k!zLr{O!}biyud`mU5slIp&V`ozP1-Ks(qL|IE)IOVNsmn#!S`H z@>a(9I1GgYgVXqNgAwjf?a!1%lokRdLCPO$vU&5(GR1q(moj6&bUxFr*5K`NNa+p7 z*@PieTx3>aGPWFWo{LqxJwS493{vSfaU^k7RaTzY=TBqJxwA2CjY=obiw(G8{T8=K zhtrqsxSt0p{dRlCrc)44W4k4w|6K z4ew=d7*&ZG(M(VL>{hd#RrAD`jy?_OIECq1hGs!vxqI`63=vo9uW|g+e~A^_B_^95 zsh9ahy&>A)hjg)wUl3V6(9G!>h{cw~DL?r;5r;%PU$J0zMl z8PJfVWu?&9v@+>x-&)U84F*k8YD4fT;;ek5u^7tb`ycOm8Hcq5n>EIQbThScsyDtNvZ99@ku*T$@i z9W)PjL6G~@U!JAWT(_l9l1E1nbveKobz>VRZK~{-o-@|%kluZl#nMmnbew>TYu1&$ zB+MnwXZT$0nX;>m?hNMhPO0o?BlAJ4^F6$w!=ouA?*}Q??p1pwlE8-X-aJY5Cn%^# zx)}hk8jk? z(JB5ht4CT>0)^2l8V--oc?(}UE0wCI;>m>#ZHLmhwtq986Pq^s75F$(WjdJfRL*in zDU;33>k{=fu^k0cF3}OH++H)r-dcG{X$d^wP+c8)N)DT^| z2_m}ToVs42Fsv=SWDhGnZ$h6M`xT4cmP1$ISgvL}a$TuXn~!kb#&*@u=>3v(r)0jT z3JyYd&zBBoFDb&ml4S9&?9qqgs2+5B{bg_Z8*oQ zP)-!LNIv3Vr4%-&DGjsy5DJC)5OMz>l zU;AQeSB@f3wX;@mp>*ZIjP(*;euhg+%WwXj(-w^jNbZd{snR@D6%At^!qZmQR>C!d zoiNq0E7c&4D;ywf_h{@4X}DBXd{Xpvo6&@2Dj~qxU9!s5r>s-T?m?;56wmy)d01wm znTC6iqoL&Tn~g#z@Qay)4a*E{qeaB`0TG+57adQhNJ7HqWE)cwoAsTD%)LMm-k;kM z(q?Y*Ap!}&y%>i+eyryK>Wj#vCBh)5ewcOf%f&G*1v?JQza?rRqQ3=6%42C^D(jvb! zpnFgJF=g6$4Np)~lgp?={P{>=KK<`Iqz6sSab%g!?vy(=L_2l}e~4G4k0=LB{R~$l zG{!;7IwTP<1@5W(p;3^^cIDfF>Z=M9?IXgDD6BLvE!BX@P&{FW1|!X~b5t?kATd=~ z8n-0M`7Rbu}||d_k~P!O1Kwu(-|g^0>a(x)$dc{cV+lxtZS|A_24A!OLTd{ z5+J*RHCO-KI9G4cxMR{F|46BG;MswC$8#&SJJP5ZeB>BrQWugR@dWDFOc<^$I=Iha++b0$)g5)wn+5KiJ7*iNt1VF zyPW#^DDz_*g|h{yNl7uN-u&v-CSo!9?#y#hT=q6mW)|4GlhPZnCILi<07LBnvtP>@D4aAzuoEKc|qpA`y`~AEy-IrX3&{&s=dp1>#~>3 zngf0K{}B78>HZWxiI$Z=C(?@1#toD>hZb{<;wFt1KCeT7 z?z(wHae&bjk1pNqMs#U0MOA%sSk^wEc(JKR5Oe2vSiWZI%0di}rV_;HX{r8vS*2dug01qhv e0It94Wc+^;8C=fr_H?0!2I!jQ|Khcw>Hh&PcK==g diff --git a/jar/PDConcurrent_all.jar b/jar/PDConcurrent_all.jar index a70931962acc8576f6760c3a041a98eebaccc045..d1ced6cd86bac57085903df475f0c12dbae78a5d 100644 GIT binary patch delta 7139 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 delta 7028 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 diff --git a/jar/PDConcurrent_bin.jar b/jar/PDConcurrent_bin.jar index 2e92440a21dccf66a3d344b8d1fcf2b78ae47e42..d35d3bde28737600595d4f87a3639d8b8c85037a 100644 GIT binary patch delta 4454 zcmZu#c{G&Y|DPe*vrHId$uzPrBRk1nS+b06M3(GiD@J5Kgpg!rY+>vMWho-rWnW@i z?AgVTm`q95ALDyEr*nSKx#zy#&+B>J*M07N{&>Id)6oR%XaX{u7*L-&3jom30XS`X z(9FWrNAOC48+eRZGa!V5NT4VM3xNt0oB}ExV>OuSCDs23F)j~jYQR5kh`SgKPdO|T zjRDF`lNEGo!M4UIDV~lk!5vr{ofrh-w2tGY2ZI5G$CEPrMo*qHlAT?=$qU@={7;p}|KxocFr0u@8wP#6yiTD=%*1*?tuyLT ztFepVf-Wbu-hD<8FsCh+OeL8&95E7Gz91iw0sTdSE0ED>!^|rGN?H@?%(bEMDlW4c z@&8U=VjvoZJMVLsUjb#@TcgjV38kr(ctGqm6!zgUv~O`O3|x9kA5l*rZhA9vdh1%( z=GSy=N!9A=XSP-=Mh9%0uZ50`fo_T$aG9MQGdF{N86Q8FH`VeA zQ^#c%gUz@eAU;}YOZ8?s%7yo%$?XepFF4#PL4YjgfV``1bB~FoD<;$lCyTP#Q&GN0 zh{Z$4n58B{L}{MKoP)?e7)du>Ss}8yi{aX_Vl`^iFHkJxQv_Xh(%yWMm2*{(0EXnY@uYS$kRp-$Tu)sHe{sEOy4?bG1o;k z5FL>q*UAp|4E8S}>y6ZTs-RqJMeLh+hx~@wxO1<>WJ==(yf$m{mlu+i&3pdLiANs5 z9Hc+&b!I0N@rCnl-1T@gR#i~yt9^#gD{MiMPq}6PR!=Hs`Z0dzap6cH;DG#Ml5BD6 z+X}L|u^sY9$z>$#^RtE381=q}clr6M8y!9Pw&D0ZL#a$ysN^3bTXR$x$AmQK15Zf7 z&;No&roW4egcL204HnZC<^HS*XZgW*k$-KOXw`?1qK;?;o|zRanx#2py|g01PpHpQ zvDJA{zRR!W8yY1RQ6gQUu6fIZafd&zt9_ZKBmZFQVu>fq4x^aIN3+{ikmm+p@h*M2 z2X(*B2T2LCN@B4N;|sZ{4PZ4nKjY1pTujqIF8!mFwN4Lc6IdGqi}Q!dTUcn+1~B>8 z;F#kGzeQ^2z)dU;EH4=3`W#oM^DELeCBEujesVs(KUUW4ta2}QV>!YUlh2%sd70+R5^a$G*wVpZYW{BzDnH$o&&sLw%`n#U7+$b#|Qm;m_ud%Rx zP7lhVQqjn^QLq$hV@V?f!xD_`ZtB#0C3xw)Embf13jEAz!u9KG#4R|@11WrXbm^hL zNoel#7kUtFg{l%gRP-F%2=f7-73}GpDcoOeXqd5sq`s37kdyeq`D~~t%RKdtozoE1 zDQ)aczfv>{hrNEfnt70Ee1k}*UGh8wuQbY7)caDj(ZhG=*PTFCu@VSeVT#TLrWteL zd2zi9EZsSqIQi{vAyzjF%}84%mflvCq|eCFs6yZ}gW6syDvAm)(|`xC|R)^&Zl z5c@M6UfcQHa5MbqyVR{xp+S)qD4lRo+%+g!W-Gv%YP4>Le!s$*_6~t;jv>pvo(t@% z8|0jEi28PF_jE*4uhN^VZIcNBk9F#d5Mgs4WnL%5R7g1XV;P8GC?&w z;#05Q-FjC3c|~dx)T#x)&*$B3hnR7s-e8ZV+4yIlp2&U-r#uiA?WmhI@f!UfL_h}9D0(Bulabzh#8PAc<) zEVe`?pPLiC_*GZ*?N0Mf)CbhRS)}?QV?PZg+nBQDQd6?c&$Aj7LV+Wfl76bkxw1|I zBu~vrAj4O65_}bSa}wkT6`llo(5VwYVevMKU-ha~?@3S#dvP+uZ3R`fqXdVzi$#h})q-0%xBBoq={{wG>B6_XFe_kgptDj*%-A9Gg_+(*s27BH2 zEOltXzkhb0*I*K&rCc&==3ATXpn%K8={XJ2UH;iccod#WNUk|}P}GT974;o3uGO3O z)F{K$DO5G+Bg1u&;qbPh!(}O}A7b&&NJOWcY#8m3*jROuUtg_}9Ypi9#e0dB1xAL6 zQ0ZiCBv0Waz2=*Zk!y2C!Em+W*~^opIL=9S zUILQ?RCMd|%?V8XqWCUvw**VN;TpcxMoWU_U43cqc5~ulvv~lI1_Jx1R}`B39V=x~2Y_bk}A) z{ldH2_WiHXL#rp>{81Z@)rXG!*h9^>4OC!YbM^4{DzUjF2&q3(QnSjBm>hgwTjo(Y zFy3FvbXeq`Pvr6bb2VBib@4g1WZF`F3ka=Bl|gf6v5LfM|}WdFEY)n40u)pS=F4 zN-{y-Ce&wUu(&%voqfw{;H2$S3!c`G$rZySTsA;^&#VRXG2dn zci+m~Ce5dzwB)+?2n+J>8$fgcr#f~tqG4pVNCC~J&RqbkQE#!@8GM$fg1`Cc`RfrM z-qlb!$4&tI+%-mjvxLQ3L$we>uNx5jk>Fn+AT%0&O`gTb>=x`^>AP>sM@5L2;DxnQ z6#);D19`8jsF8q(O6MgK-)p%fKiFNCf?g9?80`$|4C&xBY^4Vs8Y^&3uTeBFz%R3J z!NbDvvYEm&_{Q{q6TUU@I1>JijU9<=vAP2FC+p-8~o!5b>f7{&O)@VTot(OEZVN|7hNki_noC#!xOy?Eh)EgOkw@NQeeI3|pb>1Rm8L6}s@tR9tCNDl zl--EAQ{@yHG4-=Bv-ex7W&#E@>ucGEEek|f#fqEN8>+tl{NM1Ic}bx?4A^S?n=fci ztRO6N=1t4Hz-@V}!x-eK_1oaMpeKf*Txmb}m4DhcCeBA5;yQQILGdCzLzFIds$=V6`I|L& zrqJ+Po7o3Z!UX}U_aYL_8JbcL2;Enw+I|4U=922U=C0JbLy=2yF5>Q<~VsHmV7oh=>dRnFt!aQ zP>s@JW}uV}PYq*fDRl%7{1OFC;gos;i-pTl?z`cN6a-r6Q1GgS9tF`Ba0(JF^yn$o z0p)zFXnDdWTJlnbFk)XR@M6munXqCACW?6Oh}LJL(4lOs$F$(_SisRmb=)0YLML$4 zvjVKjz2EqcQ~cR|o(UMo4f_gsoOkitwF9*^Ic=v_3h-8(Q;H-Ql574jlB@C)NU#7p**^h57!{Bx?x8wkVbPkJFLu+ap_*e{3fO z{))kZU~I1S$%4aec&So^{yu84IZyGS56)xDpaB5nK>&crKR#+uir5dz@^{me5xi9A z#3{6iIOy-D(X3rvjGzVpteF7-$$va%rT*tZgC!t%DeGB3@+gB*=vf#WcIN-tc>cd0 z#~Y7OI1&p=m>2-5&QkyVC-QF%_;0G)?NeSt0kfn3!6kbxgS-OQ6mPQt75TrpVK~id01VJTKQbD?r z_~G(?&N$ya_sn&kYpxS>{yFD<2D&i@x-kfKHLF0n3&FLAb7T2bA& zV>OVfnN+Nw?Gh(X;Xa6U*#g3zi_2vlK!>0)2GfOP3kfC&&(K=fGgo!Um-7jJwX5-G zFv$O7>Xtv=DcfW^UM8&ALQMsf1;SOnyJm2v(LdrOL}UL*y3p_anFZ3@qF=N_-^T+9 z=~OxxaSJw+AG=4M$X=A^KqKTE7(SGwrpDa}H1{)%Zy=llnwdOWwUiQ04|rc!=vP}H zTp{f7s{O3^VjMEm=I!SH-fpKg-P!v{dGF!0U3_W>iN9S=uLlgwyh)P`e6qNt$ZXTJ z)FtoZ;9l(KvKgrL?9qsfbk?2}QUK}z6p&I4Q>e|{a8IWaLZl;UUKDFZIXRT;X}-en0} zsR{xLsKy6L@((Xo(!#(J(rwjsl5sf8{W5#VSM=f02$&@Gz&o;~J5|dE5xgN5^NA(QRjjhaw12c{-2Xf+Rj1Uf6Lo#_iAPVuOYx(o+ z3(^oI|Nh5Sap-JjV`fR$s#bx-?1Mn2#^J2Fuk!lQZOcd+ENDOkTf_A0taAQ*iGz++ zvv%;&F)Z*1f^vV0sUkQZ{=?47q#i6IHZ=ojT#v5@{TfT?9^Iu1apK)tdl^)w*_p`K zDRSh_U2I>d(^YPc^t`5OE^j$0DZgSZKcbJhzSyvPt!g8~fSL{PEz_+WN5ExWEo5xd z_Mx_ula}gsj$`&&hiLdV>h4MDvHfyu_Z7}q2Z@^~2qI-bg^4Pf%&Fe!S5#c)TOGS|u| zSexSGFcuFD&*CQxN4e|hexM|xv=k}}Qh8gK%U@`oEzy6zoE`tMJ3_Y>!r$kZ)*p%U z6NXH4kzI|;+H%BsB3|ouAIZHrOs(I-mBLd~U47nIIEyv!&cVDjE|bI{KIDe=OTsb} z&QP)AejfY}YRan5Yeq7Xn8d!EJh!A!)q=%`GIV_HWqQAOA0k1Cl&xKI)S}pU7>cSi zzMH#gQX_6cJ3IBgSHo^j!xLX7_B5dD6lP!*nnMN4-&;6jjJnEvf#a9?L%h^JIo0e) zv%)XtCDHyqRS(YExjGcqv#)DFJHa%=aQ+n@1RXpDduAb(&Yg6{6 zE?V_n5Y;`Jj}aNP*BzPDp z{oyWA&3pyPwk~B+h)@bI{9CQs?#<<`?yRaRIC2o*9C-(2Q=+-9qk@el@4)t#Ox`vG zX~a!tIEtToI+~^xmk{VQ(Qx&Lk3I$;pvnhmA2hmpw>r=XL0KERX zos-g&T=;7EdnfiTW8!JPgtY4`R0{CZ$A-Z~=?* zRSTGP;KhqoD{8^7#kcJeKg2E?#E!Bg#To)FDZKNHP;)V!{nRYi9A!U2izdezE%V*A zi?)YMe~pmlIQ%gndej(_KEpzfniC2+G$8?ghMqmm^Hfi7jS$+_TSJ(k>DKtp^b(Ww zW>A?q&&NvZV*&u?cK`q}xB>$Qyax(~hcVzbAFvwSYBe|(ZZmQ5yg_Gb-r^s*HQI%0 zZgV?{O5y$vNB7tzEEZlPDhK;-8mXD6aAAfDSSYn=P3Ph0RcH<(b6gm!LV zqJcm_VBGDIQ{q4D9vLl36eiDUxja4;EPm{+R<4;zBo{HZ8_D3={>5}oY}V>mM6g__tEelCm9&+VYfa?qq)othH-g0O0KbW| zCU7SZQD=W6;&%T2qcEwMREyhg3ECXB-Too(eduTIyox;j@iliIYj64m@2QGHYcd;& zhd`WQ?<~%yZUZfB&4E4YjFxOVI?4KHew9|_$Hhj2SK^Gr7(mO;{OPH_k1H+;l~bkm zj5YyvM3-*Dh+a6izE>y=YYQ*c!`i@`(5KE})v~|s&=ok5uhog%P_EV$AY8DuTk|t{ zvn3LNDho)AahblQym*!J&{M5^A zQTvS-yzVbSs|`^#GVQ@ppM0bIkI6!ecZ=_)S{*jVRMZ~T^Y9tNbj}ukuDGz*9rtr5 zx^i@O#;y;?tPg{`e#r&2Cz%L7?QP~pBrlr>TD^JA7c1Q6zCnvyQs?|ggQ>va-HcB= zecvqef;MhPSf@6gXGiH05U8`0AC+iSpWLr>%p1a!C(Ikx(jr|d1&{J5aoy^Ar2S7S z%l73+L#GV|nEsOttaUX+*;rvXaK!tGW7z0DTFf{uId^DV4K7t8dxxEdj|Jbv1L|gP zNv&5Uo6d2olvAZ`QV)4zHs*^9PNUYyn% zS@|5`3%jkS=0m<(i8z_&>l(UI`iF4;h%7=Hgm~N7cuPx3z@9RUCowd{ondh6wGwsj zX?5Ru2u#E^8M|-!4)1k{7Wq(Dc{@k^at}d@lmC8*xPi!Q^mXhaen~ygVaL*TmRQNM`e$E>HAX6nUYom-`knz&W>WhE(tYz~el6UiEx(pw6Rnvrr z$gK6XwMgA?H%x8fN-YR-g#(1`9!;DfjhAamPf9*-GeOyAk^-FFrE1K4D!QfZ@0VN8 z@GVSQgk>k2L)?QN8B49a+$?qiKmByDX_bX-vV{0LBx;-Uv@3juBqVHJt~o8a)zFE^ z!V5&j|9v}3#@tOIL?{Wk7w0%2i1j2ua|xNUOc>-e2(u}DwlpD5FVKbLyHDUcXl3VE zhL1hH*3#uFCCylnGqxi-YMpVZg1Gb{ct4#S@7>mI$n7vT&1o^*u-4qkcbL0t#2C!! zTEDe$=Bq9|f!hzhs}?$7XB!WBVLF}6Z5+rr3q~Zl;vt^D7&Rf#p+Pl(LQ%Z|r>206ao^jJ?;WXBOwwgiK183_D71_i3|G+BWjefx)NzcesG6!n1fO z3NG>Y?87X+%wDSv@Q@0T6;Djby$hfE`O$DSRmt+M^K0LHTTMNyPo#-AzCzPd_|!;r|+AV{b* zX=Hem(_mx4T;SJL#A!L?aLnxc^Z2?MdC&RC#XvD|cL4rG9_Ogx)PkWyA?cuLfrszI zAnnkxZ)KV5yJ1{Zy1i1N{3}|EJ<&y)LF7H@-WWy8_@nn9TaPx3cg6Z!4V#uGD);GSx4n}wmsE42bo`QPz~!+5Vq0N_eq+Jn8w*qr8Fsw8=*VNa;?DwE*$Z) zx=IW?tUd4q#WD)DZ)h)APRDayA@@`?_PsQ|P{xFwX9!><8+?lxT=XmXIeK3&SksCJ z#tLCupUH%LTt4!VJ?LYH&Ndo;T-G_I{47M87EoYN4Z@ZBNh-R(x;<6`9xGWvz#K{* zYRpvjZPw=6*igy*u-or&AYogK#pNPgV|OKbc4d_ z|M~i5E`!Z>Bt1HV*cC%~|d$&X%ASWu>4-i>v295lgA8pPq=}a(0NZu)#K*lwW$a2q8j* z80#m<6{HiH5y~VwefO`#<*Cm>4?*?|_2}JDt?ei?Z+DBO%plOWndT*ZDL_ zy?6O~L++AAYiI!fUt-@3{qG_tv2qIMMA~t>xB>M9bFVS z>KURp2{_zP5dA%DD27H1BV{zI8>yl(-N+D)-;Gq!)BpBaD`tGlrW(^>`s2eJSsCDO zjVaN>Z#R@ODVmBPC4zIC5itMW8UQ!vW(PqZ*8dOyAOUPCtW(^G+2KJZw?bCR>obGj zN*n+{=#LNpD2wC*qlIo@68JOITXCOJ?V9F|*yv`p5&cU%PK6c|Q&apFqbq}$(qX#N zqUkzX@;`L_4b8@Yrgu%*(8ZQ#6Q0@Kgl)eGEBRO0k4$JG9W(VG|8OWBW(MmGE%B!; z+<;=zd>{ZILJk1j`^#T~<3`8;XE38dmn30Ehe^YOri^$<|1=BuQ+*{83ji=B1OWK{ z@?YRbizmz&(f->v{?$Tg>Yh2>|7$ekAK%}NHW9rM(!o)pKwe!<3``2FKfgY1ceiH$ChBoXFtw=C^&^G&e#gSF%83bAbgH=KlbLaQ|2U diff --git a/jar/PDConcurrent_sources.jar b/jar/PDConcurrent_sources.jar index 27e2bdbc77dc5c1013b350eae080f5ac3299e2cf..5c05c9d59966f38de85885ff0740f1358a7af142 100644 GIT binary patch delta 2771 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 DyOsz$ delta 2749 zcmZWrc{me(1GhP1Y=jY8%r&_cKlhzn!z|Z^a!jZYI?UDFM?{)y=Dv?2IaeX%43SWz zB4@ECM~U*v`+MqnpZELE=XgHf@AtpY^T{s(#FPNQRwza$UIqqMR)%3*Zz>qccmQ=O ztW1nIaJ?jbCN=H@bl8$*%Ti!sU|@$bFvv5IL{P^`6--d&b7+_`Z&>sEz8|ISb)Q3d zSoay)k+7<>{e}Y@1nmz}&sQ(q$Z!)W84)kxGDrp4PFZ>Bkk*;_h{SN|bVQxP>TnME z>KE#_!R)O&+6hR-q{)Gf=rfGH{<5`hk6%HKb)`AFtL2JX=RH>ojVVio`pscK0vgr* zE4QfB)B?VHOLq811*ebzf+CkAh|sz?d)@_l2F{eX&UGJ~GtNDl<2sK05CrLvB`=G+ z!Ey0tGmB4*UJhU<+T5U3GIl(Htk8Y97Mq(xxA zudhvo;+HV^>-yenaj^Ed6u!=(Ogj+;07#%P@x%w)%oX@%pRz}rcx3g2?Po^qd7evn z#9CpfhOLd%$<j-=-v33>p9uj7UJ0Vl_o;Vn|tp;nL@WF-^aIVgVUv+ zO<&V8oc205eL7X8j{D6lWL1CT&69a<&Dtp*Y30gW|3n0pwYpeJg2+vq;Ud!=HH=X7 z71Whx$-WjRKGm-w8vcDqTl*Xq7ZF^(15zoQIj2N*;2Kx#WrZ_8zd)ov#^sp@zvH5^ zafcDdVq|EpjQ{9;+2cg_C{vubB|j1 znBc>Oa{yjLqBv|&P! zd_!&EUTGN1uCv_r+ONarn93**ewt+#hk?1v4}D{Uq@6@vcp z&G~P=T(|FaFkh>f6Jll{xtOul^Rcx^Fg`sfnNfL7?gMmC6_wvfJSZ6|4+Der?~;L$ z^3|D1ItqeBU-ur7lvj1K2)bUniK&DT7w5;VXYV|;A7_&-@Ukf07(}5#6tBq9^jI@i z5uum#v+5QgA`(`P{>eV*vo_T2Xk4`%V;ytRdAcrY@z{DU|pgeXfFv z*_c;}0%A4=h)ug%DEm!K5ILMe02gDw0~``6C5d}?ic;31n82?1R=L2M{B>16lRLn7 z%ZBc7?1faM{)Cu0%;bS3k|ML}kX(F%&i0(|(Jk^*R%=1fJ@#{V z)Q3pdd{8o;lj)BtkM>9sh75wqT3dK$Y~pc;H5 z#Ktkr^VSYHpvg78lzWg7#~-bt_V&)YZ{=fH)2}e9q1L=Ipx#?@+1Hfvs-LTUoluG* zQ(ze}e0+^6Gp__Hs*H$OPhwno`+G~3cGGQ$5ew92A~D-AOQ2R)+d7g%RUB$E(Yl=l z56j)$?Y{zBDU5c_s5E+iQX+z~VBOuo5G}EByq6pp;okKb0L@XDb>GE2-2XaZ>G5FhBoenXM-!*@fs zk9$eMTGnXC;4#D)Ezcp_r zNhJ8`vUY{LNT+;BH)445V6wu7U*jj{;i53Q^g^*>hud6+QQQ5*%pHUM_m$$g<)4KT zcyDJKht@ZwT`hL9I0eAfzg4==^LrYRl8lvqV||zL8sKmvJu-ojhD~L_|Fe@wEM`8y zPppSa>8_a)&{DJ-7THZr*ApXC#8UCD-h|RxY z9R&`OsTl{!#Yza+tMuoM0xL~mhVs9Xh4jlx8EC0~DA5=VV5GqzEyHL6pPoLXzc4Ts Jyz%cZ{sR&S@Hzkh diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java index 430cd4c..b9ed8cc 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java @@ -31,6 +31,7 @@ class AbstractSyLock implements SyLock { * * @implNote 使用 {@link #lock(LockType)} 与 {@link #unlock()} 方法实现上锁与解锁 */ + @SuppressWarnings("unchecked") @Override public R lock(@NotNull LockType lockType, @NotNull trySupplier run, @@ -108,6 +109,7 @@ class AbstractSyLock implements SyLock { * * @implNote 使用 {@link #trylock(LockType)} 与 {@link #unlock()} 方法实现上锁与解锁 */ + @SuppressWarnings("unchecked") @Override public R trylock(@NotNull LockType lockType, @NotNull tryFunction run, diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java b/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java index 4de8a6c..aa71b6f 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java @@ -71,6 +71,7 @@ class ObjLock implements SyLock { * @implNote 使用 {@code synchronized( Object )} 实现的隐式并发域 * @since 0.1.0 */ + @SuppressWarnings("unchecked") @Override public R lock(@NotNull LockType lockType, @NotNull trySupplier run, -- Gitee From 529a876384c0fbda7949cc9bf2ab967cf45a9f23 Mon Sep 17 00:00:00 2001 From: fybug <1006291762@qq.com> Date: Thu, 12 Jun 2025 14:09:32 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=95=B4=E5=90=88=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E4=BE=9B=E7=BA=BF=E7=A8=8B=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E6=8E=A5=E5=8F=A3=E4=BB=A5=E8=BE=BE=E5=88=B0=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E7=BA=A7=E7=9A=84=E9=94=81=E5=8F=82=E6=95=B0=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- jar/PDConcurrent.jar | Bin 22361 -> 27072 bytes jar/PDConcurrent_all.jar | Bin 43947 -> 51958 bytes jar/PDConcurrent_bin.jar | Bin 24260 -> 28971 bytes jar/PDConcurrent_sources.jar | Bin 21023 -> 24323 bytes .../java/fybug/nulll/pdconcurrent/SyLock.java | 2 +- .../pdconcurrent/i/AbstractRWSyLock.java | 162 ++++++++++ .../nulll/pdconcurrent/i/AbstractSyLock.java | 285 ++++++++++-------- .../java/fybug/nulll/pdconcurrent/i/Lock.java | 43 +-- .../fybug/nulll/pdconcurrent/i/ReadLock.java | 20 -- .../fybug/nulll/pdconcurrent/i/TryLock.java | 43 +-- .../nulll/pdconcurrent/i/TryReadLock.java | 21 -- .../nulll/pdconcurrent/i/TryWriteLock.java | 21 -- .../fybug/nulll/pdconcurrent/i/WriteLock.java | 20 -- .../nulll/pdconcurrent/i/package-info.java | 2 +- .../pdconcurrent/i/simple/LockSimple.java | 41 +++ .../pdconcurrent/i/simple/ReadLockSimple.java | 21 ++ .../pdconcurrent/i/simple/TryLockSimple.java | 41 +++ .../i/simple/TryReadLockSimple.java | 22 ++ .../i/simple/TryWriteLockSimple.java | 22 ++ .../i/simple/WriteLockSimple.java | 21 ++ .../pdconcurrent/i/simple/package-info.java | 2 +- .../nulll/pdconcurrent/lock/ObjLock.java | 144 +++------ .../fybug/nulll/pdconcurrent/lock/RWLock.java | 195 ++++++------ .../fybug/nulll/pdconcurrent/lock/ReLock.java | 55 ++-- .../nulll/pdconcurrent/lock/package-info.java | 2 +- 26 files changed, 693 insertions(+), 495 deletions(-) create mode 100644 src/main/java/fybug/nulll/pdconcurrent/i/AbstractRWSyLock.java diff --git a/README.md b/README.md index e887932..a63edd0 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,8 @@ void main(String[] args) { **发行版中可以看到全部版本
项目下的 jar 文件夹是当前最新的每夜版** 依赖的同系列项目 -- [PDConcurrent](https://github.com/fybug/PDUtilFunctionExpand) + +- [PDUtilFunctionExpand](https://github.com/fybug/PDUtilFunctionExpand) 可通过 **WIKI** 或者 **doc文档** 深入学习本工具 diff --git a/jar/PDConcurrent.jar b/jar/PDConcurrent.jar index f8e7aac818f72d8e8c4d453d46a608790eed7ac9..ae60b4c11e9f435e917231bbe5ecbc67b4458075 100644 GIT binary patch delta 23075 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 diff --git a/jar/PDConcurrent_all.jar b/jar/PDConcurrent_all.jar index d1ced6cd86bac57085903df475f0c12dbae78a5d..e2554b07403f9edca5efb5c39de7639aad759061 100644 GIT binary patch delta 43010 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 delta 35350 zcmZ6yV{~O}xGWqS9XsjRw!7n`W81c!td3S}+h)hsij9tq?%4L1z0bY(8~e;L$9%?^ zKi03RdaB-<>pmH>atQ)i@dqRnCKwnT92mCNNIWtXq2DWB60UUu&Nw&KL(OK?c zsJjH-S?DTr^S$WXU)dMfXOd^sRV$lZ9}H}WkzngHo?bzZX~Bd2tef?Nzf3)^Z+i-0 z?X2qHsGWR`V7`}#ss^kz0KE7{BL#^m%Gxwq$=)ram6UnfZR8M1Iz^x}5f->A+1D>Q zX$pU-$laN;m8WKW$r3ZLXXa#rMZzuk($TE=1cXh7 z`pJ`*gD3eaAeRHHA?ybAd52{b_D_>c%xrJ=@Ib_|JS$K6>l3o80Ja8M_c_z^rhG?Z zGx1+Czl}3v+QFJlLVM-SzV3-*LrQofVu0uNh220f<}U;+hE?xz24qm)U8-{3#K+5K z);rb0Dl%uDPOsGCC^ymngyBFql=U}x!>j&=k>Pd5Kyhl zJx4CFm@o}p{8v`X1>z+~?|n=V3*)h((Vmj4-pe@L&3)iG(&iKnyl=Oea&Z|$m;MKi zGUl?1GUfWp3Ss_6&##159A#i)hKw`)Qmqa|%R#Ui!JMKg1whqCRaGO3oyZsLb;60wCY6*T>&H{=k!}lQ#v|2M6;yJABFfMx>#h#)5dVn z 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≀RA15LhW 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 diff --git a/jar/PDConcurrent_bin.jar b/jar/PDConcurrent_bin.jar index d35d3bde28737600595d4f87a3639d8b8c85037a..b505829e940cda7ee47ffd980a01b0cfb5b9d6d0 100644 GIT binary patch delta 23187 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 delta 18704 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 F3III)@6iAN diff --git a/jar/PDConcurrent_sources.jar b/jar/PDConcurrent_sources.jar index 5c05c9d59966f38de85885ff0740f1358a7af142..a8a8271e7a8200bb21780a73b8e6d962fbd50135 100644 GIT binary patch delta 19946 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 J9a;bU{{h=B1`q%M delta 16752 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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 e21646b..732c7cb 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/SyLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/SyLock.java @@ -20,7 +20,7 @@ import jakarta.validation.constraints.NotNull; * 使用 {@code new**Lock()} 的方法获取不同并发管理的实例
* * @author fybug - * @version 0.1.3 + * @version 0.1.4 * @since PDConcurrent 0.0.1 */ @SuppressWarnings("unused") diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractRWSyLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractRWSyLock.java new file mode 100644 index 0000000..92c61fc --- /dev/null +++ b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractRWSyLock.java @@ -0,0 +1,162 @@ +package fybug.nulll.pdconcurrent.i; +import java.util.function.Function; + +import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdutilfunctionexpand.tryFunction; +import fybug.nulll.pdutilfunctionexpand.trySupplier; +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; + +/** + *

读写锁管理基本框架.

+ * 提供了读写锁实现整合接口 + * + * @author fybug + * @version 0.0.1 + * @since i 0.0.3 + */ +@SuppressWarnings("unused") +public abstract +class AbstractRWSyLock extends AbstractSyLock { + protected + AbstractRWSyLock(@NotNull LockThreadContext c) { super(c); } + + /** + * {@inheritDoc} + * + * @param lockType {@inheritDoc} + * @param run {@inheritDoc} + * @param catchby {@inheritDoc} + * @param finaby {@inheritDoc} + * @param {@inheritDoc} + * @param {@inheritDoc} + * + * @return {@inheritDoc} + * + * @throws E1 {@inheritDoc} + * @implNote 使用 {@link #lock(LockType)}、{@link #unlock()} 进行上锁解锁,因此使用两层的异常捕获避免{@code finaby}中抛出异常 + */ + @SuppressWarnings("unchecked") + @Override + protected + R lockimpl(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable tryFunction catchby, + @Nullable Function finaby) throws E1 + { + R o = null; + // 防止finally内的回调抛异常 + try { + try { + // 上锁 + lock(lockType); + // 主要内容 + o = run.get(); + } catch ( Throwable e ) { + // 异常处理 + if ( catchby != null ) + o = catchby.apply((E) e); + } finally { + // 收尾 + if ( finaby != null ) + o = finaby.apply(o); + } + } finally { + unlock(); + removeLockThreadContext(); + } + return o; + } + + /** + * {@inheritDoc} + * + * @param lockType {@inheritDoc} + * @param run {@inheritDoc} + * @param catchby {@inheritDoc} + * @param finaby {@inheritDoc} + * @param {@inheritDoc} + * @param {@inheritDoc} + * + * @return {@inheritDoc} + * + * @throws E1 {@inheritDoc} + * @implNote 使用 {@link #trylock(LockType)}、{@link #unlock()} 进行上锁解锁,因此使用两层的异常捕获避免{@code finaby}中抛出异常 + */ + @SuppressWarnings("unchecked") + @Override + protected + R trylockimpl(@NotNull LockType lockType, + @NotNull tryFunction run, + @Nullable tryFunction catchby, + @Nullable Function finaby) throws E1 + { + R o = null; + // 防止finally内的回调抛异常 + try { + try { + // 上锁 + o = run.apply(trylock(lockType)); + } catch ( Throwable e ) { + // 异常处理 + if ( catchby != null ) + o = catchby.apply((E) e); + } finally { + // 收尾 + if ( finaby != null ) + o = finaby.apply(o); + } + } finally { + unlock(); + removeLockThreadContext(); + } + return o; + } + + /** + * 上锁函数 + *

+ * 按照设置的上下文参数要求可能会因为线程被中断而抛出{@link InterruptedException}异常 + * + * @param lockType 锁类型 + * + * @implSpec 在此处实现上锁功能,实现时应该支持根据上下文选择是否使用可以被线程中断的上锁方式 + */ + protected abstract + void lock(@NotNull LockType lockType); + + /** + * 尝试上锁函数 + * + * @param lockType 锁类型 + * + * @return 是否成功上锁 + * + * @implSpec 在此处实现尝试上锁功能,实现时应该支持上下文参数 + */ + protected abstract + boolean trylock(@NotNull LockType lockType); + + /** + * 解锁函数 + * + * @implSpec 在此处实现解锁功能,解锁的类型按照最后上锁的类型处理 + */ + public abstract + void unlock(); + + /** + * 检查锁是否被占用 + * + * @return 是否被占用 + */ + public abstract + boolean isLocked(); + + /** + * 检查当前线程是否持有锁 + * + * @return 当前线程是否持有锁 + */ + public abstract + boolean isLockedCurrentThread(); +} diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java index b9ed8cc..130072e 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/AbstractSyLock.java @@ -1,4 +1,5 @@ package fybug.nulll.pdconcurrent.i; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import fybug.nulll.pdconcurrent.SyLock; @@ -7,17 +8,78 @@ import fybug.nulll.pdutilfunctionexpand.tryFunction; import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; /** - *

读写锁管理基本框架.

+ *

锁管理基本框架.

+ * 提供了锁行为的实现整合
+ * 支持通过主动设置当前线程的上下文参数{@link LockThreadContext}改变锁行为甚至当前线程使用的锁对象,默认使用{@link #defaultLockThreadContext}
+ * 需要注意的是,设置为{@link #defaultLockThreadContext}的对象不应该被修改,否则可能会导致没有独立设置上下文的锁发生异常,更新{@link #defaultLockThreadContext}时也应该传入新的对象,至少不能是同一个对象 * * @author fybug * @version 0.0.1 - * @since i 0.0.1 + * @see LockThreadContext + * @since i 0.0.3 */ @SuppressWarnings("unused") public abstract -class AbstractSyLock implements SyLock { +class AbstractSyLock implements SyLock { + /** 线程的锁上下文 */ + @NotNull protected final ThreadLocal> lockThreadContext = new ThreadLocal<>(); + /** 默认锁上下文 */ + @NotNull protected LockThreadContext defaultLockThreadContext; + + protected + AbstractSyLock(@NotNull LockThreadContext c) { this.defaultLockThreadContext = c; } + + /** + * 锁运行具体实现 + *

+ * {@link #lock(LockType, trySupplier, Function)}与{@link #lock(LockType, trySupplier, Function, Function)}底层实现,要求同时覆盖两个接口的规范,同时应该支持上下文参数{@link LockThreadContext}
+ * 通过{@code catchby}传入的值决定异常的处理 + * + * @param lockType 锁类型 + * @param run 带返回的回调 + * @param catchby 进入catch块后的回调,传入当前异常,如果需要无视并不抛出异常则传入{@code null} + * @param finaby 进入finally块后的回调,传入前一个回调的返回值,遇到异常传入{@code null} + * @param 要返回的数据类型 + * @param 运行时异常类型 + * + * @return 回调返回的内容,中途二次抛出异常时不返回 + * + * @throws E1 二次抛出的异常类型 + * @implSpec {@code catchby}传入为{@code null}时应该无视并不抛出异常,同时给{@code finaby}的值为{@code null} + */ + abstract protected + R lockimpl(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable tryFunction catchby, + @Nullable Function finaby) throws E1; + + /** + * 尝试上锁运行具体实现 + *

+ * {@link #trylock(LockType, tryFunction, Function)}与{@link #trylock(LockType, tryFunction, Function, Function)}底层实现,要求同时覆盖两个接口的规范,同时应该支持上下文参数{@link LockThreadContext}
+ * 通过{@code catchby}传入的值决定异常的处理 + * + * @param lockType 锁类型 + * @param run 带返回的回调,传入参数是否获取到锁 + * @param catchby 进入catch块后的回调,传入当前异常,如果需要无视并不抛出异常则传入{@code null} + * @param finaby 进入finally块后的回调,传入前一个回调的返回值,遇到异常传入{@code null} + * @param 要返回的数据类型 + * @param 运行时异常类型 + * + * @return 回调返回的内容,中途二次抛出异常时不返回 + * + * @throws E1 二次抛出的异常类型 + * @implSpec {@code catchby}传入为{@code null}时应该无视并不抛出异常,同时给{@code finaby}的值为{@code null} + */ + abstract protected + R trylockimpl(@NotNull LockType lockType, + @NotNull tryFunction run, + @Nullable tryFunction catchby, + @Nullable Function finaby) throws E1; + /** * {@inheritDoc} * @@ -26,39 +88,17 @@ class AbstractSyLock implements SyLock { * @param catchby {@inheritDoc} * @param finaby {@inheritDoc} * @param {@inheritDoc} + * @param {@inheritDoc} * * @return {@inheritDoc} * - * @implNote 使用 {@link #lock(LockType)} 与 {@link #unlock()} 方法实现上锁与解锁 + * @see #lockimpl(LockType, trySupplier, tryFunction, Function) */ - @SuppressWarnings("unchecked") @Override public R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby) - { - R o = null; - // 防止finally内的回调抛异常 - try { - try { - // 上锁 - lock(lockType); - // 主要内容 - o = run.get(); - } catch ( Throwable e ) { - // 异常处理 - if ( catchby != null ) - o = catchby.apply((E) e); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); - } - } finally { - unlock(); - } - return o; - } + { return lockimpl(lockType, run, catchby == null ? null : catchby::apply, finaby); } /** * {@inheritDoc} @@ -67,34 +107,18 @@ class AbstractSyLock implements SyLock { * @param run {@inheritDoc} * @param finaby {@inheritDoc} * @param {@inheritDoc} + * @param {@inheritDoc} * * @return {@inheritDoc} * - * @implNote 使用 {@link #lock(LockType)} 与 {@link #unlock()} 方法实现上锁与解锁 + * @throws E {@inheritDoc} + * @see #lockimpl(LockType, trySupplier, tryFunction, Function) */ @Override public R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function finaby) throws E - { - R o = null; - // 防止finally内的回调抛异常 - try { - try { - // 上锁 - lock(lockType); - // 主要内容 - o = run.get(); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); - } - } finally { - unlock(); - } - return o; - } + { return lockimpl(lockType, run, e -> { throw e; }, finaby); } /** * {@inheritDoc} @@ -104,37 +128,17 @@ class AbstractSyLock implements SyLock { * @param catchby {@inheritDoc} * @param finaby {@inheritDoc} * @param {@inheritDoc} + * @param {@inheritDoc} * * @return {@inheritDoc} * - * @implNote 使用 {@link #trylock(LockType)} 与 {@link #unlock()} 方法实现上锁与解锁 + * @see #trylockimpl(LockType, tryFunction, tryFunction, Function) */ - @SuppressWarnings("unchecked") @Override public R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function catchby, @Nullable Function finaby) - { - R o = null; - // 防止finally内的回调抛异常 - try { - try { - // 上锁 - o = run.apply(trylock(lockType)); - } catch ( Throwable e ) { - // 异常处理 - if ( catchby != null ) - o = catchby.apply((E) e); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); - } - } finally { - unlock(); - } - return o; - } + { return trylockimpl(lockType, run, catchby == null ? null : catchby::apply, finaby); } /** * {@inheritDoc} @@ -143,78 +147,121 @@ class AbstractSyLock implements SyLock { * @param run {@inheritDoc} * @param finaby {@inheritDoc} * @param {@inheritDoc} + * @param {@inheritDoc} * * @return {@inheritDoc} * - * @throws Exception {@inheritDoc} - * @implNote 使用 {@link #trylock(LockType)} 与 {@link #unlock()} 方法实现上锁与解锁 + * @throws E {@inheritDoc} + * @see #trylockimpl(LockType, tryFunction, tryFunction, Function) */ @Override public R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function finaby) throws E - { - R o = null; - // 防止finally内的回调抛异常 - try { - try { - // 上锁 - o = run.apply(trylock(lockType)); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); - } - } finally { - unlock(); - } - return o; - } + { return trylockimpl(lockType, run, e -> { throw e; }, finaby); } /** - * 上锁函数 + * 更新默认锁上下文参数 + *

+ * 该方法是非线程安全的,因为每次执行前都会先保存默认参数的引用,更新时应该传入一个新的参数对象,至少不能是同一个对象 * - * @param lockType 锁类型 - * - * @throws E 可能抛出的异常 - * @implSpec 在此处实现上锁功能 + * @param lockThreadContext 新的默认上下文参数 */ - protected abstract - void lock(@NotNull LockType lockType) throws E; + public + void setDefaultLockThreadContext(@NotNull LockThreadContext lockThreadContext) { + this.defaultLockThreadContext = lockThreadContext; + } + + /** 获取当前默认上下文参数 */ + @NotNull + public + LockThreadContext defaultLockThreadContext() { return defaultLockThreadContext; } /** - * 尝试上锁函数 - * - * @param lockType 锁类型 - * - * @return 是否成功上锁 - * - * @implSpec 在此处实现尝试上锁功能 + * 获取当前线程的上下文参数 + *

+ * 如果没有设置独立的上下文参数,则使用{@link #defaultLockThreadContext} */ - protected abstract - boolean trylock(@NotNull LockType lockType); + @NotNull + public + LockThreadContext getLockThreadContext() { + var c = lockThreadContext.get(); + if ( c == null ) + return defaultLockThreadContext; + return c; + } /** - * 解锁函数 - * - * @implSpec 在此处实现解锁功能,解锁的类型按照最后上锁的类型处理 + * 设置当前线程上下文参数 + *

+ * 要求不在锁内使用,否则可能会出现异常 */ - public abstract - void unlock(); + public + void setLockThreadContext(@NotNull LockThreadContext c) { lockThreadContext.set(c); } + + /** + * 移除当前上下文参数 + *

+ * 通常情况下执行结束后会自动移除,但如果手动设置后并没有执行锁的情况下才需要手动移除 + */ + public + void removeLockThreadContext() { lockThreadContext.remove(); } /** - * 检查锁是否被占用 + *

当前线程的锁上下文.

+ * 根据该参数可以改变使用的锁对象,更改当前对象支持的上锁方式,与参数上锁的超时时间等
+ * 参数上锁时间为{@code null}时为不使用带超时功能的参数上锁 + * + * @param 用于上锁的对象 * - * @return 是否被占用 + * @author fybug + * @version 0.0.1 + * @since AbstractSyLock 0.0.1 */ - public abstract - boolean isLocked(); + public static + class LockThreadContext { + /** 本次锁对象 */ + @Setter @Getter @NotNull protected T lock; + /** + * 是否支持线程中断 + * + * @see InterruptedException + */ + @Setter @Getter protected boolean interruptiblyLock; + /** + * 尝试锁时间限制 + *

+ * 传入为{@code null}时为不使用超时功能 + * + * @see InterruptedException + */ + @Setter @Getter @Nullable protected Time tryTimeout; + + public + LockThreadContext(@NotNull T lock, boolean interruptiblyLock, @Nullable Time tryTimeout) { + this.lock = lock; + this.interruptiblyLock = interruptiblyLock; + this.tryTimeout = tryTimeout; + } + } /** - * 检查当前线程是否持有锁 + *

时间对象.

+ * 用于记录时间,支持设置时间类型 * - * @return 当前线程是否持有锁 + * @author fybug + * @version 0.0.1 + * @since AbstractSyLock 0.0.1 */ - public abstract - boolean isLockedCurrentThread(); + public static + class Time { + @Getter protected long timeout; + @Getter @NotNull protected TimeUnit unit; + + public + Time(long timeout, @NotNull TimeUnit unit) { + this.timeout = timeout; + this.unit = unit; + } + } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java b/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java index 1e7f174..0ab3c24 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/Lock.java @@ -1,9 +1,7 @@ package fybug.nulll.pdconcurrent.i; -import java.util.function.Consumer; import java.util.function.Function; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdutilfunctionexpand.tryRunnable; import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -32,6 +30,7 @@ interface Lock { * @param catchby 进入catch块后的回调,传入当前异常 * @param finaby 进入finally块后的回调,传入前两个回调的返回值 * @param 要返回的数据类型 + * @param 运行时异常类型 * * @return 回调返回的内容 * @@ -41,27 +40,6 @@ interface Lock { R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function catchby, @Nullable Function finaby); - /** - * 使用锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function, Function)}的无返回变体 - */ - default - void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Consumer catchby, - @Nullable Runnable finaby) - { - lock(lockType, () -> { - run.run(); - return null; - }, catchby == null ? null : (E e) -> { - catchby.accept(e); - return null; - }, finaby == null ? null : _ -> { - finaby.run(); - return null; - }); - } - /** * 使用锁执行指定回调 *

@@ -72,6 +50,7 @@ interface Lock { * @param run 带返回的回调 * @param finaby 进入finally块后的回调,传入前一个回调的返回值,遇到异常传入{@code null} * @param 要返回的数据类型 + * @param 运行时异常类型 * * @return 回调返回的内容,遇到异常不返回 * @@ -81,22 +60,4 @@ interface Lock { */ R lock(@NotNull LockType lockType, @NotNull trySupplier run, @Nullable Function finaby) throws E; - - /** - * 使用锁执行指定回调 - *

- * {@link #lock(LockType, trySupplier, Function)}的无返回变体 - */ - default - void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Runnable finaby) - throws E - { - lock(lockType, () -> { - run.run(); - return null; - }, finaby == null ? null : _ -> { - finaby.run(); - return null; - }); - } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java index 18eab44..5394324 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/ReadLock.java @@ -1,10 +1,8 @@ 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.i.simple.LockSimple; -import fybug.nulll.pdutilfunctionexpand.tryRunnable; import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -32,15 +30,6 @@ interface ReadLock extends LockSimple { @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); } - /** * 使用读锁执行指定回调 *

@@ -49,13 +38,4 @@ interface ReadLock extends LockSimple { default R read(@NotNull trySupplier run, @Nullable Function finaby) throws E { return lock(LockType.READ, run, finaby); } - - /** - * 使用读锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Runnable)}指定读锁的变种 - */ - default - void read(@NotNull tryRunnable run, @Nullable Runnable finaby) throws E - { lock(LockType.READ, run, finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java index 855ce76..c49cd17 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryLock.java @@ -1,10 +1,8 @@ package fybug.nulll.pdconcurrent.i; import java.util.concurrent.locks.ReentrantLock; -import java.util.function.Consumer; import java.util.function.Function; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdutilfunctionexpand.tryConsumer; import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -31,6 +29,7 @@ interface TryLock { * @param catchby 进入catch块后的回调,传入当前异常 * @param finaby 进入finally块后的回调,传入前两个回调的返回值 * @param 要返回的数据类型 + * @param 运行时异常类型 * * @return 回调返回的内容 * @@ -41,27 +40,6 @@ interface TryLock { R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function catchby, @Nullable Function finaby); - /** - * 尝试使用锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function, Function)}的无返回变体 - */ - default - void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, - @Nullable Consumer catchby, @Nullable Runnable finaby) - { - trylock(lockType, b -> { - run.accept(b); - return null; - }, catchby == null ? null : (E e) -> { - catchby.accept(e); - return null; - }, finaby == null ? null : _ -> { - finaby.run(); - return null; - }); - } - /** * 尝试使用锁执行指定回调 *

@@ -72,6 +50,7 @@ interface TryLock { * @param run 带返回的回调,传入参数是否获取到锁 * @param finaby 进入finally块后的回调,传入前两个回调的返回值,遇到异常传入{@code null} * @param 要返回的数据类型 + * @param 运行时异常类型 * * @return 回调返回的内容,遇到异常不返回 * @@ -82,22 +61,4 @@ interface TryLock { */ R trylock(@NotNull LockType lockType, @NotNull tryFunction run, @Nullable Function finaby) throws E; - - /** - * 尝试使用锁执行指定回调 - *

- * {@link #trylock(LockType, tryFunction, Function)}的无返回变体 - */ - default - void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, - @Nullable Runnable finaby) throws E - { - trylock(lockType, b -> { - run.accept(b); - return null; - }, finaby == null ? null : _ -> { - finaby.run(); - return null; - }); - } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java index 97e548f..33de187 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryReadLock.java @@ -1,10 +1,8 @@ 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.i.simple.TryLockSimple; -import fybug.nulll.pdutilfunctionexpand.tryConsumer; import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -32,16 +30,6 @@ interface TryReadLock extends TryLockSimple { @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); } - /** * 尝试使用读锁执行指定回调 *

@@ -50,13 +38,4 @@ interface TryReadLock extends TryLockSimple { default R tryread(@NotNull tryFunction run, @Nullable Function finaby) throws E { return trylock(LockType.READ, run, finaby); } - - /** - * 尝试使用读锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Runnable)}指定读锁的变种 - */ - default - void tryread(@NotNull tryConsumer run, @Nullable Runnable finaby) throws E - { trylock(LockType.READ, run, finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java b/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java index 6c7b799..45002f5 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/TryWriteLock.java @@ -1,10 +1,8 @@ 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.i.simple.TryLockSimple; -import fybug.nulll.pdutilfunctionexpand.tryConsumer; import fybug.nulll.pdutilfunctionexpand.tryFunction; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -32,16 +30,6 @@ interface TryWriteLock extends TryLockSimple { @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); } - /** * 尝试使用写锁执行指定回调 *

@@ -50,13 +38,4 @@ interface TryWriteLock extends TryLockSimple { default R trywrite(@NotNull tryFunction run, @Nullable Function finaby) throws E { return trylock(LockType.WRITE, run, finaby); } - - /** - * 尝试使用写锁执行指定回调 - *

- * {@link #trylock(LockType, tryConsumer, Runnable)}指定写锁的变种 - */ - default - void trywrite(@NotNull tryConsumer run, @Nullable Runnable finaby) throws E - { 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 index 51dfbf1..5021880 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/WriteLock.java @@ -1,10 +1,8 @@ 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.i.simple.LockSimple; -import fybug.nulll.pdutilfunctionexpand.tryRunnable; import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; @@ -32,15 +30,6 @@ interface WriteLock extends LockSimple { @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); } - /** * 使用写锁执行指定回调 *

@@ -49,13 +38,4 @@ interface WriteLock extends LockSimple { default R write(@NotNull trySupplier run, @Nullable Function finaby) throws E { return lock(LockType.WRITE, run, finaby); } - - /** - * 使用写锁执行指定回调 - *

- * {@link #lock(LockType, tryRunnable, Runnable)}指定写锁的变种 - */ - default - void write(@NotNull tryRunnable run, @Nullable Runnable finaby) throws E - { 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 0449558..6e50297 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.2 + * @version 0.0.3 * @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 index a8d5384..8d8dbca 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/LockSimple.java @@ -1,10 +1,12 @@ package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Consumer; import java.util.function.Function; import fybug.nulll.pdconcurrent.e.LockType; import fybug.nulll.pdconcurrent.i.Lock; import fybug.nulll.pdutilfunctionexpand.tryRunnable; import fybug.nulll.pdutilfunctionexpand.trySupplier; +import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; /** @@ -16,6 +18,45 @@ import jakarta.validation.constraints.NotNull; */ public interface LockSimple extends Lock { + /** + * 使用锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function, Function)}的无返回变体 + */ + default + void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Consumer catchby, + @Nullable Runnable finaby) + { + lock(lockType, () -> { + run.run(); + return null; + }, catchby == null ? null : (E e) -> { + catchby.accept(e); + return null; + }, finaby == null ? null : _ -> { + finaby.run(); + return null; + }); + } + + /** + * 使用锁执行指定回调 + *

+ * {@link #lock(LockType, trySupplier, Function)}的无返回变体 + */ + default + void lock(@NotNull LockType lockType, @NotNull tryRunnable run, @Nullable Runnable finaby) + throws E + { + lock(lockType, () -> { + run.run(); + return null; + }, finaby == null ? null : _ -> { + finaby.run(); + return 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 index 524975a..49aa85a 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/ReadLockSimple.java @@ -1,8 +1,11 @@ package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Consumer; + import fybug.nulll.pdconcurrent.e.LockType; import fybug.nulll.pdconcurrent.i.ReadLock; import fybug.nulll.pdutilfunctionexpand.tryRunnable; import fybug.nulll.pdutilfunctionexpand.trySupplier; +import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; /** @@ -15,6 +18,24 @@ import jakarta.validation.constraints.NotNull; @SuppressWarnings("unused") public interface ReadLockSimple extends ReadLock { + /** + * 使用读锁执行指定回调 + *

+ * {@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, tryRunnable, Runnable)}指定读锁的变种 + */ + default + void read(@NotNull tryRunnable run, @Nullable Runnable finaby) throws E + { lock(LockType.READ, run, finaby); } + /** * 使用读锁执行指定回调 *

diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java index a142b79..0e1e523 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryLockSimple.java @@ -1,10 +1,12 @@ package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Consumer; import java.util.function.Function; import fybug.nulll.pdconcurrent.e.LockType; import fybug.nulll.pdconcurrent.i.TryLock; import fybug.nulll.pdutilfunctionexpand.tryConsumer; import fybug.nulll.pdutilfunctionexpand.tryFunction; +import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; /** @@ -16,6 +18,45 @@ import jakarta.validation.constraints.NotNull; */ public interface TryLockSimple extends TryLock { + /** + * 尝试使用锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function, Function)}的无返回变体 + */ + default + void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, + @Nullable Consumer catchby, @Nullable Runnable finaby) + { + trylock(lockType, b -> { + run.accept(b); + return null; + }, catchby == null ? null : (E e) -> { + catchby.accept(e); + return null; + }, finaby == null ? null : _ -> { + finaby.run(); + return null; + }); + } + + /** + * 尝试使用锁执行指定回调 + *

+ * {@link #trylock(LockType, tryFunction, Function)}的无返回变体 + */ + default + void trylock(@NotNull LockType lockType, @NotNull tryConsumer run, + @Nullable Runnable finaby) throws E + { + trylock(lockType, b -> { + run.accept(b); + return null; + }, finaby == null ? null : _ -> { + finaby.run(); + return 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 index 8b94cfd..1ff942e 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryReadLockSimple.java @@ -1,8 +1,11 @@ package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Consumer; + import fybug.nulll.pdconcurrent.e.LockType; import fybug.nulll.pdconcurrent.i.TryReadLock; import fybug.nulll.pdutilfunctionexpand.tryConsumer; import fybug.nulll.pdutilfunctionexpand.tryFunction; +import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; /** @@ -15,6 +18,25 @@ import jakarta.validation.constraints.NotNull; @SuppressWarnings("unused") public interface TryReadLockSimple extends TryReadLock { + /** + * 尝试使用读锁执行指定回调 + *

+ * {@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, tryConsumer, Runnable)}指定读锁的变种 + */ + default + void tryread(@NotNull tryConsumer run, @Nullable Runnable finaby) throws E + { trylock(LockType.READ, run, finaby); } + /** * 尝试使用读锁执行指定回调 *

diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java index 54e37bc..085f5ae 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/TryWriteLockSimple.java @@ -1,8 +1,11 @@ package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Consumer; + import fybug.nulll.pdconcurrent.e.LockType; import fybug.nulll.pdconcurrent.i.TryWriteLock; import fybug.nulll.pdutilfunctionexpand.tryConsumer; import fybug.nulll.pdutilfunctionexpand.tryFunction; +import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; /** @@ -15,6 +18,25 @@ import jakarta.validation.constraints.NotNull; @SuppressWarnings("unused") public interface TryWriteLockSimple extends TryWriteLock { + /** + * 尝试使用写锁执行指定回调 + *

+ * {@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, tryConsumer, Runnable)}指定写锁的变种 + */ + default + void trywrite(@NotNull tryConsumer run, @Nullable Runnable finaby) throws E + { trylock(LockType.WRITE, run, finaby); } + /** * 尝试使用写锁执行指定回调 *

diff --git a/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java b/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java index 0e97709..14770d2 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/WriteLockSimple.java @@ -1,8 +1,11 @@ package fybug.nulll.pdconcurrent.i.simple; +import java.util.function.Consumer; + import fybug.nulll.pdconcurrent.e.LockType; import fybug.nulll.pdconcurrent.i.WriteLock; import fybug.nulll.pdutilfunctionexpand.tryRunnable; import fybug.nulll.pdutilfunctionexpand.trySupplier; +import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; /** @@ -15,6 +18,24 @@ import jakarta.validation.constraints.NotNull; @SuppressWarnings("unused") public interface WriteLockSimple extends WriteLock { + /** + * 使用写锁执行指定回调 + *

+ * {@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, tryRunnable, Runnable)}指定写锁的变种 + */ + default + void write(@NotNull tryRunnable run, @Nullable Runnable finaby) throws E + { lock(LockType.WRITE, run, finaby); } + /** * 使用写锁执行指定回调 *

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 index 9b0b93a..8a2cd51 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/i/simple/package-info.java +++ b/src/main/java/fybug/nulll/pdconcurrent/i/simple/package-info.java @@ -4,6 +4,6 @@ * * @author fybug * @version 0.0.1 - * @since PDConcurrent 0.1.3 + * @since i 0.0.2 */ package fybug.nulll.pdconcurrent.i.simple; \ No newline at end of file diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java b/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java index aa71b6f..6cf8cae 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/ObjLock.java @@ -1,17 +1,17 @@ package fybug.nulll.pdconcurrent.lock; import java.util.function.Function; -import fybug.nulll.pdconcurrent.SyLock; import fybug.nulll.pdconcurrent.e.LockType; +import fybug.nulll.pdconcurrent.i.AbstractSyLock; import fybug.nulll.pdutilfunctionexpand.tryFunction; import fybug.nulll.pdutilfunctionexpand.trySupplier; import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; -import lombok.Getter; /** *

使用传统并发管理的实现.

- * 使用{@code synchronized( Object )}实现并发域,读写锁均为同一个实现 + * 使用{@code synchronized( Object )}实现并发域,读写锁均为同一个实现
+ * 因此也无法使用尝试上锁,其结果始终为{@code true} *

* 使用并发管理: * {@snippet lang = java: @@ -29,16 +29,13 @@ import lombok.Getter; * }} * * @author fybug - * @version 0.1.2 + * @version 0.1.3 + * @see AbstractSyLock * @since lock 0.0.1 */ @SuppressWarnings("unused") -@Getter public -class ObjLock implements SyLock { - /** 作为锁的对象 */ - private final Object LOCK; - +class ObjLock extends AbstractSyLock { /** * 构建并发管理 *

@@ -55,7 +52,7 @@ class ObjLock implements SyLock { * @since 0.1.0 */ public - ObjLock(@NotNull Object lock) { LOCK = lock; } + ObjLock(@NotNull Object lock) { super(new LockThreadContext<>(lock, false, null)); } /** * {@inheritDoc} @@ -65,36 +62,24 @@ class ObjLock implements SyLock { * @param catchby {@inheritDoc} * @param finaby {@inheritDoc} * @param {@inheritDoc} + * @param {@inheritDoc} * * @return {@inheritDoc} * - * @implNote 使用 {@code synchronized( Object )} 实现的隐式并发域 - * @since 0.1.0 + * @throws E1 {@inheritDoc} + * @implNote 使用java自带的synchronized进行上锁,因此无需进行二层异常捕获与解锁 + * @since ObjLock 0.1.3 */ @SuppressWarnings("unchecked") - @Override public - R lock(@NotNull LockType lockType, @NotNull trySupplier run, - @Nullable Function catchby, @Nullable Function finaby) + R lockimpl(@NotNull LockType lockType, @NotNull trySupplier run, + @Nullable tryFunction catchby, + @Nullable Function finaby) throws E1 { R o = null; - // 不上锁 - if ( lockType == LockType.NOLOCK ) { - try { - // 主要内容 - o = run.get(); - } catch ( Throwable e ) { - // 异常处理 - if ( catchby != null ) - o = catchby.apply((E) e); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); - } - } else { - // 上锁 - synchronized ( LOCK ){ + try { + // 不上锁 + if ( lockType == LockType.NOLOCK ) { try { // 主要内容 o = run.get(); @@ -107,52 +92,25 @@ class ObjLock implements SyLock { if ( finaby != null ) o = finaby.apply(o); } - } - } - return o; - } - - /** - * {@inheritDoc} - * - * @param lockType {@inheritDoc} - * @param run {@inheritDoc} - * @param finaby {@inheritDoc} - * @param {@inheritDoc} - * - * @return {@inheritDoc} - * - * @implNote 使用 {@code synchronized( Object )} 实现的隐式并发域 - * @since 0.1.2 - */ - @Override - public - R lock(@NotNull LockType lockType, @NotNull trySupplier run, - @Nullable Function finaby) throws E - { - R o = null; - // 不上锁 - if ( lockType == LockType.NOLOCK ) { - try { - // 主要内容 - o = run.get(); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); - } - } else { - // 上锁 - synchronized ( LOCK ){ - try { - // 主要内容 - o = run.get(); - } finally { - // 收尾 - if ( finaby != null ) - o = finaby.apply(o); + } else { + // 上锁 + synchronized ( getLockThreadContext().getLock() ){ + try { + // 主要内容 + o = run.get(); + } catch ( Throwable e ) { + // 异常处理 + if ( catchby != null ) + o = catchby.apply((E) e); + } finally { + // 收尾 + if ( finaby != null ) + o = finaby.apply(o); + } } } + } finally { + removeLockThreadContext(); } return o; } @@ -165,33 +123,19 @@ class ObjLock implements SyLock { * @param catchby {@inheritDoc} * @param finaby {@inheritDoc} * @param {@inheritDoc} + * @param {@inheritDoc} * * @return {@inheritDoc} * - * @since 0.1.2 + * @throws E1 {@inheritDoc} + * @implNote 无法尝试上锁,直接使用{@link #lockimpl(LockType, trySupplier, tryFunction, Function)}实现 + * @since ObjLock 0.1.3 */ @Override - public - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, - @Nullable Function catchby, @Nullable Function finaby) - { return lock(lockType, () -> run.apply(true), catchby, finaby); } - - /** - * {@inheritDoc} - * - * @param lockType {@inheritDoc} - * @param run {@inheritDoc} - * @param finaby {@inheritDoc} - * @param {@inheritDoc} - * - * @return {@inheritDoc} - * - * @throws Exception {@inheritDoc} - * @since 0.1.2 - */ - @Override - public - R trylock(@NotNull LockType lockType, @NotNull tryFunction run, - @Nullable Function finaby) throws E - { return lock(lockType, () -> run.apply(true), finaby); } + protected + R trylockimpl(@NotNull LockType lockType, + @NotNull tryFunction run, + @Nullable tryFunction catchby, + @Nullable Function finaby) throws E1 + { return lockimpl(lockType, () -> run.apply(true), catchby, finaby); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java b/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java index 4845fad..8ddae39 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/RWLock.java @@ -1,18 +1,18 @@ package fybug.nulll.pdconcurrent.lock; import java.util.LinkedList; +import java.util.WeakHashMap; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantReadWriteLock; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.i.AbstractSyLock; +import fybug.nulll.pdconcurrent.i.AbstractRWSyLock; import jakarta.validation.constraints.NotNull; -import lombok.Getter; +import lombok.SneakyThrows; /** *

使用{@link ReentrantReadWriteLock}实现的并发管理.

* 使用{@link ReentrantReadWriteLock}实现并发域,读写锁均为标准实现,支持通过{@link #toread()}进行锁降级
- * 使用可中断的上锁操作{@link ReentrantReadWriteLock.ReadLock#lockInterruptibly()}和{@link ReentrantReadWriteLock.WriteLock#lockInterruptibly()}实现上锁
* 支持使用{@link #newReadCondition()}{@link #newWriteCondition()}获取{@link Condition} *

* 使用并发管理: @@ -46,22 +46,15 @@ import lombok.Getter; * }} * * @author fybug - * @version 0.1.1 + * @version 0.1.2 * @see ReentrantReadWriteLock * @see ReentrantReadWriteLock.ReadLock * @see ReentrantReadWriteLock.WriteLock * @since lock 0.0.1 */ @SuppressWarnings("unused") -@Getter public -class RWLock extends AbstractSyLock { - /** 锁 */ - private final ReentrantReadWriteLock LOCK; - /** 读锁 */ - private final ReentrantReadWriteLock.ReadLock Read_LOCK; - /** 写锁 */ - private final ReentrantReadWriteLock.WriteLock Write_LOCK; +class RWLock extends AbstractRWSyLock { /** * 每个线程的锁状态记录 * @@ -73,13 +66,13 @@ class RWLock extends AbstractSyLock { * * @since 0.1.1 */ - private final AtomicLong READ_LOCK_COUNTER = new AtomicLong(); + private final WeakHashMap READ_LOCK_COUNTER = new WeakHashMap<>(); /** * 写锁计数 * * @since 0.1.1 */ - private final AtomicLong WRITE_LOCK_COUNTER = new AtomicLong(); + private final WeakHashMap WRITE_LOCK_COUNTER = new WeakHashMap<>(); /** * 构建并发管理 @@ -105,11 +98,7 @@ class RWLock extends AbstractSyLock { * @since 0.1.0 */ public - RWLock(@NotNull ReentrantReadWriteLock lock) { - LOCK = lock; - Read_LOCK = LOCK.readLock(); - Write_LOCK = LOCK.writeLock(); - } + RWLock(@NotNull ReentrantReadWriteLock lock) { super(new LockThreadContext<>(lock, true, null)); } /** * 获取当前线程锁记录 @@ -131,35 +120,65 @@ class RWLock extends AbstractSyLock { return l; } + /** + * 获取当前线程读锁计数 + * + * @return 读锁计数对象 + * + * @since 0.1.2 + */ + @NotNull + private + AtomicLong getReadLockCounter(@NotNull ReentrantReadWriteLock lock) + { return READ_LOCK_COUNTER.computeIfAbsent(lock, k -> new AtomicLong()); } + + /** + * 获取当前线程写锁计数 + * + * @return 写锁计数对象 + * + * @since 0.1.2 + */ + @NotNull + private + AtomicLong getWriteLockCounter(@NotNull ReentrantReadWriteLock lock) + { return WRITE_LOCK_COUNTER.computeIfAbsent(lock, k -> new AtomicLong()); } + /** * {@inheritDoc} * * @param lockType {@inheritDoc} * - * @throws Exception {@inheritDoc} - * @implNote 使用 {@link ReentrantReadWriteLock} 实现的并发域,使用了{@code lockInterruptibly()}进行可中断的上锁操作
+ * @implNote 常规锁使用 {@code lock()}上锁,可中断锁使用{@code lockInterruptibly()}操作
* 会记录本次锁类型并记录读写锁的计数 * @since 0.1.1 */ + @SneakyThrows @Override protected - void lock(@NotNull LockType lockType) throws InterruptedException { - // 获取记录列表 - var l = getCurrentThreadLockState(); + void lock(@NotNull LockType lockType) { + var c = getLockThreadContext(); // 检查锁类型进行上锁,并更新对应锁计数 if ( lockType != LockType.NOLOCK ) { if ( lockType == LockType.READ ) { - Read_LOCK.lockInterruptibly(); - READ_LOCK_COUNTER.getAndIncrement(); + // 上锁 + if ( c.isInterruptiblyLock() ) + c.getLock().readLock().lockInterruptibly(); + else + c.getLock().readLock().lock(); + getReadLockCounter(c.getLock()).getAndIncrement(); } else if ( lockType == LockType.WRITE ) { - Write_LOCK.lockInterruptibly(); - WRITE_LOCK_COUNTER.getAndIncrement(); + // 上锁 + if ( c.isInterruptiblyLock() ) + c.getLock().writeLock().lockInterruptibly(); + else + c.getLock().writeLock().lock(); + getWriteLockCounter(c.getLock()).getAndIncrement(); } // 记录本次锁类型 - l.add(lockType); - } else if ( l.isEmpty() ) { + getCurrentThreadLockState().add(lockType); + } else if ( getCurrentThreadLockState().isEmpty() ) LOCK_STATE.remove(); - } } /** @@ -169,38 +188,45 @@ class RWLock extends AbstractSyLock { * * @return {@inheritDoc} * - * @implNote 使用 {@link ReentrantReadWriteLock} 实现的并发域,使用了{@code trylock()}实现
- * 会记录本次锁类型并记录读写锁的计数 + * @implNote 使用 {@code trylock()} 实现,会记录本次锁类型并记录读写锁的计数 * @since 0.1.1 */ + @SuppressWarnings("ConstantValue") + @SneakyThrows @Override protected boolean trylock(@NotNull LockType lockType) { - // 获取记录列表 - var l = getCurrentThreadLockState(); // 是否成功 boolean success = false; + var c = getLockThreadContext(); + var t = c.getTryTimeout(); // 检查锁类型并上锁 if ( lockType != LockType.NOLOCK ) { - if ( lockType == LockType.READ ) - success = Read_LOCK.tryLock(); - else if ( lockType == LockType.WRITE ) - success = Write_LOCK.tryLock(); + if ( lockType == LockType.READ ) { + if ( t == null ) + success = c.getLock().readLock().tryLock(); + else + success = c.getLock().readLock().tryLock(t.getTimeout(), t.getUnit()); + } else if ( lockType == LockType.WRITE ) { + if ( t == null ) + success = c.getLock().writeLock().tryLock(); + else + success = c.getLock().writeLock().tryLock(t.getTimeout(), t.getUnit()); + } } + // 是否成功 if ( success ) { - // 记录本次锁类型 - l.add(lockType); // 更新对应锁计数 if ( lockType == LockType.READ ) - READ_LOCK_COUNTER.getAndIncrement(); - else // noinspection ConstantValue - if ( lockType == LockType.WRITE ) - WRITE_LOCK_COUNTER.getAndIncrement(); - } else if ( l.isEmpty() ) { + getReadLockCounter(c.getLock()).getAndIncrement(); + else if ( lockType == LockType.WRITE ) + getWriteLockCounter(c.getLock()).getAndIncrement(); + // 记录本次锁类型 + getCurrentThreadLockState().add(lockType); + } else if ( getCurrentThreadLockState().isEmpty() ) LOCK_STATE.remove(); - } return success; } @@ -225,16 +251,16 @@ class RWLock extends AbstractSyLock { LOCK_STATE.remove(); return; } - + var c = getLockThreadContext(); // 获取最后锁类型 var lockType = l.removeLast(); // 检查锁类型解锁,并更新对应锁计数 if ( lockType == LockType.READ ) { - Read_LOCK.unlock(); - READ_LOCK_COUNTER.getAndDecrement(); + c.getLock().readLock().unlock(); + getReadLockCounter(c.getLock()).getAndDecrement(); } else if ( lockType == LockType.WRITE ) { - Write_LOCK.unlock(); - WRITE_LOCK_COUNTER.getAndDecrement(); + c.getLock().writeLock().unlock(); + getWriteLockCounter(c.getLock()).getAndDecrement(); } // 记录清空 @@ -255,6 +281,7 @@ class RWLock extends AbstractSyLock { boolean toread() { // 获取记录列表 var l = getCurrentThreadLockState(); + var c = getLockThreadContext(); // 没有上锁 if ( l.isEmpty() ) { LOCK_STATE.remove(); @@ -268,22 +295,23 @@ class RWLock extends AbstractSyLock { return true; else if ( lockType == LockType.WRITE ) { // 锁降级 - Read_LOCK.lock(); - Write_LOCK.unlock(); + c.getLock().readLock().lock(); + c.getLock().writeLock().unlock(); // 更新记录 - l.set(l.size() - 1, LockType.WRITE); + l.set(l.size() - 1, LockType.READ); // 更新计数 - WRITE_LOCK_COUNTER.getAndDecrement(); - READ_LOCK_COUNTER.getAndIncrement(); + getWriteLockCounter(c.getLock()).getAndDecrement(); + getReadLockCounter(c.getLock()).getAndIncrement(); return true; } return false; } /** - * 检查锁是否被占用 + * /** + * {@inheritDoc} * - * @return 是否被占用 + * @return {@inheritDoc} * * @since 0.1.0 */ @@ -299,7 +327,7 @@ class RWLock extends AbstractSyLock { * @since 0.1.0 */ public - boolean isReadLocked() { return isWriteLocked() || READ_LOCK_COUNTER.get() > 0; } + boolean isReadLocked() { return isWriteLocked() || getReadLockCounter(getLockThreadContext().getLock()).get() > 0; } /** * 检查写锁是否被占用 @@ -309,12 +337,13 @@ class RWLock extends AbstractSyLock { * @since 0.1.0 */ public - boolean isWriteLocked() { return WRITE_LOCK_COUNTER.get() > 0; } + boolean isWriteLocked() { return getWriteLockCounter(getLockThreadContext().getLock()).get() > 0; } /** - * 检查当前线程是否持有锁 + * /** + * {@inheritDoc} * - * @return 当前线程是否拥有锁 + * @return {@inheritDoc} * * @since 0.1.1 */ @@ -330,20 +359,7 @@ class RWLock extends AbstractSyLock { * @since 0.1.1 */ public - boolean isReadLockedCurrentThread() { - // 获取锁队列 - var l = LOCK_STATE.get(); - // 没有记录 - if ( l == null ) - return false; - // 没有上锁 - if ( l.isEmpty() ) { - LOCK_STATE.remove(); - return false; - } - // 检查是否占用读锁 - return l.contains(LockType.WRITE) || l.contains(LockType.READ); - } + boolean isReadLockedCurrentThread() { return checkIsLockedCurrentThread(LOCK_STATE.get(), LockType.READ); } /** * 检查当前线程是否持有写锁 @@ -353,9 +369,18 @@ class RWLock extends AbstractSyLock { * @since 0.1.1 */ public - boolean isWriteLockedCurrentThread() { - // 获取锁队列 - var l = LOCK_STATE.get(); + boolean isWriteLockedCurrentThread() { return checkIsLockedCurrentThread(LOCK_STATE.get(), LockType.WRITE); } + + /** + * 检查是否有对应的锁在当前线程持有 + * + * @param l 锁记录 + * @param lockType 要检查的锁类型,包含其中一个则返回true + * + * @since 0.1.2 + */ + private + boolean checkIsLockedCurrentThread(@NotNull LinkedList l, @NotNull LockType... lockType) { // 没有记录 if ( l == null ) return false; @@ -364,8 +389,10 @@ class RWLock extends AbstractSyLock { LOCK_STATE.remove(); return false; } - // 检查是否占用读锁 - return l.contains(LockType.WRITE); + for ( var t : lockType ) + if ( l.contains(t) ) + return true; + return false; } /** @@ -378,7 +405,7 @@ class RWLock extends AbstractSyLock { */ @NotNull public - Condition newReadCondition() { return Read_LOCK.newCondition(); } + Condition newReadCondition() { return getLockThreadContext().getLock().readLock().newCondition(); } /** * 获取写锁{@link Condition} @@ -390,5 +417,5 @@ class RWLock extends AbstractSyLock { */ @NotNull public - Condition newWriteCondition() { return Write_LOCK.newCondition(); } + Condition newWriteCondition() { return getLockThreadContext().getLock().writeLock().newCondition(); } } \ No newline at end of file diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/ReLock.java b/src/main/java/fybug/nulll/pdconcurrent/lock/ReLock.java index 3defce9..4cfc5fe 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/ReLock.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/ReLock.java @@ -1,16 +1,16 @@ package fybug.nulll.pdconcurrent.lock; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import fybug.nulll.pdconcurrent.e.LockType; -import fybug.nulll.pdconcurrent.i.AbstractSyLock; +import fybug.nulll.pdconcurrent.i.AbstractRWSyLock; import jakarta.validation.constraints.NotNull; -import lombok.Getter; +import lombok.SneakyThrows; /** *

使用{@link ReentrantLock}实现的并发管理.

* 使用{@link ReentrantLock}实现并发域,读写锁均为同一个实现
- * 使用了可中断的上锁操作{@link ReentrantLock#lockInterruptibly()}实现
* 支持使用{@link #newCondition()}获取{@link Condition} *

* 使用并发管理: @@ -34,17 +34,13 @@ import lombok.Getter; * }} * * @author fybug - * @version 0.1.1 + * @version 0.1.3 * @see ReentrantLock * @since lock 0.0.1 */ @SuppressWarnings("unused") -@Getter public -class ReLock extends AbstractSyLock { - /** 锁 */ - private final ReentrantLock LOCK; - +class ReLock extends AbstractRWSyLock { /** * 构建并发管理 *

@@ -69,22 +65,27 @@ class ReLock extends AbstractSyLock { * @since 0.1.0 */ public - ReLock(@NotNull ReentrantLock LOCK) { this.LOCK = LOCK; } + ReLock(@NotNull ReentrantLock LOCK) { super(new LockThreadContext<>(LOCK, true, null)); } /** * {@inheritDoc} * * @param lockType {@inheritDoc} * - * @throws InterruptedException 所在线程被中断 - * @implNote 使用 {@link ReentrantLock} 实现的并发域,使用了{@link ReentrantLock#lockInterruptibly()}进行可中断的上锁操作 + * @implNote 常规锁使用 {@link ReentrantLock#lock()},可中断锁使用{@link ReentrantLock#lockInterruptibly()}实现 * @since 0.1.1 */ + @SneakyThrows @Override protected - void lock(@NotNull LockType lockType) throws InterruptedException { - if ( lockType != LockType.NOLOCK ) - LOCK.lockInterruptibly(); + void lock(@NotNull LockType lockType) { + var c = getLockThreadContext(); + if ( lockType != LockType.NOLOCK ) { + if ( c.isInterruptiblyLock() ) + c.getLock().lockInterruptibly(); + else + c.getLock().lock(); + } } /** @@ -94,14 +95,21 @@ class ReLock extends AbstractSyLock { * * @return {@inheritDoc} * - * @implNote 使用 {@link ReentrantLock} 实现的并发域,使用了{@link ReentrantLock#tryLock()}实现 + * @implNote 无参数时使用 {@link ReentrantLock#tryLock()} 实现,设置了超时时间时使用{@link ReentrantLock#tryLock(long, TimeUnit)} * @since 0.1.1 */ + @SneakyThrows @Override protected boolean trylock(@NotNull LockType lockType) { - if ( lockType != LockType.NOLOCK ) - return LOCK.tryLock(); + var c = getLockThreadContext(); + var t = c.getTryTimeout(); + if ( lockType != LockType.NOLOCK ) { + if ( t == null ) + return c.getLock().tryLock(); + else + return c.getLock().tryLock(t.getTimeout(), t.getUnit()); + } return false; } @@ -114,8 +122,9 @@ class ReLock extends AbstractSyLock { @Override public void unlock() { - if ( LOCK.isHeldByCurrentThread() ) - LOCK.unlock(); + var lock = getLockThreadContext().getLock(); + if ( lock.isHeldByCurrentThread() ) + lock.unlock(); } /** @@ -127,7 +136,7 @@ class ReLock extends AbstractSyLock { */ @NotNull public - Condition newCondition() { return LOCK.newCondition(); } + Condition newCondition() { return getLockThreadContext().getLock().newCondition(); } /** * {@inheritDoc} @@ -136,7 +145,7 @@ class ReLock extends AbstractSyLock { */ @Override public - boolean isLocked() { return LOCK.isLocked(); } + boolean isLocked() { return getLockThreadContext().getLock().isLocked(); } /** * {@inheritDoc} @@ -147,5 +156,5 @@ class ReLock extends AbstractSyLock { */ @Override public - boolean isLockedCurrentThread() { return LOCK.isHeldByCurrentThread(); } + boolean isLockedCurrentThread() { return getLockThreadContext().getLock().isHeldByCurrentThread(); } } diff --git a/src/main/java/fybug/nulll/pdconcurrent/lock/package-info.java b/src/main/java/fybug/nulll/pdconcurrent/lock/package-info.java index e2f659b..dc5ff08 100644 --- a/src/main/java/fybug/nulll/pdconcurrent/lock/package-info.java +++ b/src/main/java/fybug/nulll/pdconcurrent/lock/package-info.java @@ -1,5 +1,5 @@ /** - *

各种锁的实现包.

+ *

各种锁的实现.

* * @author fybug * @version 0.0.1 -- Gitee