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();
    }

    疑惑:
      跨线程的可重入


  • 相关阅读:
    CTF-cookies欺骗
    CTF-速度要快100
    php实现登录注册界面
    CTF-秋名山老司机 100
    三大类型语句
    PHP运算符
    标记风格和注释
    连接串口服务器时的注意事项
    RS485转以太网的概述和应用领域
    工业级路由器的优点有哪些
  • 原文地址:https://www.cnblogs.com/chen--biao/p/11361550.html
Copyright © 2011-2022 走看看