1. 程式人生 > >Lock介面與物件

Lock介面與物件

Lock lock = new ReentrantLock();

用介面使用一個物件,達到執行緒同步化

Lock lock = new ReentrantLock();
 
        Thread t1 = new Thread() {
            public void run() {
                try {
                    log("執行緒啟動");
                    log("試圖佔有物件:lock");
 
                    lock.lock();//佔有物件
 


                    log("佔有物件:lock");
                    log("進行5秒的業務操作");
                    Thread.sleep(5000);
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    log("釋放物件:lock");
                    lock.unlock();//釋放物件

                }
                log("執行緒結束");
            }
        };
        t1.setName("t1");
        t1.start();

————————————————————————————————————————————————————————

tryLock

Lock lock = new ReentrantLock();
 
        Thread t1 = new Thread() {
            public void run() {
                boolean locked = false;
                try {
                    log("執行緒啟動");
                    log("試圖佔有物件:lock");
 
                    locked = lock.tryLock(1,TimeUnit.SECONDS);
                    if(locked){
                        log("佔有物件:lock");
                        log("進行5秒的業務操作");
                        Thread.sleep(5000);//這5s因為自身lock無法讓出cpu,5s之後unlock
                    }
                    else{
                        log("經過1秒鐘的努力,還沒有佔有物件,放棄佔有");
                    }
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                     
                    if(locked){//不同處,需要進行判斷
                        log("釋放物件:lock");
                        lock.unlock();

                    }
                }
                log("執行緒結束");
            }
        };
        t1.setName("t1");
        t1.start();

————————————————————————————————————————————————————————

Condition condition = lock.newCondition();

condition.await();

condition.signal();

 

1. Lock是一個介面,而synchronized是Java中的關鍵字,synchronized是內建的語言實現,Lock是程式碼層面的實現。

2. Lock可以選擇性的獲取鎖,如果一段時間獲取不到,可以放棄。synchronized不行,會一根筋一直獲取下去。 藉助Lock的這個特性,就能夠規避死鎖,synchronized必須通過謹慎和良好的設計,才能減少死鎖的發生。

3. synchronized在發生異常和同步塊結束的時候,會自動釋放鎖。而Lock必須手動釋放, 所以如果忘記了釋放鎖,一樣會造成死鎖。