简介
- ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作。只要没有 writer,读取锁可以由 多个 reader 线程同时保持。写入锁是独占的。。
- ReadWriteLock 读取操作通常不会改变共享资源,但执行 写入操作时,必须独占方式来获取锁。对于读取操作占 多数的数据结构。 ReadWriteLock 能提供比独占锁更高 的并发性。而对于只读的数据结构,其中包含的不变性 可以完全不需要考虑加锁操作。
一、使用
package com.gf.demo;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TestReadWriteLock {
public static void main(String args[]) {
ReadWriteLockDemo rw = new ReadWriteLockDemo();
new Thread( new Runnable() {
@Override
public void run() {
rw.set((int)(Math.random() * 101));
}
} , "Write" ).start();
for (int i = 0 ; i < 100 ; i++) {
new Thread( new Runnable() {
@Override
public void run() {
rw.get();
}
} , "Read" ).start();
}
}
}
class ReadWriteLockDemo {
private int number;
private ReadWriteLock lock = new ReentrantReadWriteLock();
/**
* 读
*/
public void get() {
//上锁
lock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " : " + number);
Thread.sleep( 5000 );
System.out.println("结束!");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.readLock().unlock();
}
}
/**
* 写
*/
public void set(int number) {
lock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " : " + number);
this.number = number;
Thread.sleep( 3000 );
} catch (InterruptedException e){
e.printStackTrace();
}finally {
lock.writeLock().unlock();
}
}
}
评论