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

資訊專(zhuān)欄INFORMATION COLUMN

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

CKJOKER / 3072人閱讀

摘要:進(jìn)入方法線程停止關(guān)鍵字雖然擁有多個(gè)線程之間的可見(jiàn)性,但是卻不具備原子性關(guān)鍵字用于針對(duì)多個(gè)線程可變的變量操作,但是不能替代關(guān)鍵字的同步功能。

volatile關(guān)鍵字的作用是變量在多個(gè)線程之間可見(jiàn)
volatile的作用是強(qiáng)制線程到主內(nèi)存(共享內(nèi)存)里讀取變量,而不是線程工作內(nèi)存區(qū)里去讀取變量,從而實(shí)現(xiàn)了多個(gè)線程之間的變量可見(jiàn),也就是滿足線程安全的可見(jiàn)性。

    private volatile boolean isRunning = true;
    private void setRunning(boolean isRunning){
        this.isRunning = isRunning;
    }
    
    public void run(){
        System.out.println("進(jìn)入run方法..");
        int i = 0;
        while(isRunning == true){
            //..
        }
        System.out.println("線程停止");
    }

volatile 關(guān)鍵字雖然擁有多個(gè)線程之間的可見(jiàn)性,但是卻不具備原子性
volatile關(guān)鍵字用于針對(duì)多個(gè)線程可變的變量操作,但是不能替代synchronized關(guān)鍵字的同步功能。

atomic類(lèi)支持原子性操作

    private static AtomicInteger count = new AtomicInteger(0);
    
    
    /**synchronized*/
    public synchronized int multiAdd(){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            count.addAndGet(1);
            count.addAndGet(2);
            count.addAndGet(3);
            count.addAndGet(4); //+10
            return count.get();
    }

多個(gè)addAndGet在一個(gè)方法內(nèi)是非原子性的,需要加synchronized進(jìn)行修飾,保證4個(gè)addAndGet整體原子性

線程通信
使用wait和notify可以實(shí)現(xiàn)線程之間的通信

wait/notify必須配合synchronized 關(guān)鍵字使用

wait釋放鎖 notify不釋放鎖

所有的object都可以使用該方法

   // final Object lock = new Object();
    final CountDownLatch countDownLatch = new CountDownLatch(1);
    
    Thread t1 = new Thread(new Runnable() {
    
            public void run() {

                //synchronized (lock) {
                    try {
                        
                        //countDownLatch.countDown();
                        //countDownLatch.awat();
                        //lock.notify();
                        //lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                //}
            }
    }, "t1");

使用wait/nofity的缺點(diǎn)是無(wú)法實(shí)現(xiàn)實(shí)時(shí)的通信 推薦使用countDownLatch 來(lái)實(shí)現(xiàn)實(shí)時(shí)的交互

使用wait/notify模擬Queue

public class MyQueue {
    
    //1 需要一個(gè)承裝元素的集合 
    private LinkedList list = new LinkedList();
    
    //2 需要一個(gè)計(jì)數(shù)器
    private AtomicInteger count = new AtomicInteger(0);
    
    //3 需要制定上限和下限
    private final int minSize = 0;
    
    private final int maxSize ;
    
    //4 構(gòu)造方法
    public MyQueue(int size){
        this.maxSize = size;
    }
    
    //5 初始化一個(gè)對(duì)象 用于加鎖
    private final Object lock = new Object();
    
    
    //put(anObject): 把a(bǔ)nObject加到BlockingQueue里,
//如果BlockQueue沒(méi)有空間,則調(diào)用此方法的線程被阻斷,
//直到BlockingQueue里面有空間再繼續(xù).
    public void put(Object obj){
        synchronized (lock) {
            while(count.get() == this.maxSize){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //1 加入元素
            list.add(obj);
            //2 計(jì)數(shù)器累加
            count.incrementAndGet();
            //3 通知另外一個(gè)線程(喚醒)
            lock.notify();
            System.out.println("新加入的元素為:" + obj);
        }
    }
    
    
    //take: 取走BlockingQueue里排在首位的對(duì)象,
//若BlockingQueue為空,
//阻斷進(jìn)入等待狀態(tài)直到BlockingQueue有新的數(shù)據(jù)被加入.
    public Object take(){
        Object ret = null;
        synchronized (lock) {
            while(count.get() == this.minSize){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //1 做移除元素操作
            ret = list.removeFirst();
            //2 計(jì)數(shù)器遞減
            count.decrementAndGet();
            //3 喚醒另外一個(gè)線程
            lock.notify();
        }
        return ret;
    }
    
    public int getSize(){
        return this.count.get();
    }
    
    
    public static void main(String[] args) {
        
        final MyQueue mq = new MyQueue(5);
        mq.put("a");
        mq.put("b");
        mq.put("c");
        mq.put("d");
        mq.put("e");
        
        System.out.println("當(dāng)前容器的長(zhǎng)度:" + mq.getSize());
        
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                mq.put("f");
                mq.put("g");
            }
        },"t1");
        
        t1.start();
        
        
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Object o1 = mq.take();
                System.out.println("移除的元素為:" + o1);
                Object o2 = mq.take();
                System.out.println("移除的元素為:" + o2);
            }
        },"t2");
        
        
        try {
            //代替Thread.sleep(1000);
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        t2.start();
        
        
    }
    
    
    
}

TimeUnit是java.util.concurrent包下面的一個(gè)類(lèi),TimeUnit提供了可讀性更好的線程暫停操作,通常用來(lái)替換Thread.sleep()

每次寫(xiě)一個(gè)具有設(shè)計(jì)意義的小程序 考驗(yàn)的是分析能力

ThreadLocal:
ThreadLocal 是線程局部變量 是一種多線程間 并發(fā)訪問(wèn)變量 的解決方案
ThreadLocal 完全不提供鎖,以空間換時(shí)間的方式 為每一個(gè)線程提供變量的獨(dú)立副本 以保障線程安全

    private static ThreadLocal th = new ThreadLocal();

在并發(fā)量不高 的時(shí)候 ,加鎖的性能會(huì)更好
座位一套無(wú)鎖的線程安全解決方案 使用ThreadLocal可以減少所競(jìng)爭(zhēng)

單例模式+多線程
在提高性能的時(shí)候 有保證了線程安全

dubble check Instance

public class DubbleSingleton {

    private static DubbleSingleton ds;
    
    public  static DubbleSingleton getDs(){
        if(ds == null){
            try {
                //模擬初始化對(duì)象的準(zhǔn)備時(shí)間...
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (DubbleSingleton.class) {
                if(ds == null){
                    ds = new DubbleSingleton();
                }
            }
        }
        return ds;
    }
}

static inner class

public class Singleton {
    
    private static class InnerSingleton {
        private static Singleton single = new Singleton();
    }
    
    public static Singleton getInstance(){
        return InnerSingleton.single;
    }
    
}

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

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

相關(guān)文章

  • Java多線程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

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

    dingding199389 評(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多線程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

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

    yimo 評(píng)論0 收藏0
  • 史上最全的并發(fā)編程學(xué)習(xí)

    一:線程基礎(chǔ)知識(shí) 1.并發(fā)編程的基本概念 2. 線程的基本操作 3.線程之間的通信wait和notify 4.join和yield以及sleep詳解 5. synchronized關(guān)鍵字講解 6. volatile原理 7. 線程組 8.線程優(yōu)先級(jí) 9.守護(hù)線程 10.ThreadLocal 二:JDK并發(fā)包 1.jdk并發(fā)工具類(lèi) 重入鎖 信號(hào)量 讀寫(xiě)鎖 CountDownLatch cyclic...

    qylost 評(píng)論0 收藏0
  • Python基礎(chǔ)之使用期物處理并發(fā)

    摘要:本文重點(diǎn)掌握異步編程的相關(guān)概念了解期物的概念意義和使用方法了解中的阻塞型函數(shù)釋放的特點(diǎn)。一異步編程相關(guān)概念阻塞程序未得到所需計(jì)算資源時(shí)被掛起的狀態(tài)。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握異步編程的相關(guān)概念;2、了解期物future的概念、意義和使用方法;3、了解Python...

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

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

0條評(píng)論

CKJOKER

|高級(jí)講師

TA的文章

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