1. 程式人生 > >你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫

你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫

讀寫鎖

思路:java.util.concurrent.locks包下面ReadWriteLock接口,該接口下面的實現類ReentrantReadWriteLock維護了兩個鎖讀鎖和解鎖,可用該類實現這個功能,很簡單

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

/**
 * 你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫,以此來保持它的完整性,你會怎樣去實現它?
 * @author user
 *
 */
public class Test2 {

	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					MyData.read();
				}
			}).start();
		}
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					MyData.write("a");
				}
			}).start();
		}
	}
}

class MyData{
	//數據
	private static String data = "0";
	//讀寫鎖
	private static ReadWriteLock rw = new ReentrantReadWriteLock();
	//讀數據
	public static void read(){
		rw.readLock().lock();
		System.out.println(Thread.currentThread()+"讀取一次數據:"+data+"時間:"+new Date());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rw.readLock().unlock();
		}
	}
	//寫數據
	public static void write(String data){
		rw.writeLock().lock();
		System.out.println(Thread.currentThread()+"對數據進行修改一次:"+data+"時間:"+new Date());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rw.writeLock().unlock();
		}
	}
}

運行結果如下:

Thread[Thread-5,5,main]對數據進行修改一次:a時間:Sun Sep 10 20:52:07 CST 2017
Thread[Thread-4,5,main]對數據進行修改一次:a時間:Sun Sep 10 20:52:08 CST 2017
Thread[Thread-3,5,main]對數據進行修改一次:a時間:Sun Sep 10 20:52:09 CST 2017
Thread[Thread-2,5,main]讀取一次數據:0時間:Sun Sep 10 20:52:10 CST 2017
Thread[Thread-0,5,main]讀取一次數據:0時間:Sun Sep 10 20:52:10 CST 2017
Thread[Thread-1,5,main]讀取一次數據:0時間:Sun Sep 10 20:52:10 CST 2017

分析結果可知:讀取的時候都是同一個時間,而修改數據是不同時間的

本文出自 “12212886” 博客,請務必保留此出處http://12222886.blog.51cto.com/12212886/1964183

你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫