你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫
阿新 • • 發佈:2017-09-11
讀寫鎖
思路: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
你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫