zoukankan      html  css  js  c++  java
  • 手写一个可重入锁

    基于的原理:

      1、synchronized

      2、wait,notify方法的搭配使用

    代码示例如下:

      

    /**
    * 手写可重入锁
    */
    public class MyLock {
    //用于判断是否已经锁了
    private boolean islock;
    //用于记录锁的线程
    private Thread lockThread;
    //用于记录锁的次数
    private int lockCount;

    public synchronized void lock(){
    //使用while的原因是,如果wait被唤醒,可以继续判断是否需要继续wait
    // 判断的依据是:是否已经被锁了且锁定的线程是否是同一个线程
    while (islock && Thread.currentThread() != lockThread){
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    islock = true;
    if(lockThread == null){
    lockThread = Thread.currentThread();
    }
    //锁一次,自增一。用于解锁时,判断是否需要唤醒等待的线程
    lockCount++;
    }
    public synchronized void unlock(){
    if(islock && lockThread == Thread.currentThread()){
    lockCount--;
    //为0代表当前对象的锁,已经全部释放
    if(lockCount == 0 ){
    islock = false;
    notify();
    }
    }
    }

    public static void main(String[] args) {
    MethodClass mc = new MethodClass();
    mc.a();
    }
    }
    class MethodClass {
    MyLock lock = new MyLock();
    public void a(){
    lock.lock();
    System.out.println(Thread.currentThread().getName()+",A");
    b(); //重入
    lock.unlock();
    }
    public void b(){
    lock.lock();
    System.out.println(Thread.currentThread().getName()+",b");
    lock.unlock();
    }

    疑惑:
      跨线程的可重入


  • 相关阅读:
    hbase coprocessor 二级索引
    文档:ubuntu安装.pdf
    Python过滤敏感词汇
    nginx 对django项目的部署
    ZooKeeper 的常用操作方法
    Python操作reids
    教你为nginx 配置ssl 证书!
    单线程多任务异步爬虫
    go语言入门之环境的搭建
    关于csrf跨站请求伪造攻击原理,与csrftoken防范原理
  • 原文地址:https://www.cnblogs.com/chen--biao/p/11361550.html
Copyright © 2011-2022 走看看