亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

并發(fā)編程基礎(chǔ)知識(shí)一

muzhuyu / 1634人閱讀

摘要:如果拿不到鎖這個(gè)線(xiàn)程就會(huì)不斷的嘗試獲得這把鎖,直到拿到為止。關(guān)鍵字取得的鎖都是對(duì)象鎖而不是把一段代碼方法當(dāng)成鎖。多個(gè)線(xiàn)程對(duì)象獲得不同的鎖他們互不影響。

線(xiàn)程安全:當(dāng)多個(gè)線(xiàn)程訪(fǎng)問(wèn)某一個(gè)類(lèi)時(shí),這個(gè)類(lèi)始終都能表現(xiàn)出正確的行為,那么這個(gè)類(lèi)就是線(xiàn)程安全的

synchronized: 可以在任意對(duì)象及方法上加鎖,而加鎖的這段代碼稱(chēng)為“互斥區(qū)”或者“臨界區(qū)”

    private int count = 5;
    
    public synchronized void  run(){
        count--;
        System.err.println(this.currentThread().getName()+" count = "+count);
    }

當(dāng)多個(gè)線(xiàn)程訪(fǎng)問(wèn)Thread的run()方法時(shí),以排隊(duì)的形式進(jìn)行處理(排隊(duì)是按照CPU分配的先后順序而定的),一個(gè)線(xiàn)程要執(zhí)行synchronized 修飾的方法里面的代碼
1.嘗試獲得鎖
2.如果拿到鎖 執(zhí)行synchronized 代碼塊內(nèi)容 。如果拿不到鎖 這個(gè)線(xiàn)程就會(huì)不斷的嘗試獲得這把鎖,直到拿到為止。而且多個(gè)線(xiàn)程同時(shí)去競(jìng)爭(zhēng)這把鎖,也就是會(huì)有鎖競(jìng)爭(zhēng)的問(wèn)題

多個(gè)線(xiàn)程多個(gè)鎖:每個(gè)線(xiàn)程都可以拿到自己的指定的鎖,分別拿到鎖以后執(zhí)行synchronized方法體里面的內(nèi)容。

synchronized關(guān)鍵字取得的鎖都是對(duì)象鎖 而不是把一段代碼(方法)當(dāng)成鎖。
多個(gè)線(xiàn)程對(duì)象獲得不同的鎖 他們互不影響。

    private static int num;
    
    public static  synchronized void printNum(String tag){
        try{
            if(tag.equals("a")){
                num =100;
                System.err.println(" tag a");
                Thread.sleep(2000);
            } else{
                num = 200;
                System.err.println("tag b");
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }

在靜態(tài)方法上面加synchronized 關(guān)鍵字 表示鎖定class類(lèi),獨(dú)占class類(lèi),類(lèi)級(jí)別的鎖

同步:synchronized 同步的概念就是共享。如果不共享資源,沒(méi)有必須進(jìn)行同步

異步:asynchronized 異步就是獨(dú)立,相互之間不受制約。例如ajax請(qǐng)求

    public  synchronized void method1(){
        try {
            System.err.println(Thread.currentThread().getName());
            Thread.sleep(4000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void method2(){
        System.err.println(Thread.currentThread().getName());
    }

1.a線(xiàn)程先持有Object對(duì)象的lock鎖 B線(xiàn)程如果在這個(gè)時(shí)候調(diào)用對(duì)象中的synchronized 方法則需要等待 ,也就是同步。
2.a線(xiàn)程先持有Object對(duì)象的lock鎖 B線(xiàn)程可以以異步的方式調(diào)用線(xiàn)程對(duì)象中的非synchronized 修飾的方法 ,不需要等待。

同步的目的是為了線(xiàn)程安全,對(duì)于線(xiàn)程安全需要滿(mǎn)足2個(gè)特性

原子性(同步)

可見(jiàn)性

臟讀:在設(shè)計(jì)我們的程序的時(shí)候一定要考慮到問(wèn)題的整體性,不然就會(huì)出現(xiàn)很經(jīng)典的錯(cuò)誤:臟讀

    public synchronized void setValue(String  username, String password){
            this.username = username;
            this.password = password;
            
            try{
                Thread.sleep(2000);
            }catch(Exception e){
                e.printStackTrace();
            }
            System.err.println("setValue的最終結(jié)果是 username "+
            username+",password"+password);
        }
    
    public void getValue(){
        System.err.println("getValue方法得到username"+
username+",password"+password);
    }

在對(duì)一個(gè)對(duì)象的方法加鎖時(shí)候,需要考慮到業(yè)務(wù)的整體性,即在setValue/getValue方法同時(shí)加上synchronized 關(guān)鍵字保證業(yè)務(wù)的原子性

鎖重入:當(dāng)一個(gè)線(xiàn)程獲得一個(gè)對(duì)象的鎖以后 ,再次請(qǐng)求此對(duì)象時(shí)可以再次獲得對(duì)象的鎖

    static class Main {
        public int i = 10;
        public synchronized void operationSup(){
            try {
                i--;
                System.out.println("Main print i = " + i);
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    static class Sub extends Main {
        public synchronized void operationSub(){
            try {
                while(i > 0) {
                    i--;
                    System.out.println("Sub print i = " + i);
                    Thread.sleep(100);        
                    this.operationSup();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

當(dāng)涉及到父類(lèi)與子類(lèi)相互執(zhí)行的時(shí)候 可以使用鎖重入

異常釋放鎖

    private int i = 0;
    
    public synchronized void operation(){
        while(true){
            try {
                i++;
                Thread.sleep(100);
                System.out.println(Thread.currentThread().getName() +
                 " , i = " + i);
                if(i == 20){
                    //Integer.parseInt("a");
                    throw new RuntimeException();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

如果一個(gè)業(yè)務(wù)分為多個(gè)子模塊去執(zhí)行。彼此之間相互獨(dú)立,如果其中一個(gè)業(yè)務(wù)出現(xiàn)異常,采取的方式是記錄日志,其他業(yè)務(wù)不受影響繼續(xù)執(zhí)行
如果一個(gè)業(yè)務(wù)分為多個(gè)子模塊去執(zhí)行,彼此之間是關(guān)聯(lián)的,如果其中一個(gè)業(yè)務(wù)出現(xiàn)異常,采取的方式是拋出RuntimeException,及時(shí)終止業(yè)務(wù)。

減小鎖的粒度:synchronized關(guān)鍵字來(lái)優(yōu)化代碼塊的執(zhí)行時(shí)間

    public void doLongTimeTask(){
        try {
            
            System.out.println("當(dāng)前線(xiàn)程開(kāi)始:" +

 Thread.currentThread().getName() + 
                    ", 正在執(zhí)行一個(gè)較長(zhǎng)時(shí)間的業(yè)務(wù)操作,其內(nèi)容不需要同步");
            Thread.sleep(2000);
            
            synchronized(this){
                System.out.println("當(dāng)前線(xiàn)程:" + 
                
                Thread.currentThread().getName() + 
                    ", 執(zhí)行同步代碼塊,對(duì)其同步變量進(jìn)行操作");
                Thread.sleep(1000);
            }
            System.out.println("當(dāng)前線(xiàn)程結(jié)束:" +
 Thread.currentThread().getName() +
                    ", 執(zhí)行完畢");
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

對(duì)任意的Object對(duì)象加鎖

    public void method1(){
        synchronized (this) {    //對(duì)象鎖
            try {
                System.out.println("do method1..");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public void method2(){        //類(lèi)鎖
        synchronized (ObjectLock.class) {
            try {
                System.out.println("do method2..");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    private Object lock = new Object();
    public void method3(){        //任何對(duì)象鎖
        synchronized (lock) {
            try {
                System.out.println("do method3..");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

對(duì)字符串常量加鎖 產(chǎn)生死循環(huán)

    public void method() {
        //new String("字符串常量")
        synchronized ("字符串常量") {
            try {
                while(true){
                    System.out.println("當(dāng)前線(xiàn)程 : "  + 
                    Thread.currentThread().getName() + "開(kāi)始");
                    Thread.sleep(1000);        
                    System.out.println("當(dāng)前線(xiàn)程 : "  + 
                    Thread.currentThread().getName() + "結(jié)束");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

鎖對(duì)象改變 如果鎖所對(duì)象本身不發(fā)生改變,即使是屬性改變,那么依然是同步的。 同一對(duì)象屬性的修改不會(huì)影響鎖的情況

    public synchronized void changeAttributte(String name, int age) {
        try {
            System.out.println("當(dāng)前線(xiàn)程 : "  + 
Thread.currentThread().getName() + " 開(kāi)始");
            this.setName(name);
            this.setAge(age);
            
            System.out.println("當(dāng)前線(xiàn)程 : "  + 
Thread.currentThread().getName() + " 修改對(duì)象內(nèi)容為: " 
                    + this.getName() + ", " + this.getAge());
            
            Thread.sleep(2000);
            System.out.println("當(dāng)前線(xiàn)程 : "  + 
Thread.currentThread().getName() + " 結(jié)束");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

死鎖問(wèn)題:在設(shè)計(jì)程序時(shí)就應(yīng)該避免雙方相互持有對(duì)方的鎖的情況

public void run() {
        if(tag.equals("a")){
            synchronized (lock1) {
                try {
                    System.out.println("當(dāng)前線(xiàn)程 : "  + 
                    Thread.currentThread().getName() + " 進(jìn)入lock1執(zhí)行");
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2) {
                    System.out.println("當(dāng)前線(xiàn)程 : "  + 
                    Thread.currentThread().getName() + " 進(jìn)入lock2執(zhí)行");
                }
            }
        }
        if(tag.equals("b")){
            synchronized (lock2) {
                try {
                    System.out.println("當(dāng)前線(xiàn)程 : "  + 
                    Thread.currentThread().getName() + " 進(jìn)入lock2執(zhí)行");
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1) {
                    System.out.println("當(dāng)前線(xiàn)程 : "  + 
                    Thread.currentThread().getName() + " 進(jìn)入lock1執(zhí)行");
                }
            }
        }
    }

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

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

相關(guān)文章

  • 多線(xiàn)程編程完全指南

    摘要:在這個(gè)范圍廣大的并發(fā)技術(shù)領(lǐng)域當(dāng)中多線(xiàn)程編程可以說(shuō)是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問(wèn)題的構(gòu)思與解決都是基于多線(xiàn)程模型來(lái)進(jìn)行的。一般來(lái)說(shuō),多線(xiàn)程程序會(huì)面臨三類(lèi)問(wèn)題正確性問(wèn)題效率問(wèn)題死鎖問(wèn)題。 多線(xiàn)程編程或者說(shuō)范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯(cuò)的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險(xiǎn)艱辛地學(xué)習(xí)各種多線(xiàn)程編程技術(shù)、解決各種并發(fā)問(wèn)題呢? 因?yàn)椴l(fā)是整個(gè)分布式集群的基礎(chǔ),通過(guò)分布式集群不僅可以大...

    mengera88 評(píng)論0 收藏0
  • Java多線(xiàn)程學(xué)習(xí)(七)并發(fā)編程些問(wèn)題

    摘要:相比與其他操作系統(tǒng)包括其他類(lèi)系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€(xiàn)程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線(xiàn)程的使用。很多編程語(yǔ)言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門(mén): Java多線(xiàn)程學(xué)習(xí)(一)Java多線(xiàn)程入門(mén) Java多線(xiàn)程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線(xiàn)程學(xué)習(xí)(二)syn...

    dingding199389 評(píng)論0 收藏0
  • 從小白程序員路晉升為大廠高級(jí)技術(shù)專(zhuān)家我看過(guò)哪些書(shū)籍?(建議收藏)

    摘要:大家好,我是冰河有句話(huà)叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國(guó)慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專(zhuān)家我看過(guò)哪些技術(shù)類(lèi)書(shū)籍。 大家好,我是...

    sf_wangchong 評(píng)論0 收藏0
  • 我的阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開(kāi)始了螞蟻金...

    姘擱『 評(píng)論0 收藏0
  • Java多線(xiàn)程學(xué)習(xí)(七)并發(fā)編程些問(wèn)題

    摘要:因?yàn)槎嗑€(xiàn)程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線(xiàn)程的使用。舉個(gè)例子如果說(shuō)服務(wù)器的帶寬只有,某個(gè)資源的下載速度是,系統(tǒng)啟動(dòng)個(gè)線(xiàn)程下載該資源并不會(huì)導(dǎo)致下載速度編程,所以在并發(fā)編程時(shí),需要考慮這些資源的限制。 最近私下做一項(xiàng)目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項(xiàng)目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門(mén): Java多線(xiàn)程學(xué)習(xí)(一)Java多線(xiàn)程入門(mén) Jav...

    yimo 評(píng)論0 收藏0
  • Java并發(fā)編程筆記(

    摘要:并發(fā)編程實(shí)戰(zhàn)水平很高,然而并不是本好書(shū)。一是多線(xiàn)程的控制,二是并發(fā)同步的管理。最后,使用和來(lái)關(guān)閉線(xiàn)程池,停止其中的線(xiàn)程。當(dāng)線(xiàn)程調(diào)用或等阻塞時(shí),對(duì)這個(gè)線(xiàn)程調(diào)用會(huì)使線(xiàn)程醒來(lái),并受到,且線(xiàn)程的中斷標(biāo)記被設(shè)置。 《Java并發(fā)編程實(shí)戰(zhàn)》水平很高,然而并不是本好書(shū)。組織混亂、長(zhǎng)篇大論、難以消化,中文翻譯也較死板。這里是一篇批評(píng)此書(shū)的帖子,很是貼切。俗話(huà)說(shuō):看到有這么多人罵你,我就放心了。 然而知...

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

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

0條評(píng)論

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