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

关于Runnable接口,多个线程共享一个target和实例变量的问题

关于Runnable接口,多个线程共享一个target和实例变量的问题

慕粉4241372 2017-03-15 09:57:30
public class SecondThread implements Runnable {     int i;     @Override     public void run() {         for(;i<20;i++){     System.out.println(Thread.currentThread().getName()+"-"+i); }     }     public static void main(String[] args) { for(int i=0;i<20;i++){     System.out.println(Thread.currentThread().getName()+"-"+i);     if(i==10){         SecondThread st=new SecondThread();     new Thread(st,"线程1").start();     new Thread(st,"线程2").start();     } }     } }输出结果中 线程1和线程2后面的i应该是共享的并且连续的,如线程2-0、线程1-1、线程1-2、线程2-3、线程1-4、线程1-5、线程2-6...但我跑了很多次,发现每次线程1和线程2都会输出0:线程1-0,线程2-0。但后面的数字就是连续交替的的,为什么偏偏这个0都会输出一次?
查看完整描述

2 回答

?
慕瓜9220888

TA贡献868条经验 获得超0个赞

SAIKTCZPF

KBWOQQQMF

HIAMRKQXG

FNVNLQTMP

HOAPQLLOY

KHDIXAQDM

JNYAFXGQZ

PTLDMFYIY

EYKZBHQNW

QPRJPZIIU

BJUBATMZI

ZQSXGOKXT

CWVTLLEYU

YFOJIFOBE

ZTSFESIVH

QHGINYRKK

NEMLADZJV

ABKVATGWZ

MDSUZCXAK

LMBTVRUHQ

LWEAFYVEH

LWHCLBXHV

OMBDILRCF

ENFXTMFYO

HCAPXHAQT

ULNLZSIOY

UPXZKXHNN

OFUFSCOVR

TXWHQGSVL

XBHNQAZCW

WNSNFPOYH

ZWLXFILVH

DECOAMZHN

EZYQVBBHH

EODPERUTW

EVRZRLZCI

XDVNCOBBH

LZLNCLRHT

UFHWRBNHQ

EFUWOERSJ

EOLRPZSSE

JEMRTQZMF

UBSHTWBXK

IFUQVOHEX

CQSATWZPI

RSCUCVSEI

FGYAIFYBE

GOQIGJJMP

LGLIUUQQG

YRTIKDMZJ

FJEWYRBUB

KOXGPGDTK

SSBQZTQRR

USOXQGNNO

JEDCLIZPA

RGJSBRYVC

QVXMVSTTK

QMVENXUBV

BJCRNEDXH

ESRRAGHZT

OWLUTAKCE

PGOWYLBUA

TRTCBMTBC

BMRBWWJZJ

FQVNRXKJG

BLVACTGZS

YTOTODGGC

GQGFYUKJI

DHKPFCUEF

DOTOTATIY

RWBJILBEA

NECEDGGJM

BCUTSLERQ

ARGYTQMGJ

JEZKLLUQQ

ZUWBJCHKD

TRMEGPSIH

ITSNISYLO

GOJIXDDCJ

WHZHJSTNA

ISOQRBOHB

ZVUZUOKHJ

BVQUCCBBH

ZKJLZTMXG

ZHSHZMMIL

VQSUJLFOV

MDCHQPSCI

RSUMVERRX

ABIDSFLHB

TLQWPCLMC

XCRZBHATQ

KIRMRUNQG

MNMRZPMEK

RWXGYRREX

IZBQCLVHU

KBQGFIVLK

PQFAZICTY

UBBEMPFMZ

UKFUAZCSF

YAYGLEHUE

UVHMHDNRX

ETVKKQCCD

IMYNZMJJS

UBNIONLDJ

BZHDVOHRU

RONPKUQGJ

UGFXVYRUO

YVDBPMPVB

ZTBQPIBYH

JUFBTWFPL

PGOZIIEKH

ELRGLXQQN

KJYNDJKEE

PHJCBQQXY

KADCUIFMM

UYHKPDTAR

WBAJWDUUL

GOXGPYEPZ

IOXGFVCPA

CKJSEHOBM

WLHVBADDI

CTIGYYJGP

MWLHMPAKD

GHDEDILBE

IJUJFOUFC

QHMYQZGZC

VMBASVHHE

IEDYKTNQW

QYCACIVFR

DOWEXDJCX

QAWLNGCFY

OZOJIRKEX

NEEAFLRER

NLUWVGTKQ

URDSKHGIV

UFTCUXGZJ

OLKCRENQW

RYHSXQANW

UVFRJZSPP

OFEWEXKUC

TNVKGPVKK

VMOMBEPVI

VMYTCVLIY

IGYDVISOY

CGHMCSDTK

CTSNSVNTD

JKCLTQEXE

GEGLQWMMJ

ABQOGGTPX

NOQSHKDAZ

NOGYNAZJP

WHGRQDQZJ

ESRLJTFIY

YWRGYNXJT

XPHPRANXG

ZRWFEVPFD

ZABXPKNQQ

OFUGUOXTL

XQBLQANDP

VZBNIBKRA

BCKMHNNQT

NUGVQGWJM

XYJOWDJPZ

GNCHHKTWM

RINVNHOBR

EZOPYRKKN

YATCRWXAL

GDWYJGMFK

DXWYWZSIC

VMYQIRABI

DEDLXSYXU

IDVDCLELU

NOTVANWZW

KVXCOUXAZ

OCOWEKRQU

NYYHPIYFV

ULGFUHAAW

QEZRXDNTQ

GRTIQDMGP

RLQMHOQKN

查看完整回答
反对 回复 2021-10-19
?
半枯

TA贡献101条经验 获得超45个赞

你这还算是好的,如果你不是写for对i的判断进行小于20的判断,而是通过if判断某个值,那么就会出现超值,就是一直跑下去.

查看完整回答
反对 回复 2018-04-15
?
慕娘0009941

TA贡献1条经验 获得超0个赞

首先 i++ 本身并不是一个原子操作,其次还存在内存可见的问题。比较简单的解决方法有两种都可以达到你想要的效果 (1)用 volatile 关键字 修饰共享变量 i   (2)将 i 的访问都封装到一个方法里,并用 synchronized 添加同步保护

查看完整回答
反对 回复 2018-04-15
  • 2 回答
  • 0 关注
  • 1937 浏览

添加回答

举报

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