private static Lock lock = new ReentrantLock();// 鎖對象
/**
* 手動設置鎖
* @param name
* @throws Exception
*/
public static void task(String name) throws Exception{
// TODO 線程輸出方法
lock.lock();// 得到鎖
try {
//處理業務代碼
for(int i = 0; i < name.length(); i++) {
Thread.sleep(500);
System.out.println(name.charAt(i));
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();// 釋放鎖
}
}
if
(lock.tryLock()) {
try
{
//處理任務
}
catch
(Exception ex){
}
finally
{
lock.unlock();
//釋放鎖
}
}
else
{
//如果不能獲取鎖,則直接做其他事情
}
1.java使用lock和synchronize進行鎖處理效果是差不多的,但是lock需要手動去解鎖,並且可以在方法內部任何地方添加,並且一定要在finally中解鎖,但是synchronize可以自動解鎖代碼,
並且只能加在方法、代碼塊上修飾對象
2.Lock接口提供了試圖獲取鎖的tryLock()方法,在調用tryLock()獲取鎖失敗時返回false,這樣線程可以執行其它的操作 而不至於使線程進入休眠。
tryLock()方法可傳入一個long型的時間參數,允許在一定的時間內來獲取鎖。
3.Lock接口的實現類ReentrantReadWriteLock提供了讀鎖和寫鎖,允許多個線程獲得讀鎖、而只能有一個線程獲得寫鎖。讀鎖和寫鎖不能同時獲得。實現了讀和寫的分離,
ReentrantLock是帶有投票性質的lock