redis 并发处理,多线程以及synchronized锁的应用

package com.test.util.redis;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

public class RedisUtil implements Runnable {

private JedisPool pool = null;

public  volatile int count=0;

/**

* @功能:带参数的构造函数

* @参数:host,主机名或主机IP

* @参数:port,端口

* @参数:password,访问Redis数据库的密码

*/

public RedisUtil(String host, int port, String password) {

if (pool == null) {

JedisPoolConfig config = new JedisPoolConfig();

// 控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;

// 如果赋值为-1,则表示不限制;如果pool已经分配了maxTotal个jedis实例,则此时pool的状态为exhausted(耗尽)。

config.setMaxTotal(1);

pool = new JedisPool(config, host, port, 60000, password);

}

}

/**

* @功能:通过Redis的key获取值,并释放连接资源

* @参数:key,键值

* @返回: 成功返回value,失败返回null

*/

public String get(String key){

Jedis jedis = null;

String value = null;

try {

jedis = pool.getResource();

value = jedis.get(key);

} catch (Exception e) {

pool.returnBrokenResource(jedis);

e.printStackTrace();

} finally {

if(null != pool) {

pool.returnResource(jedis);

}

}

return value;

}

/**

* @功能:向redis存入key和value(如果key已经存在 则覆盖),并释放连接资源

* @参数:key,键

* @参数:value,与key对应的值

* @返回:成功返回“OK”,失败返回“0”

*/

public void set(String key,String value){

Jedis jedis = null;

synchronized(this){

try{

count=count+1;

jedis = pool.getResource();

jedis.set(key, value+count);

System.out.println(jedis.get(key));

} catch (Exception e) {

// TODO Auto-generated catch block

pool.returnBrokenResource(jedis);

e.printStackTrace();

}finally {

if(null != pool) {

pool.returnResource(jedis);

}

}

}

}

@Override

public void run() {

System.out.println(Thread.currentThread());

this.set("foo", "bar");

}

}

测试类:

package com.test.util.redis;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

public class Jredis {

public static void main(String[] args) {

String host = "localhost";

String password = null;

int port = 6379;

RedisUtil redisUtil = new RedisUtil(host, port, password);

ExecutorService es=Executors.newFixedThreadPool(5);

for(int i=0;i<20;i++){

es.execute( redisUtil);

//         new Thread(redisUtil).start();

}

es.shutdown();

try {

es.awaitTermination(100, TimeUnit.MILLISECONDS);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(" test  over");

}

}

时间: 2024-08-07 22:32:47

redis 并发处理,多线程以及synchronized锁的应用的相关文章

java 多线程8 : synchronized锁机制 之 方法锁

脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的.注意这里 局部变量是不存在脏读的情况 多线程线程实例变量非线程安全 看一段代码: public class ThreadDomain13 { private int num = 0; public void addNum(String userName) { try { if ("

java 多线程9 : synchronized锁机制 之 代码块锁

synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用synchronized同步语句块来解决问题.看一下例子: 下面例子是优化后的例子 使用代码块锁,原先例子是方法锁,就是同步 必须要执行2个for  public class ThreadDomain18 { public void doLongTimeTask() throws Exception

Java多线程4:synchronized锁机制

脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的. 多线程线程安全问题示例 看一段代码: public class ThreadDomain13 { private int num = 0; public void addNum(String userName) { try { if ("a".equals(userName)) {

java的多线程安全,ReentrantLock与synchronized锁

前言 多线程总的来说是一个很大的模块,所以虽然之前就想写但一直感觉有地方没有理解透,在经过了一段时间学习后,终于有点感觉了,在此写下随笔. 多线程安全问题##: 首先和大家讨论一下多线程为什么会不安全,大家先看下面的程序. /** - @author lw */ public class Test extends Thread{ public void run() { for(int i=1;i<=10;i++) { System.out.println(i); } } public stati

Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchronized已经变得原来越强大了 这也是为什么官方建议使用synchronized的原因 毕竟,他是一个关键字啊,这才是亲儿子,Lock,终归差了一点 简单看下,synchronized大致都经过了哪些重要的变革 重量级锁 对于最原始的synchronized关键字,锁被称之为重量级锁 因为底层依赖监

【java并发】(2) Java线程同步:synchronized锁住的是代码还是对象

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在方法上. 关键是,不要认为给方法或者代码段加上synchronized就万事大吉,看下面一段代码: class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sle

四、java多线程核心技术——synchronized同步方法与synchronized同步快

一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变量为线程安全 public void addI(String username) { try { int num = 0; \\方法内的变量为线程安全 if (username.equals("a")) { num = 100; System.out.println("a set

synchronized锁自旋

http://www.jianshu.com/p/5dbb07c8d5d5 原理 通常说的synchronized在方法或块上加锁,这里的锁就是对象锁(当然也可以在类上面),或者叫重量锁,在JVM中又叫对象监视器(Monitor),就是对象来监视线程的互斥. 先来回顾一下对象在堆里的逻辑结构: 对象在内存中的结构看这里>> 对象头里的结构大致如此: 其中Tag的2bit用来显示锁类型.通常我们说synchronized的对象锁,就是这里Tag=10时的monitor对象,这里的Monitor

synchronized锁机制

http://www.cnblogs.com/xrq730/p/4851350.html 脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的. 多线程线程安全问题示例 看一段代码: public class ThreadDomain13 { private int num = 0; public void addNum(String userName) {