当前位置:   article > 正文

JUC-读写锁_juc读写锁

juc读写锁

N.1 读锁(共享锁)

1)类:java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;

2)读锁又称共享锁,若事务T 对数据对象A 加上读锁,则事务T "可以读A但不能修改A",其他事务可以再对A加读锁,而不能加写锁,直到T释放A上的读锁。主要是保证读的一致性。

N.2 写锁(独立锁)

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是共享锁。

N.3 API案例

————————————————————————

 ————————————————————————

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

释放写锁 其它的线程能进入...

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/956213
推荐阅读
相关标签
  

闽ICP备14008679号