1、基本概念
2、信号量类
3、测试类
4、测试日志
基本概念
计数信号量是一种锁,它可以让用户限制一项资源最多能够同时被多少个进程访问,
技术信号量和其他锁的区别:当客户端获取锁失败时,客户端会选择等待;而获取信号量失败时,通常直接退出,并向用户提示“资源繁忙”,由用户决定下一步如何处理。
信号量类
import java.util.UUID;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
public class Semaphore_Lock {
public static String acquire_semaphore(Jedis redis,String sem_name,int limit,long timeout){
String identifier=UUID.randomUUID().toString();
long now=System.currentTimeMillis();
Pipeline pipeline=redis.pipelined();
//清理其他持有者过期信号量
pipeline.zremrangeByScore(sem_name, 0, now-timeout);
pipeline.zadd(sem_name,now,identifier);
Response<Long> rank=pipeline.zrank(sem_name, identifier);
pipeline.syncAndReturnAll();
if((Long)rank.get()<limit){
System.out.println(Thread.currentThread().getName()+" identifier rank :"+rank.get());
return identifier;
}else{
System.out.println(Thread.currentThread().getName()+" identifier rank :"+rank.get()+",too late");
}
redis.zrem(sem_name, identifier);
return null;
}
public static Long release_semaphore(Jedis redis,String sem_name,String identifier){
return redis.zrem(sem_name, identifier);
}
}
测试类
import redis.clients.jedis.Jedis;
public class TestSemaphore_Lock {
public static void main(String[] args) {
System.out.println( " main start");
for (int i = 0; i < 1000; i++) {
Test_Thread_lock threadA = new Test_Thread_lock();
threadA.start();
try {
// Thread.sleep(1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Test_Thread_lock extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName() + " 启动运行");
Jedis redis=JedisUtil.getJedis();
while(true){
if(redis==null){
redis=JedisUtil.getJedis();
System.out.println(Thread.currentThread().getName() + " 获取redis连接失败,等待几秒后,继续尝试获取.conn conn conn");
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
continue;
}
String indentifier = Semaphore_Lock.acquire_semaphore(redis, "sem_name", 20, 1000*60);
if (indentifier == null) {
System.out.println(Thread.currentThread().getName() + " 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore");
}else{
System.out.println(Thread.currentThread().getName() + " 执行任务");
try {
sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Semaphore_Lock.release_semaphore(redis,"sem_name", indentifier);
redis.close();
break;
}
}
}
}
测试日志
Thread-274 identifier rank :22,too late
Thread-255 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-213 identifier rank :23,too late
Thread-255 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-213 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-255 identifier rank :22,too late
Thread-213 identifier rank :21,too late
Thread-274 identifier rank :21,too late
Thread-255 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-213 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-255 identifier rank :21,too late
Thread-213 identifier rank :21,too late
Thread-274 identifier rank :21,too late
Thread-255 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-213 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-255 identifier rank :20,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-213 identifier rank :21,too late
Thread-255 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-255 identifier rank :20,too late
Thread-213 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-255 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-213 identifier rank :19
Thread-213 执行任务
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-255 identifier rank :19
Thread-255 执行任务
Thread-274 identifier rank :20,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :20,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :21,too late
Thread-274 获取信号量失败,取消任务. Semaphore Semaphore Semaphore Semaphore
Thread-274 identifier rank :18
Thread-274 执行任务
Thread-963 identifier rank :16
Thread-963 执行任务