📄 readwritelock.java
字号:
package thread.lock;
/**
* <p>Title:读写锁的一个简单工具类 </p>
*
* <p>简单的实现了读写锁的功能:
* 简单的实现了读写锁的功能。提供锁的获取策略设置有两种
* <li>基于读锁优先</li>
* <li>基于写锁优先</li>
* </p>
* <p
*
* </p>
* <p>
* 该类存在的不足:
* <li>没有解决线程的再次申请锁的问题,也就是锁的计数器问题</li>
* 比如:一个线程已经已经申请了写锁,再次申请,是应该可以的。因为是同一个线程,只需要更改锁的计数器就可以了。
* 当然,对于读锁,现在已经是可以再次申请的。
* <li>锁的升级</li>
* 对于一个线程,如果已经有了读锁,那应该是可以再次申请写锁,当然如果没有其他线程持有读锁,同时只有一个线程申请写锁,
* 当然是可以申请得到写锁的。
* <li>等待通知机制的不足<li>
* 这里使用的是当前类的对象作为对象锁,而且在释放写锁和读锁的时候,使用了notifyAll()方法,这样线程会在所有等待获取
* 读锁和写锁的线程间调度,这个算法做的不好,没有把需要激活的线程进行分类。事实上可以采用类似条件变量的方式来控制读写锁的
* 获得与释放。
* 获取锁的是需要一定代价的(主要是时间),高于或者接近线程运行的时间,这是比较失败的。这个类的锁的等待通知机制作的就不够好,
* 需要进一步改进。
* </p>
*
* <p>Copyright: Copyright (c) 2004</p>
*
* <p>Company: netsky</p>
*
* @author wdz123@hotmail.com
* @version 1.0
*/
public class ReadWriteLock {
/**
* 保存锁的获取优先参数
* 默认是读锁优先。
* 读锁优先时候,也就是当锁释放时,有读线程在等待获取锁,一个写线程在等待获取锁,那某个读线程获得锁
* */
private boolean readLockFirst = true;
/**
* 读线程计数器:获取了读锁的线程数量
* **/
private int readingThreadCount = 0;
/***
* 写线程计数器
* **/
private int writeThreadCount = 0;
public ReadWriteLock(boolean readLockFirst) {
this.readLockFirst = readLockFirst;
}
public ReadWriteLock() {
readLockFirst = true;
}
/**
* 获取读锁
* **/
public synchronized void readLock() {
try {
while (!readLockFirst && writeThreadCount > 0) {
wait();
}
}
catch (InterruptedException e) {
}
readingThreadCount++;
}
/**
* 释放读锁
* **/
public synchronized void readUnLock() {
readingThreadCount--;
if (readingThreadCount == 0) {
notifyAll();
}
}
/**
* 获取写锁
* **/
public synchronized void writeLock() {
try {
while (readingThreadCount > 0 || writeThreadCount > 0) {
wait();
}
}
catch (InterruptedException e) {
}
writeThreadCount++;
}
/**
* 释放写锁
* **/
public synchronized void writeUnLock() {
writeThreadCount--;
notifyAll();
}
public static void main(String[] args) {
ReadWriteLock lock = new ReadWriteLock();
//使用读锁例子
//public void readData() {
// lock.readLock();
//doRead();
// lock.readUnLock();
// }
//使用写锁例子
// public void writeData() {
// lock.writeLock();
// doWrite();
// lock.writeUnLock();
//}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -