java多线程--ReentrantReadWriteLock的使用
2017-03-27 09:43
579 查看
java多线程--ReentrantReadWriteLock的使用
读写锁的使用,限制范围为:
* 读读锁互斥,读写之间互斥,写写之间互斥
一.实例一,读读之间可以共享数据即可以同一时间获取读取锁
package readwritelock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 读写锁的使用,限制范围为:
* 读读锁互斥,读写之间互斥,写写之间互斥
*
* 本实例实现:读读共享,即读与读之间不互斥
* @author lxb
*
*/
public class Service {
private ReentrantReadWriteLock lock =new ReentrantReadWriteLock();
public void read(){
try{
try{
lock.readLock().lock(); //获取读取锁,因为是读取锁,所以这里不需要等待
System.out.println("获取读锁:"+Thread.currentThread().getName()+
" "+System.currentTimeMillis());
Thread.sleep(10000);
}finally{
lock.readLock().unlock();
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
二.写锁之间互斥
package readwritelock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 本实例实现写锁之间互斥
*
* @author lxb
*
*/
public class WriteService {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void write() {
try {
try {
lock.writeLock().lock(); // 获取读取锁,因为是读取锁,所以这里不需要等待
System.out.println("获取写锁:" + Thread.currentThread().getName()
+ " " + System.currentTimeMillis());
Thread.sleep(10000);
} finally {
lock.writeLock().unlock();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
读锁测试线程:
package readwritelock;
public class ThreadA extends Thread{
private Service service;
public ThreadA(Service service){
this.service = service;
}
public void run(){
service.read();
}
}
写锁测试线程:
package readwritelock;
public class ThreadC extends Thread{
private WriteService service;
public ThreadC(WriteService service){
this.service = service;
}
public void run(){
service.write();
}
}
主线程:
package readwritelock;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//testReadLock();
testWriteLock();
}
public static void testReadLock() {
// service可看作是一个线程共享 的实例对象
Service service = new Service();
ThreadA a = new ThreadA(service);
a.setName("A");
ThreadB b = new ThreadB(service);
b.setName("B");
a.start();
b.start();
}
/**
* 打打印的结果应该是其中一个线程先获取锁,稍后 10秒后另一个线程再获取 锁
*/
public static void testWriteLock() {
// service可看作是一个线程共享 的实例对象
WriteService service = new WriteService();
ThreadC C = new ThreadC(service);
C.setName("C");
ThreadC D = new ThreadC(service);
D.setName("D");
C.start();
D.start();
}
}
读写锁的使用,限制范围为:
* 读读锁互斥,读写之间互斥,写写之间互斥
一.实例一,读读之间可以共享数据即可以同一时间获取读取锁
package readwritelock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 读写锁的使用,限制范围为:
* 读读锁互斥,读写之间互斥,写写之间互斥
*
* 本实例实现:读读共享,即读与读之间不互斥
* @author lxb
*
*/
public class Service {
private ReentrantReadWriteLock lock =new ReentrantReadWriteLock();
public void read(){
try{
try{
lock.readLock().lock(); //获取读取锁,因为是读取锁,所以这里不需要等待
System.out.println("获取读锁:"+Thread.currentThread().getName()+
" "+System.currentTimeMillis());
Thread.sleep(10000);
}finally{
lock.readLock().unlock();
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
二.写锁之间互斥
package readwritelock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 本实例实现写锁之间互斥
*
* @author lxb
*
*/
public class WriteService {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void write() {
try {
try {
lock.writeLock().lock(); // 获取读取锁,因为是读取锁,所以这里不需要等待
System.out.println("获取写锁:" + Thread.currentThread().getName()
+ " " + System.currentTimeMillis());
Thread.sleep(10000);
} finally {
lock.writeLock().unlock();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
读锁测试线程:
package readwritelock;
public class ThreadA extends Thread{
private Service service;
public ThreadA(Service service){
this.service = service;
}
public void run(){
service.read();
}
}
package readwritelock; public class ThreadB extends Thread{ private Service service; public ThreadB(Service service){ this.service = service; } public void run(){ service.read(); } }
写锁测试线程:
package readwritelock;
public class ThreadC extends Thread{
private WriteService service;
public ThreadC(WriteService service){
this.service = service;
}
public void run(){
service.write();
}
}
主线程:
package readwritelock;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//testReadLock();
testWriteLock();
}
public static void testReadLock() {
// service可看作是一个线程共享 的实例对象
Service service = new Service();
ThreadA a = new ThreadA(service);
a.setName("A");
ThreadB b = new ThreadB(service);
b.setName("B");
a.start();
b.start();
}
/**
* 打打印的结果应该是其中一个线程先获取锁,稍后 10秒后另一个线程再获取 锁
*/
public static void testWriteLock() {
// service可看作是一个线程共享 的实例对象
WriteService service = new WriteService();
ThreadC C = new ThreadC(service);
C.setName("C");
ThreadC D = new ThreadC(service);
D.setName("D");
C.start();
D.start();
}
}
相关文章推荐
- java多线程学习10-使用ReentrantReadWriteLock的一个例子
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
- java 多线程 ReentrantReadWriteLock 使用
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- java多线程:并发包中ReentrantReadWriteLock读写锁的原理
- java多线程基础---synchronized与ReentrantReadWriteLock的介绍和比较
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- java多线程-使用ReadWriteLock同步数据访问
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- java 中 ReentrantReadWriteLock的读锁和写锁的使用
- Java多线程(十)之ReentrantReadWriteLock深入分析
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- Java多线程synchronized、ReentrantLock、ReentrantReadWriteLock 和StampedLock 的对比
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- Java多线程 ReentrantReadWriteLock深入分析
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- Java 多线程3:Lock 接口(接口方法分析,ReentrantLock,ReadWriteLock)