2013-02-18 19 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

相关问题