Lock和读写锁ReadWriteLock和缓存实例

原创 2012年03月22日 00:55:21

1:lock和synchronized对比

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class LockTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new LockTest().init();
	}
	
	private void init(){
		final Outputer outputer = new Outputer();
		new Thread(new Runnable(){
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					outputer.output("zhangxiaoxiang");
				}
				
			}
		}).start();
		
		new Thread(new Runnable(){
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					outputer.output("lihuoming");
				}
				
			}
		}).start();
		
	}

	static class Outputer{
		Lock lock = new ReentrantLock();
		public void output(String name){
			int len = name.length();
			lock.lock();
			try{
				for(int i=0;i<len;i++){
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}finally{
				lock.unlock();
			}
		}
		
		public synchronized void output2(String name){
			int len = name.length();
			for(int i=0;i<len;i++){
					System.out.print(name.charAt(i));
			}
			System.out.println();
		}
		
		public static synchronized void output3(String name){
			int len = name.length();
			for(int i=0;i<len;i++){
					System.out.print(name.charAt(i));
			}
			System.out.println();
		}	
	}
}



2.读写锁:ReadWriteLock

import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

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(10000));
					}
				}			
				
			}.start();
		}
		
	}
}

class Queue3{
	private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
	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 (InterruptedException 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 (InterruptedException e) {
			e.printStackTrace();
		}finally{
			rwl.writeLock().unlock();
		}
		
	
	}
}


3.用读写锁实现一个简单缓存机制

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

public class CacheDemo {

	private Map<String, Object> cache = new HashMap<String, Object>();
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

	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 = "aaaa";//实际失去queryDB();
					}
				}finally{
					rwl.writeLock().unlock();
				}
				rwl.readLock().lock();
			}
		}finally{
			rwl.readLock().unlock();
		}
		return value;
	}
}


 

 

 


 

QT之使用QReadWriteLocker互斥量同步线程小例子

接上一篇,在多线程中基本上都需要解决线程同步问题,本篇文章主要将介绍如何使用QReadWriteLocker互斥量来同步线程。同时,也按照Qt中介绍的另外一种方式来使用多线程,即继承QThread的方...
  • l357630798
  • l357630798
  • 2017年09月16日 11:44
  • 254

QT——QReadWriteLock

QMutex的局限性,我们可以使用QReadWriteLock来操作,可以实现多个读,一个写,读之间可以不同步不互斥,写时会阻塞其他的写操作。 #include   QReadWriteL...
  • ilvu999
  • ilvu999
  • 2012年09月04日 02:01
  • 2240

Lock、synchronized和ReadWriteLock的区别和联系以及Condition

在java多线程编程中,可能我们经常会遇到线程同步的问题,可以使用synchronized或者Lock去控制同步锁,他们都能实现线程的同步,下面来分析下这两种方式的区别:1.synchronized可...
  • qq_20641565
  • qq_20641565
  • 2016年11月18日 00:20
  • 2862

java新特性——读写锁ReadWriteLock

from URL : http://hi.baidu.com/zhizhesky/blog/item/cabcbb515b9b6808377abe5f.html 在上文中提到了Lock接口以及对...
  • zhuhezan
  • zhuhezan
  • 2011年07月18日 02:20
  • 53980

深入理解读写锁—ReadWriteLock源码分析

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。 所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读...
  • qq_19431333
  • qq_19431333
  • 2017年04月24日 09:00
  • 4078

Qt中的读写锁

Qt中的QReadWriteLock类为我们提供了读写锁的功能。读写锁是用来保护可以被读访问和写访问的资源的一种同步工具。如果你想让多个线程同时的对资源进行读访问,但只要有一个线程要对资源进行写访问时...
  • Amnes1a
  • Amnes1a
  • 2017年04月06日 15:52
  • 2104

Java_并发线程_Lock、ReadWriteLock

1.Lcok 1 1 11 1
  • strawberry2013
  • strawberry2013
  • 2014年10月29日 10:42
  • 2062

Java线程总结(八):并发包------读写锁ReadWriteLock的简单例子详细理解

初次接触ReadWriteLock类时也在网上查了很多资料,很容易了解到ReadWriteLock是读写锁,并且读写锁的机制有以下三个特点: 读锁---读锁 (不互斥) 读锁---写锁 ...
  • u011535508
  • u011535508
  • 2016年09月13日 17:33
  • 332

深入理解读写锁—ReadWriteLock源码分析

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。 所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读...
  • qq_19431333
  • qq_19431333
  • 2017年04月24日 09:00
  • 4078

java 中 ReentrantReadWriteLock的读锁和写锁的使用

jdk文档中关于ReentrantReadWriteLock类使用的一个很好的例子,以下是具体的介绍:    在使用某些种类的 Collection 时,可以使用 ReentrantReadWri...
  • Erica_1230
  • Erica_1230
  • 2015年01月17日 14:54
  • 1843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lock和读写锁ReadWriteLock和缓存实例
举报原因:
原因补充:

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