java同步实现方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、引言

前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊。闲话不多说,进入正题。

二、为什么要线程同步

因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚。因此多线程同步就是要解决这个问题。

三、不同步时的代码

Bank.java

1.packagethreadTest;

2.

3./**

4.*@authorww

5.*

6.*/

7.publicclassBank{

8.

9.privateintcount=0;//账户余额

10.

11.//存钱

12.publicvoidaddMoney(intmoney){

13.count+=money;

14.System.out.println(System.currentTimeMillis()+"存进:"+money);

15.}

16.

17.//取钱

18.publicvoidsubMoney(intmoney){

19.if(count-money<0){

20.System.out.println("余额不足");

21.return;

22.}

23.count-=money;

24.System.out.println(+System.currentTimeMillis()+"取出:"+money);

25.}

26.

27.//查询

28.publicvoidlookMoney(){

29.System.out.println("账户余额:"+count);

30.}

31.}

SyncThreadTest.java

1.packagethreadTest;

2.

3.

4.publicclassSyncThreadTest{

5.

6.publicstaticvoidmain(Stringargs[]){

7.finalBankbank=newBank();

8.

9.Threadtadd=newThread(newRunnable(){

10.

11.@Override

12.publicvoidrun(){

13.//TODOAuto-generatedmethodstub

14.while(true){

15.try{

16.Thread.sleep(1000);

17.}catch(InterruptedExceptione){

18.//TODOAuto-generatedcatchblock

19.e.printStackTrace();

20.}

21.bank.addMoney(100);

22.bank.lookMoney();

23.System.out.println("n");

24.

25.}

26.}

27.});

28.

29.Threadtsub=newThread(newRunnable(){

30.

31.@Override

32.publicvoidrun(){

33.//TODOAuto-generatedmethodstub

34.while(true){

35.bank.subMoney(100);

36.bank.lookMoney();

37.System.out.println("n");

38.try{

39.Thread.sleep(1000);

40.}catch(InterruptedExceptione){

41.//TODOAuto-generatedcatchblock

42.e.printStackTrace();

43.}

44.}

45.}

46.});

47.tsub.start();

48.

49.tadd.start();

50.}

51.

52.

53.

54.}

代码很简单,我就不解释了,看看运行结果怎样呢?截取了其中的一部分,是不是很乱,有写看不懂。

1.余额不足

2.账户余额:0

3.

4.

5.余额不足

6.账户余额:100

7.

8.

9.1441790503354存进:100

10.账户余额:100

11.

12.

13.1441790504354存进:100

14.账户余额:100

15.

16.

17.1441790504354取出:100

18.账户余额:100

19.

20.

21.1441790505355存进:100

22.账户余额:100

23.

相关文档
最新文档