Thread的共享與不共享變數情況

2021-10-07 17:29:07 字數 1190 閱讀 7765

一、不共享變數的執行緒

1.方法建立變數

class

program

static

voidgo(

)}}

thread執行緒開始時會建立done變數;

主線程開始時也會建立done變數;

結果會輸出兩個done;

2.本地變數

class

program

}class

threaddemo

}}

有乙個本地變數done值為fallse。因為執行緒是呼叫的是有引數的方法,所以使用parameterizedthreadstart 進行封裝threaddemo物件的go方法,把done值傳進去,然後主線程在呼叫threaddemo.go(done)

列印了兩次done

二、執行緒之間共享的資料

2.如果多個執行緒引用了同乙個物件的例項,那麼這些執行緒會共享這些資料

class

program

}class

booldone

public

voidgo(

)}}

有乙個booldone類,有乙個布林型別的done,以及乙個go方法

go方法:當done為false的時候,done=true並且列印乙個done;

在main中建立這種型別的變數,然後呼叫thread執行緒執行go 方法,

然後主線程也呼叫go方法。

這時候只會列印乙個done。

即同乙個例項的變數在不同的執行緒間是共享的。

3.當變數為靜態變數的時候也會共用

class

program

public

static

voidgo(

)}}

有乙個靜態變數done。執行緒thread與主線程都呼叫go()方法,只列印乙個done

4.被lambda表示式或者匿名方法捕捉到的本地變數。

class

program};

newthread

(action)

.start()

;action()

;}

這裡相當於把done當成同乙個例項的變數,從而變成共用的資料。

小白的多執行緒修行之路1(共享變數與不共享變數)

本人,小白一枚,以下是我自己學習過程中所做的一些研究,如果有錯誤之處,還請指出來,我會及時改正,謝謝哈!自定義執行緒類中的變數與其他執行緒可以有共享與不共享之分 1 不共享資料的情況 如下例所示 通過執行緒池去建立三個執行緒,也可採用其他的形式,這裡所使用的是執行緒池去建立執行緒,每個執行緒都有自己...

共享與偽共享

共享就是乙個記憶體區域的資料被多個處理器訪問,偽共享就是不是真的共享。這裡的共享這個概念是基於邏輯層面的。實際上偽共享與共享在cache line 上實際都是共享的。cpu訪問的資料都是從cache line 中讀取的。如果cpu 在cache 中找不到需要的變數,則稱快取未命中。未命中時,需要通過...

Spark共享變數

預設情況下,如果在乙個運算元的函式中使用到了某個外部的變數,那麼這個變數的值會被拷貝到每個task中。此時每個task只能操作自己的那份變數副本。如果多個task想要共享某個變數,那麼這種方式是做不到的。spark為此提供了兩種共享變數,一種是broadcast variable 廣播變數 另一種是...