⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readwritelock.java

📁 介绍线程的使用方法
💻 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 + -