1. 程式人生 > >java動手實現讀寫鎖

java動手實現讀寫鎖

基於synchronized實現讀寫鎖

昨天面試小米基礎平臺,面試官問了一個這樣的題目,讓我自己實現一個讀寫鎖,用lock實現。想了半天lock不會,最後改用synchronized實現

  •  讀寫鎖類的實現
  • 兩個變數read、write記錄讀鎖和寫鎖的個數
  • synchronized鎖會鎖住一個例項,同時只能等待一個方法執行完才能執行下一個方法操作。
class MyReadWriteLock{
	private volatile int read;
	private volatile int write;
	public MyReadWriteLock(){
		this.read = 0;
		this.write = 0;
	}
	public synchronized void readLock() throws InterruptedException{
		if(write>0){
			wait();
		}
		read++;
	}
	
	public synchronized void readUnLock(){
		read--;
		notifyAll();
	}
	
	public synchronized void writeLock() throws InterruptedException{
		if(read>0||write>0){
			wait();
		}
		write++;
	}
	
	public synchronized void writeUnLock(){
		write--;
		notifyAll();
	}
}

相關推薦

java動手實現

基於synchronized實現讀寫鎖 昨天面試小米基礎平臺,面試官問了一個這樣的題目,讓我自己實現一個讀寫鎖,用lock實現。想了半天lock不會,最後改用synchronized實現  讀寫

java併發-Synchronized+CAS方式實現

Synchronized+CAS方式實現讀寫鎖 文章目錄 Synchronized+CAS方式實現讀寫鎖 思路 技術 程式碼 測試 結果 [GitHub主頁](https://gith

22、Java並發性和多線程-Java中的/

權限 原理 目的 str sco readers 閱讀 操作 wait 以下內容轉自http://ifeve.com/read-write-locks/: 相比Java中的鎖(Locks in Java)裏Lock實現,讀寫鎖更復雜一些。假設你的程序中涉及到對一些共享資源

Java並發- 中的性能之王:StampedLock

第一個 jdk1.8 轉換 cpu 原生 判斷 四種 空間 blog 為什麽StampedLock這麽神奇?能夠達到這種效果,它的核心思想在於,在讀的時候如果發生了寫,應該通過重試的方式來獲取新的值,而不應該阻塞寫操作。這種模式也就是典型的無鎖編程思想,和CAS自旋的思想一

linux下用互斥和條件變數來實現

以下內容來源自UNP卷二的第八章 讀寫鎖的概念( the conception of read-write lock ) (1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該執行緒用於讀 (2)僅當沒有執行緒持有某個給定的讀寫鎖用於讀或用於寫,才能分配該

Java併發ReadWriteLock的與Synchronized

說到Java併發程式設計,很多開發第一個想到同時也是經常常用的肯定是Synchronized,但是小編這裡提出一個問題,Synchronized存在明顯的一個性能問題就是讀與讀之間互斥,簡言之就是,我們程式設計想要實現的最好效果是,可以做到讀和讀互不影響,讀和寫互斥,寫和寫

Java Thread實現同步

其實,可以對資源(buffer)的訪問進行進一步封裝,比如,為“盒子”提供String[] readerBuffer()和writeBuffer(String)兩個方法,在這兩個方法裡面,根據鎖(readerNumber)的狀態,判斷讀寫操作是否合法,這樣,程式碼的整體性會更好。帶來的結果是,RWResour

Linux使用互斥和條件變數實現優先)

(1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀(2)僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫換一種說法就是,只要沒有執行緒在修改(寫)某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權(讀)。僅

Java中的

import java.util.concurrent.locks.ReentrantReadWriteLock; public class TestRWL { public static void

JAVA 併發程式設計-之模擬快取系統(十一)

    在多執行緒中,為了提高效率有些共享資源允許同時進行多個讀的操作,但只允許一個寫的操作,比如一個檔案,只要其內容不變可以讓多個執行緒同時讀,不必做排他的鎖定,排他的鎖定只有在寫的時候需要,以保證別

用Python實現

Python 提供的多執行緒模型中並沒有提供讀寫鎖,讀寫鎖相對於單純的互斥鎖,適用性更高,可以多個執行緒同時佔用讀模式的讀寫鎖,但是隻能一個執行緒佔用寫模式的讀寫鎖。 通俗點說就是當沒有寫鎖時,就可以加讀鎖且任意執行緒可以同時加;而寫鎖只能有一個執行緒,且必須在沒有讀鎖時才

使用boost::shared_mutex實現

偉大的Boost庫給我們提供了 shared_mutex  類,結合 unique_lock 與 shared_lock 的使用,可以實現讀寫鎖。 通常讀寫鎖需要完成以下功能: 1.當 data 被

Java併發程式設計-

1.認識讀寫鎖讀寫鎖既是一個排他鎖也是一個共享鎖,讀鎖是共享鎖,寫鎖是排他鎖。讀操作可以共存,讀操作和寫操作互斥,寫操作和寫操作之間互斥。下面是一個使用例子:public class Demo {    private Map<String, Object> ma

STL實現

在這裡不考慮std::shared_mutex, 只用條件變數和std::mutex來實現。 分析讀寫鎖的邏輯: 讀鎖之間是不衝突的,無論多少個執行緒申請讀鎖,不需要等待。但是要想獲得寫鎖,就必須等所有的讀鎖全部釋放完畢。那麼怎麼知道所有的讀全部結束了呢?只能用一個int變

ZooKeeper實現

在上一篇文章,我們已經實現了分散式鎖。今天更進一步,在分散式鎖的基礎之上,實現讀寫鎖。 完整程式碼在 https://github.com/SeemSilly/codestory/tree/master/research-zoo-keeper 1 讀寫鎖的概念 參考維基百科的條目: https://zh.wi

Java併發程式設計的藝術》-Java併發包中的及其實現分析

1. 前言 在Java併發包中常用的鎖(如:ReentrantLock),基本上都是排他鎖,這些鎖在同一時刻只允許一個執行緒進行訪問,而讀寫鎖在同一時刻可以允許多個讀執行緒訪問,但是在寫執行緒訪問時,所有的讀執行緒和其他寫執行緒均被阻塞。讀寫鎖維護了一對鎖,一個讀鎖和一個寫鎖,通過分離讀鎖和

Java--實現原理

最近做的一個小專案中有這樣的需求:整個專案有一份 config.json 儲存著專案的一些配置,是儲存在本地檔案的一個資源,並且應用中存在讀寫(讀>>寫)更新問題。既然讀寫併發操作,那麼就涉及到操作互斥,這裡自然想到了讀寫鎖,也順便對自己讀寫鎖方面的知識做個梳理。

JAVA使用JDK1.5提供的實現高併發本地快取工具類

package com.study; import java.util.LinkedHashMap; import jav

自旋和順序實現原理

並且 保護 表達 min 返回 create creat rwlock ini 常用的同步原語鎖,到多核處理器時代鎖已經是必不可少的同步方式之一了。無論設計多優秀的多線程數據結構,都避不開有競爭的臨界區,此時高效的鎖顯得至關重要。鎖的顆粒度是框架/程序設計者所關註的,

javaReadWriteLock

blog ner java readwrite pan exce oid rate this package com.java.concurrent; import java.util.concurrent.locks.ReadWriteLock; import jav