62,612
社区成员
发帖
与我相关
我的任务
分享
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
public class Test{
public static void main(String[] args){
Job job = new Job();
Thread[] readThreads = new Thread[10];
Thread writeThread = new Thread(new WriteTask(job),"Write");
for(int i = 0 ; i < readThreads.length ; i++){
readThreads[i] = new Thread(new ReadTask(job),"Read" + (i + 1));
}
writeThread.start();
for(int i = 0 ; i < readThreads.length ; i++){
readThreads[i].start();
}
}
}
class ReadTask implements Runnable{
public ReadTask(Job job){
this.job = job;
}
@Override
public void run(){
while(true){
job.readJob();
}
}
private Job job;
}
class WriteTask implements Runnable{
public WriteTask(Job job){
this.job = job;
}
@Override
public void run(){
while(true){
job.writeJob();
}
}
private Job job;
}
class Job{
//对于ReadLock,同一时间可以允许有多个线程访问.
//对于WriteLock,同一时间只允许一个线程访问.
//并且ReadLock与WriteLock线程是互斥的.
public void readJob(){
try{
readLock.lock();
System.out.printf("%s:This is readJob() start.\n",Thread.currentThread().getName());
Thread.sleep(1000);
System.out.printf("%s:This is readJob() end.\n",Thread.currentThread().getName());
}catch(InterruptedException e){
e.printStackTrace();
System.exit(1);
}finally{
readLock.unlock();
}
}
public void writeJob(){
try{
writeLock.lock();
System.out.printf("%s:This is writeJob() start.\n",Thread.currentThread().getName());
Thread.sleep(1000);
System.out.printf("%s:This is readJob() end.\n",Thread.currentThread().getName());
}catch(InterruptedException e){
e.printStackTrace();
System.exit(1);
}finally{
writeLock.unlock();
}
}
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final ReadLock readLock = lock.readLock();
private final WriteLock writeLock = lock.writeLock();
}