分享

ReadWriteLock 读写锁

 ansatsing 2017-10-06
读写锁 ReadWriteLock
 ReadWriteLock 维护了一对相关的锁,一个用于只读操作,
另一个用于写入操作。只要没有 writer,读取锁可以由
多个 reader 线程同时保持。写入锁是独占的。。
 ReadWriteLock 读取操作通常不会改变共享资源,但执行
写入操作时,必须独占方式来获取锁。对于读取操作占
多数的数据结构。 ReadWriteLock 能提供比独占锁更高
的并发性。而对于只读的数据结构,其中包含的不变性
可以完全不需要考虑加锁操作。
实例代码
package com.ansatsing.juc.readWriteLock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/*
 * 1. ReadWriteLock : 读写锁
 * 
 * 写写/读写 需要“互斥”
 * 读读 不需要互斥
 * 
 */
public class ReadWriteLockDemo {

public static void main(String[] args) {
final Stock rw = new Stock();
for (int i = 0; i < 100; i++) {
if(i<10) {
new Thread(new Runnable() {
@Override
public void run() {
rw.set((int) (Math.random() * 101));
}
}, "Write:"+i).start();
}
new Thread(new Runnable() {

@Override
public void run() {
rw.get();
}
}).start();
}
}

}

class Stock {
private int index;// 股票指数
private ReadWriteLock lock = new ReentrantReadWriteLock(true);

public void get() {
lock.readLock().lock(); // 上锁

try {
try {
TimeUnit.MILLISECONDS.sleep(150);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 当前股票指数: " + index);
} finally {
lock.readLock().unlock(); // 释放锁
}
}

public void set(int index) {
lock.writeLock().lock();

try {
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.index = index;
System.out.println(Thread.currentThread().getName() + "设置股票指数为:" + index);
} finally {
lock.writeLock().unlock();
}
}

}

疑问
读数据的方法改成返回值,那代码该怎么实现?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多