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 執行任務