diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fd3369..3b42c22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,4 +13,10 @@ | 序号 | 变更类型 | 说明 | 时间 | 备注 | |:---|:---|:---|:---|:--| -| 1 | A | 基本 api 定义 | 2020-9-2 14:45:40 | | \ No newline at end of file +| 1 | A | 基本 api 定义 | 2020-9-2 14:45:40 | | + +# release_0.0.2 + +| 序号 | 变更类型 | 说明 | 时间 | 备注 | +|:---|:---|:---|:---|:--| +| 1 | A | 常见锁添加 | 2020-9-2 14:45:40 | | \ No newline at end of file diff --git a/lock-api/pom.xml b/lock-api/pom.xml index 03af087..0242616 100644 --- a/lock-api/pom.xml +++ b/lock-api/pom.xml @@ -5,7 +5,7 @@ lock com.github.houbb - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT 4.0.0 diff --git a/lock-api/src/main/java/com/github/houbb/lock/api/core/IReadWriteLock.java b/lock-api/src/main/java/com/github/houbb/lock/api/core/IReadWriteLock.java index eb56167..b1ff26c 100644 --- a/lock-api/src/main/java/com/github/houbb/lock/api/core/IReadWriteLock.java +++ b/lock-api/src/main/java/com/github/houbb/lock/api/core/IReadWriteLock.java @@ -1,11 +1,32 @@ package com.github.houbb.lock.api.core; -import java.util.concurrent.locks.ReadWriteLock; - /** - * 读写锁定义 + * 读写锁定义接口 * @author binbin.hou * @since 0.0.2 */ -public interface IReadWriteLock extends ReadWriteLock { +public interface IReadWriteLock { + + /** + * 获取读锁 + * @since 0.0.2 + */ + void lockRead(); + + /** + * 释放读锁 + */ + void unlockRead(); + + /** + * 获取写锁 + * @since 0.0.2 + */ + void lockWrite(); + + /** + * 释放写锁 + */ + void unlockWrite(); + } diff --git a/lock-core/pom.xml b/lock-core/pom.xml index dd1348a..9e01433 100644 --- a/lock-core/pom.xml +++ b/lock-core/pom.xml @@ -5,7 +5,7 @@ lock com.github.houbb - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT 4.0.0 diff --git a/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWrite.java b/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWrite.java index b913dfc..cba4717 100644 --- a/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWrite.java +++ b/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWrite.java @@ -1,5 +1,6 @@ package com.github.houbb.lock.redis.core; +import com.github.houbb.lock.api.core.IReadWriteLock; import com.github.houbb.log.integration.core.Log; import com.github.houbb.log.integration.core.LogFactory; @@ -9,7 +10,7 @@ import com.github.houbb.log.integration.core.LogFactory; * @author binbin.hou * @since 0.0.2 */ -public class LockReadWrite { +public class LockReadWrite implements IReadWriteLock { private static final Log log = LogFactory.getLog(LockReadWrite.class); @@ -28,13 +29,19 @@ public class LockReadWrite { * * @since 0.0.2 */ - public synchronized void lockRead() throws InterruptedException { - // 写锁存在,需要wait - while (!tryLockRead()) { - wait(); - } + @Override + public synchronized void lockRead() { + try { + // 写锁存在,需要wait + while (!tryLockRead()) { + wait(); + } - readCount++; + readCount++; + } catch (InterruptedException e) { + Thread.interrupted(); + // 忽略打断 + } } /** @@ -57,6 +64,7 @@ public class LockReadWrite { * * @since 0.0.2 */ + @Override public synchronized void unlockRead() { readCount--; notifyAll(); @@ -67,14 +75,19 @@ public class LockReadWrite { * * @since 0.0.2 */ - public synchronized void lockWrite() throws InterruptedException { - // 写锁存在,需要wait - while (!tryLockWrite()) { - wait(); - } + @Override + public synchronized void lockWrite() { + try { + // 写锁存在,需要wait + while (!tryLockWrite()) { + wait(); + } - // 此时已经不存在获取写锁的线程了,因此占坑,防止写锁饥饿 - writeCount++; + // 此时已经不存在获取写锁的线程了,因此占坑,防止写锁饥饿 + writeCount++; + } catch (InterruptedException e) { + Thread.interrupted(); + } } /** @@ -103,6 +116,7 @@ public class LockReadWrite { * * @since 0.0.2 */ + @Override public synchronized void unlockWrite() { writeCount--; notifyAll(); diff --git a/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteOwner.java b/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteOwner.java index f3b4980..d62c41c 100644 --- a/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteOwner.java +++ b/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteOwner.java @@ -1,5 +1,6 @@ package com.github.houbb.lock.redis.core; +import com.github.houbb.lock.api.core.IReadWriteLock; import com.github.houbb.log.integration.core.Log; import com.github.houbb.log.integration.core.LogFactory; @@ -13,7 +14,7 @@ import java.util.concurrent.atomic.AtomicReference; * @author binbin.hou * @since 0.0.2 */ -public class LockReadWriteOwner { +public class LockReadWriteOwner implements IReadWriteLock { private static final Log log = LogFactory.getLog(LockReadWriteOwner.class); @@ -42,11 +43,16 @@ public class LockReadWriteOwner { * * @since 0.0.2 */ - public synchronized void lockRead() throws InterruptedException { - // 写锁存在,需要wait - while (!tryLockRead()) { - log.debug("获取读锁失败,进入等待状态。"); - wait(); + @Override + public synchronized void lockRead() { + try { + // 写锁存在,需要wait + while (!tryLockRead()) { + log.debug("获取读锁失败,进入等待状态。"); + wait(); + } + } catch (InterruptedException e) { + Thread.interrupted(); } } @@ -75,6 +81,7 @@ public class LockReadWriteOwner { * * @since 0.0.2 */ + @Override public synchronized void unlockRead() { Thread currentThread = Thread.currentThread(); Integer readCount = readCountMap.get(currentThread); @@ -83,6 +90,7 @@ public class LockReadWriteOwner { throw new RuntimeException("当前线程未持有任何读锁,释放锁失败!"); } else { log.debug("释放读锁,唤醒所有等待线程。"); + readCountMap.remove(currentThread); notifyAll(); } } @@ -92,14 +100,19 @@ public class LockReadWriteOwner { * * @since 0.0.2 */ - public synchronized void lockWrite() throws InterruptedException { - // 写锁存在,需要wait - while (!tryLockWrite()) { - wait(); - } + @Override + public synchronized void lockWrite() { + try { + // 写锁存在,需要wait + while (!tryLockWrite()) { + wait(); + } - // 此时已经不存在获取写锁的线程了,因此占坑,防止写锁饥饿 - writeCount++; + // 此时已经不存在获取写锁的线程了,因此占坑,防止写锁饥饿 + writeCount++; + } catch (InterruptedException e) { + Thread.interrupted(); + } } /** @@ -131,6 +144,7 @@ public class LockReadWriteOwner { * * @since 0.0.2 */ + @Override public synchronized void unlockWrite() { boolean toNullResult = writeOwner.compareAndSet(Thread.currentThread(), null); diff --git a/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteRe.java b/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteRe.java index 1ce5217..10e6e56 100644 --- a/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteRe.java +++ b/lock-core/src/main/java/com/github/houbb/lock/redis/core/LockReadWriteRe.java @@ -1,5 +1,6 @@ package com.github.houbb.lock.redis.core; +import com.github.houbb.lock.api.core.IReadWriteLock; import com.github.houbb.log.integration.core.Log; import com.github.houbb.log.integration.core.LogFactory; @@ -13,7 +14,7 @@ import java.util.concurrent.atomic.AtomicReference; * @author binbin.hou * @since 0.0.2 */ -public class LockReadWriteRe { +public class LockReadWriteRe implements IReadWriteLock { private static final Log log = LogFactory.getLog(LockReadWriteRe.class); @@ -42,11 +43,16 @@ public class LockReadWriteRe { * * @since 0.0.2 */ - public synchronized void lockRead() throws InterruptedException { - // 写锁存在,需要wait - while (!tryLockRead()) { - log.debug("获取读锁失败,进入等待状态。"); - wait(); + @Override + public synchronized void lockRead() { + try { + // 写锁存在,需要wait + while (!tryLockRead()) { + log.debug("获取读锁失败,进入等待状态。"); + wait(); + } + } catch (InterruptedException e) { + Thread.interrupted(); } } @@ -80,6 +86,7 @@ public class LockReadWriteRe { * * @since 0.0.2 */ + @Override public synchronized void unlockRead() { Thread currentThread = Thread.currentThread(); Integer readCount = readCountMap.get(currentThread); @@ -106,15 +113,20 @@ public class LockReadWriteRe { * * @since 0.0.2 */ - public synchronized void lockWrite() throws InterruptedException { - // 写锁存在,需要wait - while (!tryLockWrite()) { - log.debug("获取写锁失败,进入等待状态。"); - wait(); - } + @Override + public synchronized void lockWrite() { + try { + // 写锁存在,需要wait + while (!tryLockWrite()) { + log.debug("获取写锁失败,进入等待状态。"); + wait(); + } - // 此时已经不存在获取写锁的线程了,因此占坑,防止写锁饥饿 - writeCount++; + // 此时已经不存在获取写锁的线程了,因此占坑,防止写锁饥饿 + writeCount++; + } catch (InterruptedException e) { + Thread.interrupted(); + } } /** @@ -152,6 +164,7 @@ public class LockReadWriteRe { * * @since 0.0.2 */ + @Override public synchronized void unlockWrite() { Thread currentThread = Thread.currentThread(); // 多次重入释放(当次数多于1时直接返回,否则需要释放 owner 信息) @@ -173,7 +186,7 @@ public class LockReadWriteRe { /** * 释放写锁并且通知 */ - private void unlockWriteNotify() { + private synchronized void unlockWriteNotify() { writeCount--; log.debug("释放写锁成功,唤醒所有等待线程。"); notifyAll(); diff --git a/lock-test/pom.xml b/lock-test/pom.xml index e1f5acc..3f1f5ab 100644 --- a/lock-test/pom.xml +++ b/lock-test/pom.xml @@ -5,7 +5,7 @@ lock com.github.houbb - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index d6b073a..b1993df 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.houbb lock pom - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT lock-api lock-core diff --git a/release.bat b/release.bat index b2d7667..96acc1a 100644 --- a/release.bat +++ b/release.bat @@ -10,9 +10,9 @@ ECHO "============================= RELEASE START..." :: 版本号信息(需要手动指定) :::: 旧版本名称 -SET version=0.0.1 +SET version=0.0.2 :::: 新版本名称 -SET newVersion=0.0.2 +SET newVersion=0.0.3 :::: 组织名称 SET groupName=com.github.houbb :::: 项目名称