最简单的分析:可重入锁、不可重入锁、安全锁、非安全锁

可重入锁(递归锁)

         指的是:在调用含有锁的函数时,若相邻的调用都在同一个线程中,就不会阻塞,若相邻的调用不再同一个线程中,就会使其中一个线程执行阻塞等待操作

            代码实例:

public class Lock{

    boolean isLocked = false;

    Thread  lockedBy = null;

    int lockedCount = 0;

    public synchronized void lock()

            throws InterruptedException{

        Thread thread = Thread.currentThread();

        while(isLocked && lockedBy != thread){

            wait();

        }

        isLocked = true;

        lockedCount++;

        lockedBy = thread;

    }

    public synchronized void unlock(){

        if(Thread.currentThread() == this.lockedBy){

            lockedCount--;

            if(lockedCount == 0){

                isLocked = false;

                notify();

            }

        }

    }

}
public class Count{

    Lock lock = new Lock();

    public void print(){

        lock.lock();

        doAdd();

        lock.unlock();

    }

    public void doAdd(){

        lock.lock();

        //do something

        lock.unlock();

    }

}

总结:上述print与doAdd函数都会被成功执行。

 

不可重入锁

         指的是:每次调用含有锁的函数时,若锁已被占用未释放,其他线程就阻塞等待。

         代码实例:


public class Lock{

    private boolean isLocked = false;

    public synchronized void lock() throws InterruptedException{

        while(isLocked){    

            wait();

        }

        isLocked = true;

    }

    public synchronized void unlock(){

        isLocked = false;

        notify();

    }

}

  总结:print函数会被执行,doAdd()进入死锁状态,一直阻塞等待锁的释放。

 

安全锁(ReentrantLock(true))

         指的是:在锁释放后,可以按照线程队列或者自定义的条件,唤醒指定的线程或者分组的线程们。

 

非安全锁(ReentrantLock(false))

         指的是:与synchronize效果一样,在锁被释放后,线程们相互竞争来获取锁。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值