From ede9bfa73c7cc254ea16126eda4db59846f8aba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=B5=A9?= Date: Tue, 5 Jul 2016 10:03:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=94=81,=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=87=8A=E6=94=BE=E4=B8=BA=E5=8F=AF=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concurrent/lock/annotation/Lock.java | 2 + .../concurrent/lock/annotation/ReadLock.java | 2 + .../concurrent/lock/annotation/UnLock.java | 14 +++++ .../lock/annotation/UnReadLock.java | 13 ++++ .../lock/annotation/UnWriteLock.java | 13 ++++ .../concurrent/lock/annotation/WriteLock.java | 2 + .../lock/support/AnnotationLockAopAdvice.java | 61 ++++++++++++++++--- 7 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnLock.java create mode 100644 hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnReadLock.java create mode 100644 hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnWriteLock.java diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/Lock.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/Lock.java index a0b1a78d6..46fcb316c 100644 --- a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/Lock.java +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/Lock.java @@ -17,4 +17,6 @@ public @interface Lock { long waitTime() default 5; TimeUnit timeUnit() default TimeUnit.SECONDS; + + boolean autoUnLock() default true; } diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/ReadLock.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/ReadLock.java index 0fb68cfd6..b1af5e63a 100644 --- a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/ReadLock.java +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/ReadLock.java @@ -17,4 +17,6 @@ public @interface ReadLock { long waitTime() default 5; TimeUnit timeUnit() default TimeUnit.SECONDS; + + boolean autoUnLock() default true; } diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnLock.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnLock.java new file mode 100644 index 000000000..4d15b91df --- /dev/null +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnLock.java @@ -0,0 +1,14 @@ +package org.hsweb.concurrent.lock.annotation; + +import java.lang.annotation.*; +import java.util.concurrent.TimeUnit; + +/** + * Created by zhouhao on 16-5-13. + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface UnLock { + +} diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnReadLock.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnReadLock.java new file mode 100644 index 000000000..80b9dd568 --- /dev/null +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnReadLock.java @@ -0,0 +1,13 @@ +package org.hsweb.concurrent.lock.annotation; + +import java.lang.annotation.*; + +/** + * Created by zhouhao on 16-5-13. + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface UnReadLock { + +} diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnWriteLock.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnWriteLock.java new file mode 100644 index 000000000..a4f220649 --- /dev/null +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/UnWriteLock.java @@ -0,0 +1,13 @@ +package org.hsweb.concurrent.lock.annotation; + +import java.lang.annotation.*; + +/** + * Created by zhouhao on 16-5-13. + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface UnWriteLock { + +} diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/WriteLock.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/WriteLock.java index f6bf1a878..7d3d17a8c 100644 --- a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/WriteLock.java +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/annotation/WriteLock.java @@ -17,4 +17,6 @@ public @interface WriteLock { long waitTime() default 5; TimeUnit timeUnit() default TimeUnit.SECONDS; + + boolean autoUnLock() default true; } diff --git a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/support/AnnotationLockAopAdvice.java b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/support/AnnotationLockAopAdvice.java index 8a38f2727..704131b89 100644 --- a/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/support/AnnotationLockAopAdvice.java +++ b/hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/support/AnnotationLockAopAdvice.java @@ -38,6 +38,47 @@ public class AnnotationLockAopAdvice { @Autowired(required = false) private Map expressionScopeBeanMap; + @Around("@annotation(unLock)") + public Object unWriteLock(ProceedingJoinPoint pjp, + org.hsweb.concurrent.lock.annotation.UnWriteLock unLock) throws Throwable { + String name = getLockName(pjp); + ReadWriteLock lock = readWriteLockMap.get(name); + try { + return pjp.proceed(); + } finally { + logger.debug("unlock :{}", name); + if (lock != null) + unlock(lock.writeLock()); + } + } + + @Around("@annotation(unLock)") + public Object unReadLock(ProceedingJoinPoint pjp, + org.hsweb.concurrent.lock.annotation.UnReadLock unLock) throws Throwable { + String name = getLockName(pjp); + ReadWriteLock lock = readWriteLockMap.get(name); + try { + return pjp.proceed(); + } finally { + logger.debug("unlock :{}", name); + if (lock != null) + unlock(lock.readLock()); + } + } + + @Around("@annotation(unLock)") + public Object unlock(ProceedingJoinPoint pjp, + org.hsweb.concurrent.lock.annotation.UnLock unLock) throws Throwable { + String name = getLockName(pjp); + Lock lock = lockMap.get(name); + try { + return pjp.proceed(); + } finally { + logger.debug("unlock :{}", name); + unlock(lock); + } + } + @Around("@annotation(lock)") public Object lock(ProceedingJoinPoint pjp, org.hsweb.concurrent.lock.annotation.Lock lock) throws Throwable { @@ -54,8 +95,10 @@ public class AnnotationLockAopAdvice { if (!locked) throw new LockException(name + "error"); return pjp.proceed(); } finally { - logger.debug("unlock :{}", name); - unlock(_lock); + if (lock.autoUnLock()) { + logger.debug("unlock :{}", name); + unlock(_lock); + } } } @@ -76,8 +119,10 @@ public class AnnotationLockAopAdvice { if (!locked) throw new LockException(name + "error"); return pjp.proceed(); } finally { - logger.debug("unlock readLock :{} ", name); - unlock(readLock); + if (lock.autoUnLock()) { + logger.debug("unlock readLock :{} ", name); + unlock(readLock); + } } } @@ -98,8 +143,10 @@ public class AnnotationLockAopAdvice { if (!locked) throw new LockException(name + "error"); return pjp.proceed(); } finally { - logger.debug("unlock writeLock:{} ", name); - unlock(writeLock); + if (lock.autoUnLock()) { + logger.debug("unlock writeLock:{} ", name); + unlock(writeLock); + } } } @@ -142,7 +189,7 @@ public class AnnotationLockAopAdvice { try { lock.unlock(); } catch (Throwable e) { - logger.error("unlock error",e); + logger.error("unlock error", e); } } }