赞
踩
1)类:java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; 2)读锁又称共享锁,若事务T 对数据对象A 加上读锁,则事务T "可以读A但不能修改A",其他事务可以再对A加读锁,而不能加写锁,直到T释放A上的读锁。主要是保证读的一致性。 |
1)类:java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; 2)类:java.util.concurrent.locks.ReentrantLock; 3)关键字:Synchronized; 4)可以用以上的3种方式来实现写锁。 5)写锁又称独立锁。若事务T 对数据对象A 加上写锁,事务T "可以读A也可以修改A",其他事务不能再对A加任何读或写的锁,直到T释放A上的锁。这保证了其他事务在T释放A上的写锁之前不能再读取和写入修改A。主要保证写的一致性. 6)注:Synchronized,ReentrantLock、WriteLock都是独立锁。而ReadLock是共享锁。 |
————————————————————————
————————————————————————
1)//注意ReadLock和WriteLock是ReentrantReadWriteLock的内部类 |
————————————————————————
————————————————————————
2)返回内部类的方法: |
————————————————————————
————————————————————————
3)案例 |
import java.util.Random; //import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockTest { public static void main(String[] args) { final Queue queue = new Queue(); //循环2次 会创建0-3个线程 for (int i = 1; i <=2; i++) { //内部类 new Thread() { public void run() { while (true) { queue.get(); } } }.start(); new Thread() { public void run() { while (true) { // queue.put( new Random().nextInt(10000));//随机数 } } }.start(); } } } class Queue { private Object data = null; // 共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。 ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); // ReadWriteLock rwl = new ReentrantReadWriteLock();//当然 可以先上引用 public void get() { rwl.readLock().lock(); try { System. out.println(Thread.currentThread().getName() + " be ready to read data!"); Thread. sleep(500); //第一次读到的是为空null 因为队列还没有数据 System. out.println(Thread.currentThread().getName() + " have read data :" + data); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwl.readLock().unlock(); } } public void put(Object data) { rwl.writeLock().lock(); try { System.out.println("已经写锁 其它的线程不能进入...."); System. out.println(Thread.currentThread().getName() + " be ready to write data!"); Thread. sleep(500); this.data = data; System. out.println(Thread.currentThread().getName() + " have write data: " + data); System.out.println("释放写锁 其它的线程能进入..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwl.writeLock().unlock(); } } } |
(1)运行结果 |
————————————————————————
————————————————————————
(2)可以看出 写锁是独立的。而读锁会被共享。 |
Thread-0 be ready to read data! Thread-2 be ready to read data! Thread-0 have read data :null Thread-2 have read data :null 已经写锁 其它的线程不能进入.... Thread-3 be ready to write data! Thread-3 have write data: 7759 释放写锁 其它的线程能进入... 已经写锁 其它的线程不能进入.... Thread-3 be ready to write data! Thread-3 have write data: 1448 释放写锁 其它的线程能进入... 已经写锁 其它的线程不能进入.... Thread-1 be ready to write data! Thread-1 have write data: 2468 释放写锁 其它的线程能进入... 已经写锁 其它的线程不能进入.... Thread-1 be ready to write data! Thread-1 have write data: 6017 释放写锁 其它的线程能进入... Thread-0 be ready to read data! Thread-2 be ready to read data! Thread-2 have read data :6017 Thread-0 have read data :6017 已经写锁 其它的线程不能进入.... Thread-3 be ready to write data! Thread-3 have write data: 7142 释放写锁 其它的线程能进入... |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。