package com.jt.redis;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisDataSource {
//方案1:饿汉式 (类加载时创建对象)
// private static JedisPool jedisPool;
// static{
// GenericObjectPoolConfig config = new GenericObjectPoolConfig();
// config.setMaxTotal(16);//最大连接数
// config.setMaxIdle(8);//最大空闲连接数
// config.setMinIdle(4);//最小空闲连接数
// jedisPool = new JedisPool(config, "192.168.126.129", 6379);
// }
//方案2:懒汉式(何时需要何时创建)
/**
* Jedis连接池对象
* volatile 关键字的作用? (通常会配合双重校验锁使用)
* 1)禁止JVM指令重排序
* 2)保证线程共享变量可见性(一个线程改了值后,其它线程立刻可见.)
* 3)但不保证原子性.
*/
private static volatile JedisPool jedisPool;
/**
* 从池中获取一个连接
* @return
*/
public /*synchronized*/ static Jedis getConnection(){
if(jedisPool==null) {
synchronized (JedisDataSource.class) {//排它锁,独占锁,悲观锁
if (jedisPool == null) {
System.out.println("==create jedis pool==");
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(16);//最大连接数
config.setMaxIdle(8);//最大空闲连接数
config.setMinIdle(4);//最小空闲连接数
jedisPool = new JedisPool(config, "192.168.126.128", 6379);
//上面这一行的执行逻辑???
//1.分配池对象空间
//2.属性默认初始化
//3.构造方法
//4.将对象地址赋值给jedisPool这个变量
}
}
}
return jedisPool.getResource();
}
//通过方法内局部变量的定义,优化系统性能(减少了主内存与线程本地内存的数据交换次数)
public static Jedis getConnection02(){
JedisPool pool=jedisPool;
if(pool==null) {
synchronized (JedisDataSource.class) {//排它锁,独占锁,悲观锁
pool=jedisPool;
if (pool == null) {
System.out.println("==create jedis pool==");
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(16);//最大连接数
config.setMaxIdle(8);//最大空闲连接数
config.setMinIdle(4);//最小空闲连接数
pool=jedisPool = new JedisPool(config, "192.168.126.128", 6379);
//上面这一行的执行逻辑???
//1.分配池对象空间
//2.属性默认初始化
//3.构造方法
//4.将对象地址赋值给jedisPool这个变量
}
}
}
return pool.getResource();
}
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
JedisDataSource.getConnection();
}
});
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
JedisDataSource.getConnection();
}
});
Thread t3=new Thread(new Runnable() {
@Override
public void run() {
JedisDataSource.getConnection();
}
});
t1.start();
t2.start();
t3.start();
}
}