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

資訊專欄INFORMATION COLUMN

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

Ocean / 397人閱讀

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

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

Java中的ReentrantLock

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

ReentrantLock和synchronized關(guān)鍵字的區(qū)別

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

ReentrantLock可以實現(xiàn)公平鎖,而synchronized的鎖是非公平的。

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

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

性能比較

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

ReentrantLock缺點

ReentrantLock的主要缺點是方法需要置于try-finally塊中,另外,開發(fā)人員需要負責獲取和釋放鎖,而開發(fā)人員常常忘記在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...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66044.html

相關(guān)文章

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

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

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

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

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

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

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

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

    jokester 評論0 收藏0

發(fā)表評論

0條評論

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