Java中的鎖被用來控制多個線程對共享資源的訪問,防止出現競爭條件。在Java語言中,鎖可以分為兩類:對象鎖和線程鎖。
對象鎖
public class ObjectLockExample { private Object lock = new Object(); public void methodA() { synchronized(lock) { // 線程A訪問的代碼 } } public void methodB() { synchronized(lock) { // 線程B訪問的代碼 } } }
如上代碼展示,使用synchronized關鍵字將代碼塊包裹在一個對象鎖中,示例中使用了lock對象作為鎖。這種鎖可以被多個線程持有,但是同一時刻只有一個線程可以持有該鎖,也就是說,當線程A持有鎖執行方法A時,線程B無法進入方法B執行。使用對象鎖的方法可以避免多個線程同時訪問同一份資源產生的問題。
線程鎖
public class ThreadLockExample { private Thread lockThread = null; public void methodA() { while(lockThread != Thread.currentThread()) { // 線程A訪問的代碼 } } public void methodB() { lockThread = Thread.currentThread(); // 線程B訪問的代碼 lockThread = null; } }
如上代碼展示,線程鎖的原理是在代碼中使用一個共享的變量,當線程需要訪問代碼時,先檢查變量是否為其自身線程,如果不是,則需要等待直至該變量被該線程占有。在方法B中,先將lockThread設置成當前線程,然后執行需要訪問的代碼,在方法執行完畢后將lockThread置空。這種方式可以確保同一時間只有一個線程訪問代碼。