读写锁的机制概括如下:
1.读-读不互斥。多个线程去进行read操作是可以并发的。
2.读-写互斥。当前有write的线程,那么read线程会被堵塞。反之亦然。
3.写-写互斥。write线程都是互斥的。
以下是一个ReentrantReadWriteLock的简单使用:
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class writereadLock {
public static void main(String[] args) {
// TODO Auto-generated method stub
final count count = new count();
for(int i=0;i<2;i++){
new Thread(){
public void run(){
count.get();
}
}.start();
}
for(int i=0;i<2;i++){
new Thread(){
public void run(){
count.put();
}
}.start();
}
}
public static class count{
ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();
public void get(){
try{
rwlock.readLock().lock(); //read 锁
System.out.println(Thread.currentThread().getName()+" get begin");
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+" get end");
}catch(InterruptedException e){
e.printStackTrace();
}finally{
rwlock.readLock().unlock();//释放read锁
}
}
public void put(){
try{
rwlock.writeLock().lock();//write锁
System.out.println(Thread.currentThread().getName()+" put begin");
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+" put end");
}catch(InterruptedException e){
e.printStackTrace();
} finally{
rwlock.writeLock().unlock();//释放write锁
}
}
}
}
运行结果如下:
Thread-0 get begin
Thread-1 get begin
Thread-1 get end
Thread-0 get end
Thread-2 put begin
Thread-2 put end
Thread-3 put begin
Thread-3 put end
很明显线程0和1的get操作虽然上了read锁,但依然是并发的。
而线程2和3则在write锁的作用下产生了互斥。