为了账号安全,请及时绑定邮箱和手机立即绑定

多线程同步有一事不明,往各位大佬指点迷津。感激不尽

多线程同步有一事不明,往各位大佬指点迷津。感激不尽

手掌心 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 关注
  • 542 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信