Lock&Condition實現線程同步通信

  • Lock比傳統線程模型中的synchronized方式更加面向對象,與生活中的鎖類似,鎖本身也應該是一個對象。兩個線程執行的代碼片段要實現同步互斥的效果,它們必須用同一個Lock對象。鎖是寫在代表要操作的資源的類的內部方法中,而不是線程代碼中!
    - 讀寫鎖:分爲讀鎖和寫鎖,多個讀鎖不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥,這是由jvm自己控制的,你只要寫好相應的鎖即可。如果你的代碼只讀數據,可以很多人同時讀,但不能同時寫,那就上讀鎖,只能有一個人在寫,且不能同時讀取,那就上寫鎖。總之,讀的時候上讀鎖,寫的時候上寫鎖!有一個面試題:寫一個緩存類!代碼如下:
package cn.itcast.heima;

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

/**
 * 緩存demo
 * 
 * @ClassName: CacheDemo
 * @Description: TODO
 * @author liuyuan
 * @date 2016年8月10日 下午6:53:07
 */
public class CacheDemo {
    private Map<String, Object> cache = new HashMap<String, Object>();// 緩存存放的位置
    private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();// 讀寫鎖

    public Object getData(String key) {
        readWriteLock.readLock().lock();// 加讀鎖
        Object value = null;
        try {
            value = cache.get(key);// 讀
            if (value == null) {
                readWriteLock.readLock().unlock();// 開讀鎖
                readWriteLock.writeLock().lock();// 加寫鎖
                try {
                    if (value == null) {
                        value = "abc";// 寫:實際代碼爲從數據庫中查詢;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    readWriteLock.writeLock().unlock();// 開寫鎖
                }
                readWriteLock.readLock().lock();// 加讀鎖
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            readWriteLock.readLock().unlock();// 開讀鎖
        }
        return value;
    }
}
發佈了57 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章