如果你不加读锁,那么就不会受到写锁的限制。也就是说读线程可以读数据。
看下面我写的简单例子import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.Lock;public class TestReadWriteLock{
public static void main(String[] args) throws InterruptedException{
ReadWriteData rwd = new ReadWriteData();
ReadThread rt = new ReadThread(rwd);
WriteThread wt = new WriteThread(rwd);
wt.start();
Thread.sleep(2000);
rt.start();
}
}class ReadThread extends Thread{
private ReadWriteData rwd;
public ReadThread(ReadWriteData rwd){
this.rwd = rwd;
}
public void run(){
System.out.println("result:"+rwd.getResult());
}
}class WriteThread extends Thread{
private ReadWriteData rwd;
public WriteThread(ReadWriteData rwd){
this.rwd = rwd;
}
public void run(){
rwd.setResult();
}
}class ReadWriteData{
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
private int a = 0;
public int getResult(){
//readLock.lock();
try{
System.out.println("Reading Start...");
return a;
}finally{
//readLock.unlock();
}
}
public void setResult(){
writeLock.lock();
try{
System.out.println("Writing Start...");
Thread.sleep(10000);
a++;
System.out.println("Writing End...");
}catch(InterruptedException e){
}finally{
writeLock.unlock();
}
}
}
看下面我写的简单例子import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.Lock;public class TestReadWriteLock{
public static void main(String[] args) throws InterruptedException{
ReadWriteData rwd = new ReadWriteData();
ReadThread rt = new ReadThread(rwd);
WriteThread wt = new WriteThread(rwd);
wt.start();
Thread.sleep(2000);
rt.start();
}
}class ReadThread extends Thread{
private ReadWriteData rwd;
public ReadThread(ReadWriteData rwd){
this.rwd = rwd;
}
public void run(){
System.out.println("result:"+rwd.getResult());
}
}class WriteThread extends Thread{
private ReadWriteData rwd;
public WriteThread(ReadWriteData rwd){
this.rwd = rwd;
}
public void run(){
rwd.setResult();
}
}class ReadWriteData{
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
private int a = 0;
public int getResult(){
//readLock.lock();
try{
System.out.println("Reading Start...");
return a;
}finally{
//readLock.unlock();
}
}
public void setResult(){
writeLock.lock();
try{
System.out.println("Writing Start...");
Thread.sleep(10000);
a++;
System.out.println("Writing End...");
}catch(InterruptedException e){
}finally{
writeLock.unlock();
}
}
}
解决方案 »
- 请教java程序如何发送一个enq啊?
- JFrame只能加一个JLabel吗?
- 初学者如何学习java?!!?
- 请问一个日志小问题,没分了不好意思啊
- 菜鸟两个小问题~~文件夹选择Dialog和媒体的播放时间~~
- JCreator 3.5中的CVS如何使用呀,请高手指点一下!!!
- File 能人请进 -> 这样声明 File dri[7] ; 不可以吗?
- 在java中怎样得到odbc数据源列表??谢谢
- 帮忙看一下,Init的问题!
- 在java中怎么把数据库中的数据导出成excel形式的啊?
- 求助JAVA 局域网内借助ODBC/jdbc 如何访问sqlserver?
- 链式栈的入栈和出栈问题,求各位大神指教
简单来讲,可以并发读取,但是,写入时不能读,不能同时写。