![在这里插入图片描述](https://img-blog.csdnimg.cn/20190508214258648.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hcWluY2hhb1RuVA==,size_16,color_FFFFFF,t_70)
package com.mqc.lock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class DistributeLock {
@Autowired
JedisCache jedis;
public boolean lock(String key,int blockTime,int overTime ) {
//当出现出现持续时间过长导致触发超时 其他线程开始加锁执行 而本线程结束后解锁时删除了其他线程的锁
//以线程ID为value 删除时进行校验
//分布式环境下可使用ip为value
long startTime=System.currentTimeMillis();
boolean isLocked=true;
while (jedis.setnx(key, String.valueOf(Thread.currentThread().getId())) != 1) {
if(System.currentTimeMillis()-startTime>=overTime*1000){
isLocked=false;
break;
}
}
if(isLocked){
jedis.expire(key,blockTime);
return true;
}
return false;
}
public void unlock(String key) {
if(jedis.getString(key).equals(String.valueOf(Thread.currentThread().getId()))){
jedis.delKey(key);
}
}
}
package com.mqc.lock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.ComponentScan;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@SpringBootConfiguration
@ComponentScan
public class MainController implements CommandLineRunner {
@Autowired
JedisCache jedisCache;
@Autowired
DistributeLock lock;
public static void main(String[] args) {
SpringApplication.run(MainController.class);
}
@Override
public void run(String... args) throws Exception {
lockTest();
}
private void lockTest() {
String key="distribute-lock-1";
jedisCache.delKey(key);
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
if(lock.lock(key,30,30)){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new Date().toString());
lock.unlock(key);
}
}
});
ExecutorService service= Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
service.submit(thread);
}
}
}