(四十五.2)多线程同步的实现方式之Lock

Java 1.5之后,新增了Lock接口来实现锁的功能,它提供了与synchronized类似的同步功能,只是在使用的时候需要手动的获取和释放锁,虽然缺少了synchronized隐式释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized不具备的同步特性。

Lock使用也很简单,以下是简单的使用方式。

public class Counter{
    private Lock lock = new Lock();
    private int count = 0;

    public int inc(){
        lock.lock(); 
/*
lock()方法会对Lock实例进行加锁,因此所有对象调用lock()方法的线程都会被阻塞
直到该Lock对象的unlock()方法被调用
*/
        int newCount = ++count;
        lock.unlock();
        return newCount;
    }
}

①lock():已阻塞的方式获取锁,也就是说,如果获取到了锁,立即返回;如果别的线程持有锁,当前线程等待,直到获取锁后返回

②tryLock():以非阻塞的方式获取锁,只是尝试性地去获取一下锁,如能获取锁,立即返回true,否则为false

③tryLock(long timeout,TimeUnit unit):如果获取了锁,则返回true,否则等待参数给定的时间单元,在等待的过程中,如果获取锁,则返回true,如果等待超时,则返回false

④lockInterruptibly():如果获取了锁,则返回;如果没有获取锁,当先线程处于休眠状态,直到获取锁,或者当前线程被其他的线程中断。

它与lock()方法最大的区别在于如果lock()方法获取不到锁,会一直处于阻塞状态,且会忽略interrupt()方法,示例如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值