(四十五.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()方法,示例如下:

posted @ 2019-03-19 20:09  测试开发分享站  阅读(83)  评论(0编辑  收藏  举报