没有考虑进程被杀,没有考虑无线自旋的效率,没有考虑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 block
e.printStackTrace();
}
j++;
System.out.println("当前的j="+j);
unlock();
}
}).start();
}
}
}