java同步实现方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.