java.util.concurrent.locks.Lock
接口用作线程同步机制,类似于同步块。新的锁定机制更灵活,提供比同步块更多的选项。 锁和同步块之间的主要区别如下:
Lock
接口处理它。Lock
接口提供了这样的选项。Lock
接口的方法lock()
和unlock()
可以以不同的方式调用。以下是Lock
类中可用的重要方法的列表。
编号 | 方法 | 描述说明 |
---|---|---|
1 | public void lock() |
获得锁 |
2 | public void lockInterruptibly() |
获取锁定,除非当前线程中断 |
3 | public Condition newCondition() |
返回绑定到此Lock 实例的新Condition 实例 |
4 | public boolean tryLock() |
只有在调用时才可以获得锁 |
5 | public boolean tryLock(long time, TimeUnit unit) |
如果在给定的等待时间内自由,并且当前线程未被中断,则获取该锁。 |
6 | public void unlock() |
释放锁 |
以下TestThread
程序演示了使用Lock
接口的一些方法。 这里我们使用lock()
获取锁和unlock()
来释放锁。
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
类允许线程锁定方法,即使它已经具有其他方法锁。