1.什麼是可重入鎖ReentrantLock
線程可以進入任何一個它已經擁有鎖同步的代碼塊。同一個線程,外層函數獲取鎖後,內層仍然有獲取該鎖的代碼。ReentrantLock還提供了中斷鎖和定時鎖等待。
2.當一個線程進入某個對象的一個synchronized的實例方法後,其它線程是否可進入此對象的其它方法?
如果該對象其他方法沒有加synchronized關鍵字,可以進入
如果該方法調用了wait方法,則可以進入
如果其它方法沒有synchronized同時該方法沒有調用wait,則不可以進入
如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因爲非靜態的方法用的是該對象。
如下:
/**
* @author: krauser
* @date: Create in 下午5:39 2017/12/27
* @Description:
*/
public class TestSyn {
static class test {
public static synchronized void add() throws InterruptedException {
System.out.println("add..");
TimeUnit.SECONDS.sleep(3);
}
public static synchronized void get() throws InterruptedException {
System.out.println("get..");
}
}
public static void main(String[] args) throws InterruptedException {
//test testSyn = new test();
new Thread(() -> {
try {
test.add();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
test.get();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
TimeUnit.SECONDS.sleep(10);
}
}
3.synchronized和java.util.concurrent.locks.Lock的異同
Lock可以主動中斷鎖,還提供了一個condition對象
4.樂觀鎖和悲觀鎖