Explorar o código

新增锁模块

周浩 %!s(int64=9) %!d(string=hai) anos
pai
achega
d77955d1c0

+ 21 - 0
hsweb-web-concurrent/hsweb-web-concurrent-lock/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-web-concurrent</artifactId>
+        <groupId>org.hsweb</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-web-concurrent-lock</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+</project>

+ 26 - 0
hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/LockFactory.java

@@ -0,0 +1,26 @@
+package org.hsweb.concurrent.lock;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+
+/**
+ * 锁工厂接口,通过此接口可创建锁和读写锁
+ * Created by zhouhao on 16-4-27.
+ */
+public interface LockFactory {
+    /**
+     * 创建一个指定key的读写锁,相同的key,将得到同一个锁对象
+     *
+     * @param key 锁标识
+     * @return 锁对象
+     */
+    ReadWriteLock createReadWriteLock(String key);
+
+    /**
+     * 创建一个指定key的锁,相同的key,将得到同一个锁对象
+     *
+     * @param key 锁标识
+     * @return 锁对象
+     */
+    Lock createLock(String key);
+}

+ 20 - 0
hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/ReadWriteLockFactoryAutoConfig.java

@@ -0,0 +1,20 @@
+package org.hsweb.concurrent.lock;
+
+import org.hsweb.concurrent.lock.support.DefaultReadWriteLockFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Created by zhouhao on 16-4-27.
+ */
+@Configuration
+@ConditionalOnMissingBean(value = {LockFactory.class})
+public class ReadWriteLockFactoryAutoConfig {
+
+    @Bean
+    public LockFactory createReadWriteLockFactory() {
+        return new DefaultReadWriteLockFactory();
+    }
+}

+ 40 - 0
hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/java/org/hsweb/concurrent/lock/support/DefaultReadWriteLockFactory.java

@@ -0,0 +1,40 @@
+package org.hsweb.concurrent.lock.support;
+
+import org.hsweb.concurrent.lock.LockFactory;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+/**
+ * Created by zhouhao on 16-4-27.
+ */
+public class DefaultReadWriteLockFactory implements LockFactory {
+    protected ConcurrentMap<String, ReadWriteLock> READ_WRITE_LOCK_BASE = new ConcurrentHashMap<>();
+    protected ConcurrentMap<String, Lock> LOCK_BASE = new ConcurrentHashMap<>();
+
+
+    @Override
+    public ReadWriteLock createReadWriteLock(String key) {
+        synchronized (READ_WRITE_LOCK_BASE) {
+            ReadWriteLock lock = READ_WRITE_LOCK_BASE.get(key);
+            if (lock == null) {
+                READ_WRITE_LOCK_BASE.put(key, lock = new ReentrantReadWriteLock());
+            }
+            return lock;
+        }
+    }
+
+    public Lock createLock(String key) {
+        synchronized (LOCK_BASE) {
+            Lock lock = LOCK_BASE.get(key);
+            if (lock == null) {
+                LOCK_BASE.put(key, lock = new ReentrantLock());
+            }
+            return lock;
+        }
+    }
+}

+ 3 - 0
hsweb-web-concurrent/hsweb-web-concurrent-lock/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,3 @@
+# Auto Configure
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.hsweb.concurrent.lock.ReadWriteLockFactoryAutoConfig