不可重入锁的设计

可重入锁:如果某个线程试图获取一个已经由他自己持有的锁,这个请求可以成功,那么此时的锁就是可重入锁

不可重入锁:不可重入锁和可重入锁相反,就是同一个线程多次请求同一把锁,会出现死锁

定义一个不可重入锁:

public class Lock{
     //当为false时证明资源没有被线程占用
    private boolean isLocked = false;
    public synchronized void lock() throws InterruptedException{
   //判断为true时,证明该线程之前占用该资源,以为synchronized是可重入锁,所以该线程可以访问资源。此时就让该线程wait,表示该资源只能占用一次。       
        while(isLocked){     
            wait();
        }
    //当该线程第一次进来的时候,将isLocked置位true
        isLocked = true;
    }
    public synchronized void unlock(){
    //将isLocked置位false表示该资源被释放,可以让其他线程来访问
        isLocked = false;
        notify();   //唤醒其他线程
    }
}

使用上面的自定义的不可重入锁

public class Count{
    Lock lock = new Lock();   //自定义的Lock类
    public void print(){
        lock.lock();  
        doAdd();
        lock.unlock();
    }
    public void doAdd(){
        lock.lock();
        //do something
        lock.unlock();
    }
}

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值