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;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java并发:互斥锁和读写锁

互斥锁线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁,当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。互斥锁其实提供了一种原子操作,让所有线程以串行的方式执行...

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

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

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

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

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

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

线程间的读写锁

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

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

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

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

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

Java--线程--线程控制,线程安全,线程同步,线程等待,线程交互,死锁,互斥锁,读写锁

多进程   每个进程间拥有独立的内存空间   0~4G  单核   系统将cpu所有时间分割为相同的时间片  由内核负责调度    线程属于进程内部  进程内部的所有线程共享...
  • zlQQhs
  • zlQQhs
  • 2012-12-03 20:38
  • 1641

Java--线程--线程控制,线程安全,线程同步,线程等待,线程交互,死锁,互斥锁,读写锁

转摘至:http://blog.csdn.net/zlqqhs/article/details/8253261 多进程   每个进程间拥有独立的内存空间   0~4G  单核   系统将...

java线程系列---读写锁ReentrantReadWriteLock

获取顺序 此类不会将读取者优先或写入者优先强加给锁定访问的排序。但是,它确实支持可选的公平 策略。当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入。当释放写入锁定后,将写入锁定分配给等待...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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