国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JUC并發(fā)編程學(xué)習(xí)筆記(四)8鎖現(xiàn)象

這篇具有很好參考價(jià)值的文章主要介紹了JUC并發(fā)編程學(xué)習(xí)筆記(四)8鎖現(xiàn)象。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

8鎖現(xiàn)象

八鎖->就是關(guān)于鎖的八個(gè)問(wèn)題

鎖是什么,如何判斷鎖的是誰(shuí)

對(duì)象、class模板

深刻理解鎖

鎖的東西無(wú)外乎就兩樣:1、同步方法的調(diào)用者,2、Class模板。

同一個(gè)鎖中,只有當(dāng)前線(xiàn)程資源釋放后才會(huì)被下一個(gè)線(xiàn)程所接手。

同步方法的調(diào)用者是兩個(gè)不同的實(shí)例時(shí),互不相關(guān)。

靜態(tài)同步方法(static)鎖的是整個(gè)Class模板,和同步方法的調(diào)用者也不是同一個(gè)鎖;切Class模板在Java程序中唯一。

代碼示例

1、淺淺理解鎖的作用

同一把鎖中根據(jù)執(zhí)行先后釋放資源,保證一個(gè)資源的使用順序

package org.example.phone;

import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) {
//        標(biāo)準(zhǔn)情況下,打印順序?yàn)?1、發(fā)短信,2、打電話(huà)
//        給sendMsg內(nèi)部延遲四秒執(zhí)行,執(zhí)行順序依舊是 1、發(fā)短信,2、打電話(huà)
//        可知,并非是我們所想的,A線(xiàn)程在前面就先執(zhí)行,而是鎖的機(jī)制導(dǎo)致了這種情況
//        phone1只創(chuàng)建了一個(gè)對(duì)象,所以這個(gè)對(duì)象的鎖只有一把,誰(shuí)先拿到就是誰(shuí)先執(zhí)行
//        鎖的對(duì)象是該方法的調(diào)用者,即phone1
        Phone1 phone1 = new Phone1();
        new Thread(()->{
            phone1.sendMsg();
        },"A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(()->{
            phone1.call();
        },"B").start();
    }
}
class Phone1{
//    synchronized鎖的對(duì)象是方法的調(diào)用者,Phone1只new了一個(gè)對(duì)象,所以鎖的是new出來(lái)的整個(gè)對(duì)象
    public synchronized void sendMsg(){

        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("發(fā)短信");
    }
    public synchronized void call(){
        System.out.println("打電話(huà)");
    }
}

2、區(qū)分鎖的對(duì)象

不同的實(shí)例使用的鎖并非同一把,所以也無(wú)法同時(shí)鎖定某個(gè)固定的資源、無(wú)法對(duì)同一資源進(jìn)行有順序的操作

package org.example.phone;

import java.util.concurrent.TimeUnit;

public class Test3 {
    public static void main(String[] args) {
//        標(biāo)準(zhǔn)情況下,打印順序?yàn)?1、發(fā)短信,2、打電話(huà)
//        給sendMsg內(nèi)部延遲四秒執(zhí)行,執(zhí)行順序依舊是 1、發(fā)短信,2、打電話(huà)
//        可知,并非是我們所想的,A線(xiàn)程在前面就先執(zhí)行,而是鎖的機(jī)制導(dǎo)致了這種情況
//        phone1只創(chuàng)建了一個(gè)對(duì)象,所以這個(gè)對(duì)象的鎖只有一把,誰(shuí)先拿到就是誰(shuí)先執(zhí)行
//        鎖的對(duì)象是該方法的調(diào)用者,即phone1

//        調(diào)用兩個(gè)不同對(duì)象的方法,鎖的是兩個(gè)不同的對(duì)象,此時(shí)先出現(xiàn)打電話(huà),說(shuō)明不同對(duì)象之間的鎖互不影響
        Phone3 phone3_1 = new Phone3();
        Phone3 phone3_2 = new Phone3();
        new Thread(()->{
            phone3_1.sendMsg();
        },"A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(()->{
            phone3_2.call();
        },"B").start();
    }
}
class Phone3{
    //    synchronized鎖的對(duì)象是方法的調(diào)用者,Phone1只new了一個(gè)對(duì)象,所以鎖的是new出來(lái)的整個(gè)對(duì)象
    public synchronized void sendMsg(){

        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("發(fā)短信");
    }
    public synchronized void call(){
        System.out.println("打電話(huà)");
    }
    //    當(dāng)在資源類(lèi)中添加了一個(gè)普通方法后,先輸出hello
//    沒(méi)有鎖,不是同步方法,不受鎖的影響
    public void hello(){
        System.out.println("Hello");
    }
}

3、了解鎖的參與者

只有同步方法參與鎖,普通方法依舊按照java執(zhí)行順序執(zhí)行

package org.example.phone;

import java.util.concurrent.TimeUnit;

public class Test2 {
    public static void main(String[] args) {
//        標(biāo)準(zhǔn)情況下,打印順序?yàn)?1、發(fā)短信,2、打電話(huà)
//        給sendMsg內(nèi)部延遲四秒執(zhí)行,執(zhí)行順序依舊是 1、發(fā)短信,2、打電話(huà)
//        可知,并非是我們所想的,A線(xiàn)程在前面就先執(zhí)行,而是鎖的機(jī)制導(dǎo)致了這種情況
//        phone1只創(chuàng)建了一個(gè)對(duì)象,所以這個(gè)對(duì)象的鎖只有一把,誰(shuí)先拿到就是誰(shuí)先執(zhí)行
//        鎖的對(duì)象是該方法的調(diào)用者,即phone1
        Phone2 phone2 = new Phone2();
        new Thread(()->{
            phone2.sendMsg();
        },"A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(()->{
            phone2.hello();
        },"B").start();
    }
}
class Phone2{
    //    synchronized鎖的對(duì)象是方法的調(diào)用者,Phone1只new了一個(gè)對(duì)象,所以鎖的是new出來(lái)的整個(gè)對(duì)象
    public synchronized void sendMsg(){

        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("發(fā)短信");
    }
    public synchronized void call(){
        System.out.println("打電話(huà)");
    }
//    當(dāng)在資源類(lèi)中添加了一個(gè)普通方法后,先輸出hello
//    沒(méi)有鎖,不是同步方法,不受鎖的影響
    public void hello(){
        System.out.println("Hello");
    }
}

4、明白鎖能鎖誰(shuí)

鎖只能鎖兩個(gè)東西,一個(gè)是同步方法的調(diào)用者,一個(gè)是整個(gè)Class模板(全局唯一),一旦使用static創(chuàng)建靜態(tài)同步方法,那么該方法的鎖鎖的就是全局唯一的Class模板,并且在反射時(shí)就已經(jīng)被創(chuàng)建了

package org.example.phone;

import java.util.concurrent.TimeUnit;

public class Test4 {
    public static void main(String[] args) {
//        兩個(gè)對(duì)象的Class類(lèi)模板只有一個(gè);static,鎖的是Class
        Phone4 phone4_1 = new Phone4();
        Phone4 phone4_2 = new Phone4();
        new Thread(()->{
            phone4_1.sendMsg();
        },"A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(()->{
            phone4_2.call();
        },"B").start();
    }
}
class Phone4{
//    synchronized鎖的對(duì)象是方法的調(diào)用者
//    注:增加了static靜態(tài)方法 此時(shí)調(diào)用該方法的就變成了Phone4的反射對(duì)象,全局唯一
//    此時(shí)鎖的就是Class模板了,即不管你有幾個(gè)調(diào)用者,都在同一個(gè)鎖
//    static方法類(lèi)一加載就有了!鎖的是Class
    public static synchronized void sendMsg(){

        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("發(fā)短信");
    }
    public static synchronized void call(){
        System.out.println("打電話(huà)");
    }
}

5、深入理解鎖的是誰(shuí)

靜態(tài)同步方法和普通同步方法在一起使用時(shí),鎖的并非同一對(duì)象,所以打印順序也時(shí)按java的執(zhí)行順序來(lái),并不存在鎖定資源的情況文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-739976.html

package org.example.phone;

import java.util.concurrent.TimeUnit;
/*
* 1、一個(gè)靜態(tài)同步方法,一個(gè)普通同步方法,先打印發(fā)短信還是打電話(huà)
*   兩個(gè)方法一個(gè)鎖的是Class模板,一個(gè)鎖的是調(diào)用者,鎖的不是同一對(duì)象,所以延遲四秒的靜態(tài)同步方法后打印,延遲一秒的普通同步方法先打印
*
* */
public class Test5 {
    public static void main(String[] args) {

        Phone5 phone5_1 = new Phone5();
//        Phone5 phone5_2 = new Phone5();
        new Thread(()->{
            phone5_1.sendMsg();
        },"A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(()->{
            phone5_1.call();
        },"B").start();
    }
}
class Phone5{
//    鎖的是Class模板
    public static synchronized void sendMsg(){

        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("發(fā)短信");
    }
//    鎖的是調(diào)用者
    public synchronized void call(){
        System.out.println("打電話(huà)");
    }
}

到了這里,關(guān)于JUC并發(fā)編程學(xué)習(xí)筆記(四)8鎖現(xiàn)象的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JUC并發(fā)編程學(xué)習(xí)筆記(九)阻塞隊(duì)列

    JUC并發(fā)編程學(xué)習(xí)筆記(九)阻塞隊(duì)列

    阻塞 隊(duì)列 隊(duì)列的特性:FIFO(fist inpupt fist output)先進(jìn)先出 不得不阻塞的情況 什么情況下會(huì)使用阻塞隊(duì)列:多線(xiàn)程并發(fā)處理、線(xiàn)程池 學(xué)會(huì)使用隊(duì)列 添加、移除 四組API 方式 拋出異常 不拋出異常,有返回值 阻塞等待 超時(shí)等待 添加 add offer put offer(E e, long timeout, TimeUnit unit) 移

    2024年02月06日
    瀏覽(25)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十九)原子引用

    帶版本號(hào)的原子操作! 解決ABA問(wèn)題,引入原子引用(樂(lè)觀鎖思想) AtomicStampedReference類(lèi)解決ABA問(wèn)題 所有相同類(lèi)型的包裝類(lèi)對(duì)象之間值的比較全部使用equals方法比較 Integer使用了對(duì)象緩存機(jī)制,默認(rèn)范圍是-128至127,推薦使用靜態(tài)工廠(chǎng)方法valueOf獲取對(duì)象實(shí)例,而不是new,因?yàn)関

    2024年02月05日
    瀏覽(22)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十)線(xiàn)程池(重點(diǎn))

    JUC并發(fā)編程學(xué)習(xí)筆記(十)線(xiàn)程池(重點(diǎn))

    線(xiàn)程池:三大方法、七大參數(shù)、四種拒絕策略 池化技術(shù) 程序的運(yùn)行,本質(zhì):占用系統(tǒng)的資源!優(yōu)化資源的使用!- 池化技術(shù)(線(xiàn)程池、連接池、對(duì)象池......);創(chuàng)建和銷(xiāo)毀十分消耗資源 池化技術(shù):事先準(zhǔn)備好一些資源,有人要用就拿,拿完用完還給我。 線(xiàn)程池的好處: 1、

    2024年02月06日
    瀏覽(30)
  • JUC并發(fā)編程學(xué)習(xí)筆記(六)Callable(簡(jiǎn)單)

    JUC并發(fā)編程學(xué)習(xí)筆記(六)Callable(簡(jiǎn)單)

    callable接口和runnable接口類(lèi)似,都是為了執(zhí)行另外一條線(xiàn)程而設(shè)計(jì)的,區(qū)別是Runnable不會(huì)返回結(jié)果也不會(huì)拋出異常。 1、可以有返回值 2、可以?huà)伋霎惓?3、方法不同;run()/call(); Runnable 實(shí)現(xiàn)Runnable接口,重寫(xiě)run方法,無(wú)返回值 Callable 實(shí)現(xiàn)Callable接口,重寫(xiě)call方法,有返回值,可

    2024年02月06日
    瀏覽(24)
  • JUC并發(fā)編程學(xué)習(xí)筆記(一)認(rèn)知進(jìn)程和線(xiàn)程

    進(jìn)程 一個(gè)程序,如QQ.exe,是程序的集合 一個(gè)進(jìn)程往往可以包含多個(gè)線(xiàn)程,至少包含一個(gè) java默認(rèn)有兩個(gè)線(xiàn)程,GC垃圾回收線(xiàn)程和Main線(xiàn)程 線(xiàn)程:一個(gè)進(jìn)程中的各個(gè)功能 java無(wú)法真正的開(kāi)啟線(xiàn)程,因?yàn)閖ava是運(yùn)行在虛擬機(jī)上的,所以只能通過(guò)C++,通過(guò)native本地方法調(diào)用C++開(kāi)啟線(xiàn)程

    2024年02月06日
    瀏覽(95)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十八)深入理解CAS

    JUC并發(fā)編程學(xué)習(xí)筆記(十八)深入理解CAS

    什么是CAS 為什么要學(xué)CAS:大廠(chǎng)你必須深入研究底層!有所突破! java層面的cas-------compareAndSet compareAndSet(int expectedValue, int newValue) 期望并更新,達(dá)到期望值就更新、否則就不更新! Unsafe類(lèi) java不能直接操作內(nèi)存,但是可以調(diào)用c++,c++可以操作內(nèi)存,java可以通過(guò)native定義

    2024年02月05日
    瀏覽(28)
  • JUC并發(fā)編程學(xué)習(xí)筆記(七)常用的輔助類(lèi)

    JUC并發(fā)編程學(xué)習(xí)筆記(七)常用的輔助類(lèi)

    CountDownLatch 這是一個(gè)JUC計(jì)數(shù)器輔助類(lèi),計(jì)數(shù)器有加有減,這是減。 使用方法 使用前 可能會(huì)在所有人沒(méi)出去之前關(guān)門(mén) 使用后 不在乎誰(shuí)先出去,但是一定要總數(shù)等于0后才會(huì)關(guān)門(mén) 原理 countDownLatch.countDown();//總數(shù)減1 countDownLatch.await();//等待總數(shù)變?yōu)?才會(huì)往下執(zhí)行,相當(dāng)于阻塞當(dāng)

    2024年02月06日
    瀏覽(22)
  • JUC并發(fā)編程學(xué)習(xí)筆記(二)Lock鎖(重點(diǎn))

    JUC并發(fā)編程學(xué)習(xí)筆記(二)Lock鎖(重點(diǎn))

    傳統(tǒng)的synchronized 傳統(tǒng)的解決多線(xiàn)程并發(fā)導(dǎo)致的一些問(wèn)題我們會(huì)使用synchronized來(lái)解決,synchronized的本質(zhì)就是隊(duì)列、鎖。 Lock的實(shí)現(xiàn)類(lèi)有:可重復(fù)鎖(最常用)、讀鎖、寫(xiě)鎖 在創(chuàng)建可重復(fù)鎖時(shí),可傳入boolean類(lèi)型值來(lái)決定該鎖是公平鎖(先來(lái)后到)還是非公平鎖(可插隊(duì))

    2024年02月06日
    瀏覽(22)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十二)Stream流式計(jì)算

    JUC并發(fā)編程學(xué)習(xí)筆記(十二)Stream流式計(jì)算

    什么是Stream流式計(jì)算 大數(shù)據(jù):存儲(chǔ)+計(jì)算 集合、MySql這些的本質(zhì)都是存儲(chǔ)東西的; 計(jì)算都應(yīng)該交給流來(lái)操作! 一個(gè)案例說(shuō)明:函數(shù)式接口、lambda表達(dá)式、鏈?zhǔn)骄幊獭tream流式計(jì)算

    2024年02月05日
    瀏覽(28)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十七)徹底玩轉(zhuǎn)單例模式

    JUC并發(fā)編程學(xué)習(xí)筆記(十七)徹底玩轉(zhuǎn)單例模式

    單例中最重要的思想-------構(gòu)造器私有! 惡漢式、懶漢式(DCL懶漢式?。?惡漢式 懶漢式 DCL懶漢式 完整的雙重檢測(cè)鎖模式的單例、懶漢式、DCL懶漢式 但是有反射!只要有反射,任何的代碼都不安全,任何的私有都是擺設(shè) 正常的單例模式: 反射破壞單例: 怎么去解決這

    2024年02月05日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包