Java中的Lock接口提供了一種更靈活的方式來(lái)控制并發(fā)訪問(wèn)。它比同步方法更為強(qiáng)大和靈活,但是它的使用要比同步方法復(fù)雜。Lock接口中的tryLock方法和lock方法是兩種常用的加鎖方式。
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
Lock中的lock方法和tryLock方法都可以用來(lái)獲取鎖,但是它們的行為略有不同。
lock方法必須等待鎖的可用性。如果鎖已經(jīng)被其他線(xiàn)程獲取,那么lock方法將阻塞當(dāng)前線(xiàn)程直到鎖被釋放。因此,lock方法無(wú)法進(jìn)行超時(shí)控制。
而tryLock方法嘗試獲取鎖。如果鎖當(dāng)前不可用,tryLock方法將返回false而不是阻塞線(xiàn)程。tryLock方法還可以通過(guò)使用帶有超時(shí)參數(shù)的tryLock方法,實(shí)現(xiàn)超時(shí)控制。
interface Lock {
void lock() throws InterruptedException;
boolean tryLock() throws InterruptedException;
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
}
在使用Lock時(shí),必須確保每次使用完鎖都要釋放它,以便其他線(xiàn)程可以得到鎖。否則,如果解鎖的線(xiàn)程崩潰,并且沒(méi)有釋放鎖,則其他線(xiàn)程將無(wú)法獲取該鎖。因此,單個(gè)線(xiàn)程一旦獲得了鎖,只要它完成了與管理狀態(tài)的交互,就必須立即釋放這個(gè)鎖。
總的來(lái)說(shuō),Lock接口較同步方法更靈活,但是使用Lock需要更多的代碼和注意事項(xiàng)。在使用Lock時(shí),應(yīng)該遵循一些規(guī)則,比如盡量使用tryLock方法避免線(xiàn)程阻塞,避免在鎖內(nèi)部阻塞,以及盡量使用finally塊確保釋放鎖。當(dāng)然,以上規(guī)則也適用于同步方法。