26.读-写锁 ReadWriteLock

来源:互联网 发布:java 计算时间的差 编辑:程序博客网 时间:2024/06/05 00:36

①ReadWriteLock维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有writer,读取锁可以多个reader线程同时保持,写入锁是独占的。

②ReadWriterLock读取操作通常不会改变共享资源的,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。

import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/* * 1. ReadWriteLock : 读写锁 *  * 写写/读写 需要“互斥” * 读读 不需要互斥 */public class TestReadWriteLock {public static void main(String[] args) {final ReadWriteLockDemo rw = new ReadWriteLockDemo();new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101));}}, "Write:").start();for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}}}class ReadWriteLockDemo{private int number = 0;private ReadWriteLock lock = new ReentrantReadWriteLock();//读public void get(){lock.readLock().lock(); //上锁try{System.out.println(Thread.currentThread().getName() + " : " + number);}finally{lock.readLock().unlock(); //释放锁}}//写public void set(int number){lock.writeLock().lock();try{System.out.println(Thread.currentThread().getName()+""+number);this.number = number;}finally{lock.writeLock().unlock();}}}

0 0