java 之 读写锁 线程间互斥

原创 2012年03月21日 19:45:05
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 线程间互斥
 * @author ETHAN
 *
 */
public class ReadWriteLockTest {

	public static void main(String[] args) {
		final Queue3 q3 = new Queue3();
		for(int i=0;i<3;i++) {
			//三个读的线程
			new Thread() {
				public void run() {
					while(true) {
						q3.get();
					}
				}
			}.start();
			
			//三个写的线程
			new Thread() {
				public void run() {
					while(true) {
						q3.put(new Random().nextInt(100000));
					}
				}
			}.start();
		}
	}

}

/**
 * 读和写要互斥,放在一个类里
 * 读锁 不互斥,读和写锁互斥,写写锁互斥
 * @author ETHAN
 *
 */
class Queue3 {
	private Object data = null;//共享数据
	//不能用Lock,得用他的子类
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	
	public void get() {
		rwl.readLock().lock();
		try {
			System.out.println(Thread.currentThread().getName()+ " be ready to read data!");
			Thread.sleep((long)(Math.random()*1000));
			System.out.println(Thread.currentThread().getName()+" have read data: "+data);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			rwl.readLock().unlock();
		}
	}
	
	public void put(Object data) {
		rwl.writeLock().lock();
		
		try {
			System.out.println(Thread.currentThread().getName()+ " be ready to write data!");
			Thread.sleep((long)(Math.random()*1000));
			this.data = data;
			System.out.println(Thread.currentThread().getName()+" have write data: "+data);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			rwl.writeLock().unlock();
		}
	}
}


import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 缓存系统
 * @author ETHAN
 *
 */
public class CacheDemo {

	private Map<String,Object> cache = new HashMap<String, Object>();
	
	public static void main(String[] args) {
		
	}
	
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	
	public Object getData(String key) {
		rwl.readLock().lock();
		Object value = null;
		try {
			value = cache.get(key);
			if(value==null) {
				rwl.readLock().unlock();
				//挂上写锁,查数据
				rwl.writeLock().lock();
				try {
					//再检查一次,防止其他线程,因为都可读,不互斥
					if(value==null) {
						value = "xxx";//query db
					}
				} finally {
					rwl.readLock().lock();//downgrade by acquiring the readlock
					rwl.writeLock().unlock();//有一种更新锁
				}
				
			} 
		} finally {
			rwl.readLock().unlock();
		}
		
		return value;
	}
}


Greenplum 安装在CentOS 6.8

第一次接触分布式的数据库,对于各种配置都不是很熟悉,经过网上各种查资料,显示仔细阅读,了解原理,终于功夫不负有心人,经历一次失败后,让我配置成功了!因此做了总结以便以后查看,也用来和大家交流经验。...
  • wsxxm_h
  • wsxxm_h
  • 2016年08月10日 15:39
  • 291

java 之 阻塞队列实现

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti...
  • EthanQ
  • EthanQ
  • 2012年03月22日 00:00
  • 737

线程间同步与互斥——读写锁

在编写多线程时,有些公共数据修改的机会比较少,相对比较写它们读的机会返回很多,在读的过程中往往伴随查找的操作,中间耗时很长,给这种代码加锁反而会降低我们的效率,有一种方法专门处理这种问题,那就是——读...

linux线程间同步(1)读写锁

读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁。 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞;...

线程间的读写锁

共享独占: 读取锁——共享 写入锁——独占 即:读锁可以加多个;有写锁时,读写锁都加不上;有读锁时,可以加读锁而不能加写锁。 静态分配读写锁: pthread_rwlock_t  rwloc...

线程间同步机制----读写锁

一、读写锁基本原理 读写锁与互斥锁类似,不过读写锁运行更高的并行。互斥量要么锁住状态,要么就是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以有3中状态:读模式下加锁状态,写模式下加锁状态...

浅析线程间通信二:读写锁和自旋锁

上文讨论了互斥量和条件变量用于线程的同步,本文将讨论读写锁和自旋锁的使用,并给出了相应的代码和注意事项,相关代码也可在我的github上下载。  读写锁  对于互斥量要么是锁住状态要么是不加锁锁状态,...

Java线程(四):JUC包线程互斥与同步以及读写锁

前言: 1、Java线程(一):传统线程的实现、互斥与通信 一、线程的互斥 (一)传统互斥:synchronized 关键字  1、synchronized(对象) 代码块需要锁定同一...

java线程:互斥锁与读写锁

两种互斥锁机制: 1、synchronized 2、ReentrantLock ReentrantLock是jdk5的新特性,采用ReentrantLock可以完全替代替换synch...

java线程:互斥锁与读写锁

java线程:互斥锁与读写锁 分类: java_线程2012-07-04 02:52 67人阅读 评论(0) 收藏 举报 两种互斥锁机制: 1、synchronized 2、R...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 读写锁 线程间互斥
举报原因:
原因补充:

(最多只允许输入30个字)