2013-02-18 63 views
1

我有一個類有2個方法,Read方法和Write方法。 我想讓多線程可以訪問讀取方法,只有一個線程可以訪問讀取方法。當訪問寫入方法時,讀取方法將被阻止。我應該怎麼做?java,多線程,如何封鎖另一個方法

注:閱讀答案後,我爲此寫了一小段代碼,我使用了併發包鎖。

public class ConcurrentLock { 
private Lock wLock = new Lock(); 
private Lock rLock = new Lock(); 
private int i; 
public static void main(String[] args){ 

} 
public int Read(){ 
    try { 
     rLock.lock(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally{ 
     rLock.unlock(); 
    } 
    return i; 
} 

public void Write(){ 
    try { 
     wLock.lock(); 
     rLock.lock(); 
     ++i; 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally{ 
     wLock.unlock(); 
     rLock.unlock(); 
    } 

} 

}

+1

在這裏你去。 http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/thread_basics.html – Achrome 2013-02-18 18:51:45

回答

3

這是Readers-Writer pattern,您可以直接在Java 5+中使用ReadersWriteLock.java可能的實現來實現。您必須獲取併發布適當的讀取器和寫入器鎖。請參閱Javadoc的示例。

請注意,儘管在OP中不是很清楚,但阻止嘗試讀取的線程因爲另一個已經在讀取而沒有意義,並且只會增加爭用。應該允許兩位讀者同時閱讀。但是,作家應該擁有獨家訪問權限。

+0

啊,這是非常有幫助的。謝謝:) – Accessdenier 2013-02-18 20:32:18

0

馬克兩者來作爲同步。

+0

這將阻止讀者反對讀者,並使讀者不必要地捱餓。 – 2013-02-18 18:54:58

+0

@cybye - OP要的問題在問題中不太清楚。 – 2013-02-18 18:59:56

+0

@DonRoby是的,對..我重讀了「1線程」。 sry – cybye 2013-02-18 19:03:36

1

原生方式;)

public void read() { 
     synchronized(readLock) { 
      // critical operations like resource.get(Some) 
     } 
} 
public void write() { 
     synchronized(writeLock) { 
      synchronized(readLock) { 
       // critical operations like resource.put(Some, Some) 
      } 
     } 
} 

// for the academic 

public void onlyOneReaderAndOnlyOneWriter() { 
     writeLock = readLock; 
} 

public void multipleReadersAndOnlyOneWriter() { 
    synchronized(readLock) { // grr, tricky 
     writeLock = new Object(); 
    } 
} 
+0

我完全理解你的邏輯,但你能告訴我更多的細節,比如應該放入「writeLock」和「readLock」嗎?我使用了對象級鎖(只使用synnchronized關鍵字)和類級鎖(synchronized(someclass.class),你的意思是什麼可以放在同步?我是一個新手到Java。 – Accessdenier 2013-02-18 20:51:51

+0

把你的「關鍵」代碼裏面它意味着你想要同步的操作,你不需要任何進一步的同步,我將編輯答案以使其更加清晰。 – cybye 2013-02-18 22:35:57

相關問題