1. 程式人生 > >【搞定Java併發程式設計】第14篇:Java中鎖的概述

【搞定Java併發程式設計】第14篇:Java中鎖的概述

上一篇:重排序:https://blog.csdn.net/pcwl1206/article/details/84930669

1、Lock介面

鎖是用來控制多個執行緒訪問共享資源的方式,一般來說,一個鎖能夠防止多個執行緒同時訪問共享資源(但有些鎖可以允許多個執行緒併發訪問共享資源,比如:讀寫鎖)。

在Lock接口出現之前,Java程式靠synchronized關鍵字實現鎖功能。而Java SE5之後,併發包中新增了Lock介面用來實現鎖功能,它提供了與synchronized關鍵字類似的同步功能。但在使用時需要顯示的獲取和釋放鎖雖然他缺少了隱式獲取和釋放鎖的便捷性,但卻擁有了鎖獲取與釋放的可操作性、可中斷性及超時獲取鎖等synchronized關鍵字不具備的同步特性

。 

  • Lock的使用
Lock lock = new ReentrantLock();
lock.lock();
try{
    // ...
}finally{
    lock.unlock();
}

需要對Lock的使用進行兩點說明:

1、在finally中釋放鎖:保證在獲取鎖之後,最終能夠被釋放;

2、不要將獲取鎖的過程寫在try塊中,因為如果在獲取鎖時發生了異常,異常丟擲的同時,也會導致鎖無故釋放。

  • Lock介面提供的synchronized關鍵字不具備的主要特性

  • Lock介面中的API

Lock介面的實現基本上都是通過聚合了一個同步器的子類來完成執行緒訪問控制的。

看下Lock介面中的原始碼,實際上也就是上表中的這些API:

public interface Lock {

    // 獲取鎖    
    void lock();

    // 可中斷的獲取鎖
    void lockInterruptibly() throws InterruptedException;

    // 嘗試阻塞的獲取鎖
    boolean tryLock();

    // 超時獲取鎖
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    // 釋放鎖
    void unlock();

    // 獲取等待通知元件,該元件和當前鎖繫結
    Condition newCondition();
}

2、佇列同步器

由於佇列同步器比較重要,內容也比較多,單獨寫一篇文章用於講解。

點選檢視以下文章:

1、佇列同步器AQS原始碼分析之概要分析

2、佇列同步器AQS原始碼分析之獨佔模式

3、佇列同步器AQS原始碼分析之共享模式

4、佇列同步器AQS原始碼分析之Condition介面、等待佇列


3、重入鎖:ReentrantLock

 

 

 


4、讀寫鎖

 

 

 


5、LockSupport工具