第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

多線程:(三)線程范圍的共享變量初體驗(yàn)

標(biāo)簽:
Java

前序:先说一下吧,我写过的这些,基本都是我看张孝祥老师的视频,自己做的笔记,今天也是无意间看到,网上好多类似的总结啊,包括我以后写的所有。这...好尴尬,好像是自己抄袭,还写着原创(不管了,如有雷同,纯属巧合吧)。


对于共享变量的操作,要使得在一个线程内的访问和传递,不被其他线程干扰,可以像多线程(一)(二)中提到的那样,加锁实现(个人理解,锁是一种对公共逻辑的锁定,如果用于此处的共享变量,就要对每个线程的逻辑加锁,倒是有些不太美妙),也可以像本次总结这么来做......

一、先看一个没有实现线程范围内共享变量的例子:

上码:

public class ThreadScopeShareData {

    private static int data = 0;
    public static void main(String[] args) {
        //创建两个线程,对于共享变量data的操作,这样做的话,data的值会相互干扰。
        for(int i = 0; i < 2; i++) {
            new Thread(new Runnable(){
                @Override
                public void run() {
                    data = new Random().nextInt();
                    System.out.println(Thread.currentThread().getName() + " has put data :" + data);
                    new A().get();
                    new B().get();
                }
            }).start();
        }

    }

    static class A{
        public void get(){
            System.out.println("A from " + Thread.currentThread().getName() 
                    + " get data :" + data);
        }
    }

    static class B{
        public void get(){
            System.out.println("B from " + Thread.currentThread().getName() 
                    + " get data :" + data);
        }       
    }
}

打印结果:
Thread-0 has put data :498444471
A from Thread-0 get data :498444471
Thread-1 has put data :-308050819
A from Thread-1 get data :-308050819
B from Thread-0 get data :-308050819
B from Thread-1 get data :-308050819

解决办法一:可以像前面提到的,把run()方法的逻辑,加锁(代码例子举得是两个线程,相同的处理逻辑。如果碰到多个线程,处理逻辑不同,就能体现出,仅仅对于共享变量的操作而言,加锁有点繁琐,也会浪费一些时间)

二、用Map线程内对共享变量的操作

意思就是,构建一个map,Thread作为键,业务逻辑处理时,按Thread来取值就可以了,该值肯定是共享变量在该线程范围内的副本。
上码:

/**
 * 这个例子,我把两个线程不用for循环创建了,单独new一下,把data分别复制111和222,方便查看
 * @author yang
 */
public class ThreadScopeShareData {

    private static int data = 0;
    private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();
    public static void main(String[] args) {

            new Thread(new Runnable(){
                @Override
                public void run() {
                    data = 111;
                    System.out.println(Thread.currentThread().getName() 
                            + " has put data :" + data);
                    threadData.put(Thread.currentThread(), data);
                    new A().get();
                    new B().get();
                }
            }).start();
            new Thread(new Runnable(){
                @Override
                public void run() {
                    data = 222;
                    System.out.println(Thread.currentThread().getName() 
                            + " has put data :" + data);
                    threadData.put(Thread.currentThread(), data);
                    new A().get();
                    new B().get();
                }
            }).start();
    }

    static class A{
        public void get(){
            int data = threadData.get(Thread.currentThread());
            System.out.println("A from " + Thread.currentThread().getName() 
                    + " get data :" + data);
        }
    }

    static class B{
        public void get(){
            int data = threadData.get(Thread.currentThread());          
            System.out.println("B from " + Thread.currentThread().getName() 
                    + " get data :" + data);
        }       
    }
}

打印结果:
Thread-0 has put data :111
Thread-1 has put data :222
A from Thread-1 get data :222
A from Thread-0 get data :111
B from Thread-1 get data :222
B from Thread-0 get data :111

此次Map方式解决该问题,就是下一次要说的ThreadLocal的实现原理,请关注下一章。
好了,结束。简单总结,深刻理解。

原文:---多线程:(三)线程范围的共享变量初体验


那时年少轻狂,把喜欢当做筹码,才敢肆无忌惮的任性。
----那时年少轻狂

點(diǎn)擊查看更多內(nèi)容
3人點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消