大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java線程鎖有哪幾種

Java線程鎖有哪幾種

更新時間:2022-12-28 12:18:39 來源:動力節(jié)點 瀏覽2253次

Java線程鎖有哪幾種?動力節(jié)點小編來告訴大家。java特性的鎖只有兩種,volatile和synchronized,其他的都是lib包實現(xiàn)。

synchronized

對象鎖,指定對象加鎖,鑰匙有且只有一個,線程之間會競爭這個鑰匙,誰拿到先誰就可以進入,完事后歸還該鎖,循環(huán)往復(fù)。沒爭搶到的則被阻塞。

程序員沒法控制這種鎖的狀態(tài),線程獲取鎖后中斷導致被鎖對象死鎖,并且極端情況程序間相互調(diào)用產(chǎn)生互斥。

用法

class Lock{
    //因為靜態(tài)method加載順序比class優(yōu)先,所以靜態(tài)方法中需要反射
    public static synchronized void Test3() {
        synchronized(Lock.class){
            //todo
        }
    }
   //本質(zhì)是鎖當前方法
    public synchronized void Test1() {
        //todo
    }
    //鎖lockObj屬性
    private Boolean lockObj = true;
    public synchronized void Test2() {
        synchronized(lockObj){
            //todo
        }
    }
}

reentrantlock

針對synchronized的弊端,延伸出可控制獲取鎖狀態(tài)的類,使得鎖的獲取和釋放可在代碼中控制,那意味著可在finally中釋放,避免程序異常導致死鎖。

class Counter {
    private final Lock lock = new ReentrantLock();
    private int count;
    //程序異??梢葬尫沛i,防止形成死鎖
    public void add(int n) {
        lock.lock();
        try {
            count += n;
        } finally {
            lock.unlock();
        }
    }
    //嘗試獲取鎖,超時返回false
    public void add2(int n) throws InterruptedException {
        if (lock.tryLock(1, TimeUnit.SECONDS)) {
            try {
                //todo
            } finally {
                lock.unlock();
            }
        }
    }
}

ReadWriteLock

這種鎖是優(yōu)化reentrantlock的使用,reentrantlock是針對線程訪問的鎖,ReadWriteLock是針對讀寫操作細分的鎖,它可以更精細化的控制鎖的粒度。讀寫鎖分離。

public class Counter {
    private final ReadWriteLock rwlock = new ReentrantReadWriteLock();
    private final Lock rlock = rwlock.readLock();
    private final Lock wlock = rwlock.writeLock();
    public void inc(int index) {
        wlock.lock(); // 加寫鎖
        try {
            //todo
        } finally {
            wlock.unlock(); // 釋放寫鎖
        }
    }
    public int[] get() {
        rlock.lock(); // 加讀鎖
        try {
            //todo
        } finally {
            rlock.unlock(); // 釋放讀鎖
        }
    }
}

StampedLock

這種鎖在你讀的過程中不允許寫入,StampedLock和ReadWriteLock相比,讀寫鎖是可以讀鎖和寫鎖一起獲取,同時讀寫的,但是StampedLock不允許同時讀寫

volatile

說這個鎖之前,先解釋下為什么會有線程不安全,線程操作一個共享資源的值時候,會把這個資源重內(nèi)存加載到cpu寄存器(高速緩存),然后操作完成會刷回內(nèi)存,并發(fā)過程中,多個線程一起拿一起操作同一個值,一起刷回去,就導致了操作不冪等了。

有了這個概念就很好解釋volatile,它實際就是讓你的資源在cpu高速緩存中保證一致性,但也存在弊端,被volatile鎖的資源如果操作中含有其他共享資源(包括它自己)也會導致線程不安全。

class VolatileCounter{
    //正確打開方式
    private Boolean status;
    public void open(){
        status = true;
    }
    public void close(){
        status = false;
    }   
    //錯誤例子
    private Integer otherShareNumber; //該對象被其他線程操作
    private volatile Integer number;
    public void add(){
        number = number + 1;
        number = otherShareNumber + 1;
    }
}

AtomicX

X是各種類型,底層也是基于volatile,這里引入樂觀鎖的概念,每次更新時候都比對一下舊值,舊值一樣才允許更新,否則再來一遍,直到更新成功為止。

public int incrementAndGet(AtomicInteger var) {
    int prev, next;
    do {
        prev = var.get();
        next = prev + 1;
    } while ( ! var.compareAndSet(prev, next));
    return next;
}

以上就是關(guān)于“Java線程鎖有哪幾種”的介紹,大家如果對此比較感興趣,可以關(guān)注一下本站的Java視頻教程,里面的課程內(nèi)容細致全面,通俗易懂,很適合沒有基礎(chǔ)的小伙伴學習,希望對大家能夠有所幫助。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 中文在线免费不卡视频 | 精品亚洲综合在线第一区 | 日日添日日摸 | 一区二区不卡在线观看 | 国产精品久久久久影视不卡 | 亚洲精品99久久一区二区三区 | 在线国产中文字幕 | 一级a毛片 | 久久久久综合精品福利啪啪 | 亚洲成人网在线观看 | 国产成人精品一区二区仙踪林 | 国产亚洲欧美在线 | 一本久道综合久久精品 | 日韩免费成人 | 亚洲欧美久久 | 99在线免费观看视频 | 成人免费观看一区二区 | 色综合手机在线 | 在线观看黄p免费 | 国产欧美一区二区三区沐欲 | 激情五月婷婷综合网 | 欧美69p| 中文字幕久久久久一区 | 97se亚洲国产综合自在线观看 | 玖玖99视频 | 国产三级在线精品男人的天堂 | 丁香色综合 | 宅男看片午夜大片啪啪mv | 狠狠色丁香久久综合五月 | 亚洲国产精品视频 | 久久久久亚洲香蕉网 | 中文字幕一区二区三区亚洲精品 | 国产精品一区二区三区免费 | 久久99热久久精品99 | 天天操夜夜爱 | 狠狠色狠狠综合久久 | 狠狠色伊人亚洲综合第8页 狠狠色综合久久丁香婷婷 狠狠色综合久久婷婷 | 亚洲精品一区henhen色 | 九九这里只精品视在线99 | 一级片免| 久久88色综合色鬼 |