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
類允許執行緒鎖定方法,即使它已經具有其他方法鎖。