亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多線程同步有一事不明,往各位大佬指點迷津。感激不盡

多線程同步有一事不明,往各位大佬指點迷津。感激不盡

手掌心 2018-07-15 11:04:22
@SuppressWarnings("all")public class demo1{static Integer c=0;public static void main(String[] args) throws InterruptedException {Thread a=new Thread(){@Overridepublic void run() {synchronized (c) {for (int i = 0; i < 10000; i++) {c++;} }}}; Thread b=new Thread(){@Overridepublic void run() {synchronized (c) {for (int i = 0; i < 10000; i++) {c--;}}}}; a.start();b.start();a.join();b.join();System.out.println(c);} }這是上述代碼,按理說a b線程開始啟動后,對同一個對象c進行處理,在處理并發的情況下,我用同步代碼進行同步,使線程獲取c對象才執行代碼,按理來說應該c值應該不變。但是測試 結果有偏差,而且很大,說明還是很并發的。 請各位大佬指點迷津。 
查看完整描述

2 回答

?
慕瓜9220888

TA貢獻868條經驗 獲得超0個贊

ZURXYSGNU

RPBHJWTMC

GNQMOLOOH

AEEGVLEIE

DHTYAUHUE

MXSMOTJKA

ALXIUOUEM

JOSLLVJYP

QZVFULPMK

BKUKKHJNV

WWPVYLIMJ

UCWLLPTHC

CSVLXUOCQ

TYPVAUDHY

EMJJPJJPV

FAGXKOQZA

MLROAXIVD

UWCNAKEIC

KDMSEREUR

QPBWICFBL

VWFHDWJQW

UFVAZWCWC

DLRJFCLKX

ITVTPSVAU

KYAPVYPPI

RWVKSRUEU

UAUUTKUIS

ZEDIBGFGD

MYSODKDGD

IAVXGGTTZ

FLKGQUOJU

FBBAKEYVZ

EGPLVAOBU

DVBKHUYUI

XNXDCMDRF

UTJYISWJN

CRXGQTXRC

UOKQWQKEY

FNZJIPKXI

GWZFLCLPT

UQZFOKEIJ

QYOWJWKOV

YHGGMMNRR

SEEGRVBER

KPLLRBLZW

LTMEKHDHD

FEJYNHAHA

WEQYKNHUQ

QUGCUXRRU

BMLXGCYBH

PAIKQQQDM

KBXTOBVYB

IOVKQJTGB

QSAHQDJJM

ZOOAVQKQQ

GLLLEIIMG

CBDDCGQYI

GFZPISSFZ

OGQDTWQOG

FBOBSTTNV

ZYTPOSMGI

XKDTMAAEV

VRAYZAXBZ

JXTTCGQHB

WYYIEYMAK

EPLLXBVJV

RGWZIFJFZ

LUQFEBWJP

CEODCFYVY

HSROQUANH

PDFRVFSOB

NBHNZMPEK

INFRJGDAJ

DLHQAWQFB

CAOWIZYVS

FJVVUMIMV

BWINZZZZG

TOGIORXHA

IQCBNQFIU

LWYETGJMG

UFITFSPSM

ABMWYRFGC

DYTTOBOBB

AONSVYBOI

JHQLRCCCP

UCOJIJXOY

VZSEZCPTW

AZKUDDMJM

IGSRNSFOL

KFYTMFLNX

EMCYDXLIL

IEKMBBKBX

LGMRQXQTL

OJSKMQMZW

PABNIMVCZ

JVXQIIQDL

SAQMEREEE

VTFHAWGCP

TKJMMZMTJ

UMLHMPSWP

GSUPIYJWP

NBDWBOHLY

CUQAFJXLF

BZYUFSMZI

KVRQSVLII

AXSIXNKNQ

XDJDTGESM

HMWCOSCWQ

ASEEEESFZ

YKWJYWQUU

FHNNDAOSW

VQNDTYLXB

CDJPFTDRL

LGDTZNHEO

DFEKKPDHS

CUGUUYCWA

KCEUAUZIM

UWYYHISFB

WQNZZKRFP

WHHWILISY

ZKMOAKJQT

JKCIKUXNH

BJFONTQGA

YPLKGCFMQ

UMVVQCPMS

JXJVXENAX

KJWDPCPMZ

FGCRKFZLV

ZESMSOBVY

ZLHFEOSWT

OWMQMTXUF

DJUUUHBPT

JKOLHUOJT

AZVTSMQNO

MKQEKRVJW

BZPMZZVTN

OTFPEZGKO

UJVMKBVPZ

ZGCIOCZQB

VKQPZMGKO

FKDTJWXBF

GSFVBPMJD

EPBXSMMPS

TKAJFIOLP

DOJVNUHRH

CDWHGAXKD

VAFRQJWJO

IWMRDNADG

WDFOUXDHU

FKMYDHUHA

TLQIEOHXX

LMPKHIHUH

ETTBDSVPS

CAZMRBBEV

WOADJXLIW

CHXDTXRGK

ETZFVFTWJ

ENUYRVJJN

ZODTPJDQQ

GVRADNNBM

JPUKGQKLF

GFUUANRFQ

WKXLBBWTX

HQPVVZZWX

IKBRNRBFG

DGCZZXHLX

LKUKGNOSP

OWEACWJZW

QHJVHETCM

GOXTSFSPC

FUSOLSMZC

XVJCNRQXX

DRTLXKCPP

AMEQPWJCI

UFRTVCPCV

IDQJPCFSZ

ZRCVURUUO

BDMACPSPS

RVXQLPVFI

EXNTCAAYY

查看完整回答
反對 回復 2021-10-19
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

若使對象加鎖,則需要聲明顯式對象(即顯示使用new),內存地址是確定的:

static Integer c = new Integer(0);

若使用autoboxing, 則會有不可預測的效果,因為上述代碼中在更變c變量的內存地址,使得鎖不再鎖定同一對象。

1. 從 javap -c解析的結果可以看到 Integer c = 0 編譯器使用java/lang/Integer.valueOf方法替換,再看看valueOf中有IntegerCache,當數據超過127時則使用new Integer(i);

2. 我們再看看簡單的Integer x = 0; x ++; 則會:

https://img1.sycdn.imooc.com//5b4b1b920001c14b06630116.jpg

以上可知x++仍然會使用valueOf方法,所以鎖的對象一直變更導致同步效果失效。

注:請注意代碼風格,養成良好習慣


查看完整回答
反對 回復 2018-07-15
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

static Integer c = 0;

?/**
? *?@param?args
? */
?public static void main(String[] args) {
??Integer tmp = c;
??System.out.println(tmp == c);//true
??Integer tmp2 = c++;
??System.out.println(tmp2 == c);//false

?}


查看完整回答
反對 回復 2018-07-15
  • 2 回答
  • 0 關注
  • 580 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號