没有考虑进程被杀,没有考虑无线自旋的效率,没有考虑redis断掉连接等等的各种情况,只是淡村的写个代码而已:
package com.suibibk.redis;import java.util.Arrays;import java.util.List;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.Pipeline;public class Test {static int j = 0;static JedisPool jedisPool;private static void init() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(20);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMinIdle(5);// timeout,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数jedisPool = new JedisPool(jedisPoolConfig, "192.168.157.6", 6379, 3000, null);}private static void lock() {Jedis jedis = jedisPool.getResource();long lock = jedis.setnx("LOCK", "0");System.out.println(lock);if(lock==0) {//自旋while(true) {//System.out.println("自旋获取");lock = jedis.setnx("LOCK", "0");if(lock==1) {System.out.println("获取了1");break;}}}//设置过期时间jedis.expire("LOCK", 10*60);jedis.close();}private static void unlock() {Jedis jedis = jedisPool.getResource();jedis.del("LOCK");jedis.close();}public static void main(String[] args) {init();for(int i=0;i<20;i++) {new Thread(new Runnable() {public void run() {lock();try {Thread.currentThread().sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}j++;System.out.println("当前的j="+j);unlock();}}).start();}}}
