国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

淺談Java并發編程系列(五)—— ReentrantLock VS synchronized

Ocean / 401人閱讀

摘要:線程通過的方法獲得鎖,用方法釋放鎖。和關鍵字的區別在等待鎖時可以使用方法選擇中斷,改為處理其他事情,而關鍵字,線程需要一直等待下去。擁有方便的方法用于獲取正在等待鎖的線程。

ReentrantLock是Java并發包中一個非常有用的組件,一些并發集合類也是用ReentrantLock實現,包括ConcurrentHashMap。ReentrantLock具有三個特性:等待可中斷、可實現公平鎖、以及鎖可以綁定多個條件。

Java中的ReentrantLock

ReentrantLock與synchronized關鍵字一樣,屬于互斥鎖,synchronized中的鎖是非公平的(公平鎖是指多個線程等待同一個鎖時,必須按照申請鎖的時間順序來依次獲得鎖),ReentrantLock默認情況下也是非公平的,但可以通過帶布爾值的構造函數要求使用公平鎖。線程通過ReentrantLock的lock()方法獲得鎖,用unlock()方法釋放鎖。

ReentrantLock和synchronized關鍵字的區別

ReentrantLock在等待鎖時可以使用lockInterruptibly()方法選擇中斷, 改為處理其他事情,而synchronized關鍵字,線程需要一直等待下去。同樣的,tryLock()方法可以設置超時時間,用于在超時時間內一直獲取不到鎖時進行中斷。

ReentrantLock可以實現公平鎖,而synchronized的鎖是非公平的。

ReentrantLock擁有方便的方法用于獲取正在等待鎖的線程。

ReentrantLock可以同時綁定多個Condition對象,而synchronized中,鎖對象的wait()和notify()或notifyAll()方法可以實現一個隱含的條件,如果要和多于一個條件關聯時,只能再加一個額外的鎖,而ReentrantLock只需要多次調用newCondition方法即可。

性能比較

在JDK1.6之前,ReentrantLock的性能要明顯優于synchronized,但是JDK1.6中加入了很多針對鎖的優化措施,synchronized和ReentrantLock的性能基本完全持平了。

ReentrantLock缺點

ReentrantLock的主要缺點是方法需要置于try-finally塊中,另外,開發人員需要負責獲取和釋放鎖,而開發人員常常忘記在finally中釋放鎖。

ReentrantLock和synchronized示例
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Java program to show, how to use ReentrantLock in Java.
 * Reentrant lock is an alternative way of locking
 * apart from implicit locking provided by synchronized keyword in Java.
 *
 * @author  Javin Paul
 */
public class ReentrantLockHowto {

    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;

     //Locking using Lock and ReentrantLock
     public int getCount() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + " gets Count: " + count);
            return count++;
        } finally {
            lock.unlock();
        }
     }

     //Implicit locking using synchronized keyword
     public synchronized int getCountTwo() {
            return count++;
     }

    

    public static void main(String args[]) {
        final ThreadTest counter = new ThreadTest();
        Thread t1 = new Thread() {

            @Override
            public void run() {
                while (counter.getCount() < 6) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();                    }
                }
            }
        };
      
        Thread t2 = new Thread() {

            @Override
            public void run() {
                while (counter.getCount() < 6) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        };
      
        t1.start();
        t2.start();
      
    }
}

Output:
Thread-0 gets Count: 0
Thread-1 gets Count: 1
Thread-1 gets Count: 2
Thread-0 gets Count: 3
Thread-1 gets Count: 4
Thread-0 gets Count: 5
Thread-0 gets Count: 6
Thread-1 gets Count: 7

Read more: http://javarevisited.blogspot...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66044.html

相關文章

  • 后臺開發常問面試題集錦(問題搬運工,附鏈接)

    摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...

    spacewander 評論0 收藏0
  • 后臺開發常問面試題集錦(問題搬運工,附鏈接)

    摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...

    xfee 評論0 收藏0
  • 后臺開發常問面試題集錦(問題搬運工,附鏈接)

    摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...

    makeFoxPlay 評論0 收藏0
  • Java的一些題目

    摘要:需要注意的是對于方法或者代碼塊,當出現異常時,會自動釋放當前線程占用的鎖,因此不會由于異常導致出現死鎖現象。用于實現線程間的通信,它是為了解決難以使用的問題。 速度StringBuilder>StringBuffer>String,StringBuffer線程安全 線程安全的集合有:Vector、Stack、HashTable、ConcurrentHashMap、 CopyOnWr...

    jokester 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<