標籤:java 地方 不同方法 問題 executor oid style 提交 string
1.1. 可重新進入鎖ReentrantLock
ReentrantLock是java並發庫中提供的可重新進入鎖。與synchronized同步塊相比,有相似也有不同。相似的地方有:
(1)都可以實現多線程之間的同步,避免對共用資源的存取違規。
(2)都是可重新進入的,即一個已經擷取鎖的線程可以再次獲得同一個鎖,synchronized也類似。
不同的地方有:
(1)ReentrantLock更靈活,擷取鎖和釋放鎖可以在同一個方法中,也可以在不同方法中。synchronized通常用在同一個方法體內。
(2)ReentrantLock的執行效率比synchronized更高一些。
ReentrantLock使用時需要注意的問題是,應當將鎖所保護的代碼放在try{}代碼塊中,unlock操作放在finally{}代碼塊中,避免在lock操作之後unlock之前因為發生異常而導致鎖沒有釋放。
//這是一個共用資源類。class SharedResource {private ReentrantLock lock = new ReentrantLock(); public void visitResource(){lock.lock();try{System.out.println("visitResource called: " + Thread.currentThread().getName());}finally{lock.unlock();}}} public class ReentrantLockTest {public static void main(String[] args) {//建立線程池提交10個任務。final SharedResource sr = new SharedResource();ExecutorService executorService = Executors.newFixedThreadPool(3);for(int i=0;i<10;i++) {executorService.execute(new Runnable(){@Overridepublic void run() {sr.visitResource();//訪問共用資源。}});}executorService.shutdown();}}
Java並發程式設計(12)並發鎖之可重新進入鎖ReentrantLock