Java Lock说明

时间:2017-03-25 04:30:09

标签: java synchronization locking

我是Java的新手,我无法理解以下代码:

   public class Counter {
      private long value;
      private Lock lock;
      public long getAndIncrement() {
       lock.lock();
       try {
        int temp = value;
        value = value + 1;
       } finally {
         lock.unlock();
       }
       return temp;
      }
    }

我无法理解的是Lock是如何在接口的情况下实例化的? 如果它是一个实现Lock接口的匿名类,为什么我看不到Lock函数的任何重写(例如lock()和unlock())?

简而言之,以下一行确实让我感到困惑。

  private Lock lock;

这里有什么锁?它的类型是什么?

修改

Lock是一个接口,无法实例化。看完构造函数后:

public Counter(){
   lock = new ReentrantLock();
}

现在,一切都很清楚。 (感谢Bhushan Uniyal)

2 个答案:

答案 0 :(得分:0)

问问Lock是如何在界面中实例化的?

锁定界面,由ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

实现

From Java Doc

  

具有相同基本行为的重入互斥锁定   语义作为使用synchronized访问的隐式监视器锁   方法和陈述,但具有扩展功能。

     

ReentrantLock由最后成功锁定的线程拥有,但是   尚未解锁。线程调用锁将成功返回   当锁不是由另一个线程拥有时获取锁。该   如果当前线程已经拥有,则方法将立即返回   锁。这可以使用方法isHeldByCurrentThread()来检查   getHoldCount()。

     

此类的构造函数接受可选的fairness参数。   当设置为true时,在争用下,锁有利于授予访问权限   最长等待的线程。否则此锁不保证任何   特定的访问顺序。使用公平锁的程序由许多人访问   线程可以显示较低的总吞吐量(即,较慢;通常   比使用默认设置的那些慢得多,但要小一些   获得锁定的时间差异并保证缺乏饥饿。   但请注意,锁的公平性并不能保证公平性   线程调度。因此,使用公平锁定的许多线程之一可以   在其他活动线程连续多次连续获取它   没有进展,目前没有锁定。还要注意   不定时的tryLock方法不尊重公平性设置。它会   如果即使其他线程正在等待锁定也可以成功。

lock()

  

获取锁定。

     

如果锁没有被另一个线程持有并且返回,则获取该锁   立即将锁定保持计数设置为1。

     

如果当前线程已经保持锁定,则保持计数为   增加1,方法立即返回。

     

如果另一个线程持有锁,则当前线程变为   禁用用于线程调度的目的并且处于休眠状态直到   已获取锁定,此时锁定保持计数设置为   之一。

答案 1 :(得分:0)

Lock是一个接口,你需要提供它的Lock实现,已经有一些类提供了Lock的实现,ReentrantReadWriteLock.ReadLockReentrantLockReentrantReadWriteLock.WriteLock, 例如; Lock lock = new , ReentrantLockReentrant(); 你也可以提供自己的实现

public class MyLock implements Lock {


    public void lock() {

    }

    public void lockInterruptibly() throws InterruptedException {

    }

    public boolean tryLock() {
        return false;
    }

    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }

    public void unlock() {

    }

    public Condition newCondition() {
        return null;
    }
}

锁是除了

之外的同步块之类的线程同步机制

锁可能比Java的同步块更复杂。锁(以及其他更高级的同步机制)是使用synchronized块创建的,因此我们不能完全摆脱synchronized关键字。

从Java 5开始,包java.util.concurrent.locks包含几个锁实现,因此您可能不必实现自己的锁。但是你仍然需要知道如何使用它们,知道它们实现背后的理论仍然是有用的。