成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Ocean / 404人閱讀

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

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

Java中的ReentrantLock

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

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

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

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

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

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

性能比較

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

ReentrantLock缺點(diǎn)

ReentrantLock的主要缺點(diǎn)是方法需要置于try-finally塊中,另外,開發(fā)人員需要負(fù)責(zé)獲取和釋放鎖,而開發(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66044.html

相關(guān)文章

  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

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

    spacewander 評(píng)論0 收藏0
  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

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

    xfee 評(píng)論0 收藏0
  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

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

    makeFoxPlay 評(píng)論0 收藏0
  • Java的一些題目

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

    jokester 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<