Java Lock接口

java.util.concurrent.locks.Lock接口用作线程同步机制,类似于同步块。新的锁定机制更灵活,提供比同步块更多的选项。 锁和同步块之间的主要区别如下:

  • 序列的保证 - 同步块不提供对等待线程进行访问的序列的任何保证,但Lock接口处理它。
  • 无超时,如果未授予锁,则同步块没有超时选项。Lock接口提供了这样的选项。
  • 单一方法同步块必须完全包含在单个方法中,而Lock接口的方法lock()和unlock()可以以不同的方式调用。

1 Lock接口的方法

以下是Lock类中可用的重要方法的列表。

方法 描述
public void lock() 获得锁
public void lockInterruptibly() 获取锁定,除非当前线程中断
public Condition newCondition() 返回绑定到此Lock实例的新Condition实例
public boolean tryLock() 只有在调用时才可以获得锁
public boolean tryLock(long time, TimeUnit unit) 如果在给定的等待时间内自由,并且当前线程未被中断,则获取该锁。
public void unlock() 释放锁

2 Lock接口的案例

以下TestThread程序演示了使用Lock接口的一些方法。 这里我们使用lock()获取锁和unlock()来释放锁。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class PrintDemo {

   private final Lock queueLock = new ReentrantLock();

   public void print() {
      queueLock.lock();
      try {
         Long duration = (long) (Math.random() * 10000);
         System.out.println(Thread.currentThread().getName() 
            + "  Time Taken " + (duration / 1000) + " seconds.");
         Thread.sleep(duration);
      } catch (InterruptedException e) {
         e.printStackTrace();
      } finally {
         System.out.printf("%s printed the document successfully.\n", Thread.currentThread().getName());
         queueLock.unlock();
      }
   }
}

class ThreadDemo extends Thread {
   PrintDemo  printDemo;

   ThreadDemo( String name,  PrintDemo printDemo) {
      super(name);
      this.printDemo = printDemo;
   }   

   @Override
   public void run() {
      System.out.printf("%s starts printing a document\n", Thread.currentThread().getName());
      printDemo.print();
   }
}

public class TestThread {

   public static void main(String args[]) {
      PrintDemo PD = new PrintDemo();

      ThreadDemo t1 = new ThreadDemo( "Thread - 1 ", PD );
      ThreadDemo t2 = new ThreadDemo( "Thread - 2 ", PD );
      ThreadDemo t3 = new ThreadDemo( "Thread - 3 ", PD );
      ThreadDemo t4 = new ThreadDemo( "Thread - 4 ", PD );

      t1.start();
      t2.start();
      t3.start();
      t4.start();
   }
}

输出结果为:

Thread - 1  starts printing a document
Thread - 4  starts printing a document
Thread - 3  starts printing a document
Thread - 2  starts printing a document
Thread - 1   Time Taken 4 seconds.
Thread - 1  printed the document successfully.
Thread - 4   Time Taken 3 seconds.
Thread - 4  printed the document successfully.
Thread - 3   Time Taken 5 seconds.
Thread - 3  printed the document successfully.
Thread - 2   Time Taken 4 seconds.
Thread - 2  printed the document successfully.

在上面的示例中,使用ReentrantLock类作为Lock接口的一个实现。 ReentrantLock类允许线程锁定方法,即使它已经具有其他方法锁。
 

热门文章

优秀文章