直接上菜
package com.mytest.util;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
public class MutexLockUtil {
private static Map<Object, ReentrantLock> lockCatchMap = new ConcurrentHashMap<>();
/**
* 封装同步锁
* @param key
*/
public static <T> void exec( T key, Runnable runnable) {
ReentrantLock reentrantLock = null;
ReentrantLock lockInCatch;
do {
if (reentrantLock != null) {
reentrantLock.unlock();
}
reentrantLock = lockCatchMap.computeIfAbsent(key, k -> new ReentrantLock());
reentrantLock.lock();
lockInCatch = lockCatchMap.get(key);
} while (lockInCatch == null || lockInCatch != reentrantLock);
try {
runnable.run();
} finally {
if (reentrantLock.getQueueLength() == 0) {
lockCatchMap.remove(key);
}
reentrantLock.unlock();
}
}
}
测试一下
这里开了20000个线程
public static void main(String[] args) {
for (int i = 0; i < 20000; i++) {
new Thread(()->MutexLockUtil.exec("1",()->service())).start();
}
}
private static void service() {
System.out.println("开始---");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束...");
}
跑了几次 看下结果
没有出现线程同时进入方法的情况
搞定!!