首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

线程中的资源共享跟同步

2013-01-28 
线程中的资源共享和同步?这个总结将对线程中的资源共享和线程同步问题进行简单的分析。线程:是进程中的一个

线程中的资源共享和同步

?这个总结将对线程中的资源共享和线程同步问题进行简单的分析。

线程:是进程中的一个单一的连续控制流程。

一个进程可以含有多个线程,那下面就谈谈多线程。
java中多线程的实现有两种手段:1 继承Thread类? 2实现Runnable接口
这里以买火车票为例。

?对于这个的运行结果我们之前已经试过了,从结果上看,它虽然实现了多线程,但它好像并不符合实际,我们定义一共有10张票,分三个地方来买,那就是说三个地方共享这10张票,可结果出现了30个数,显然是不对的,那如果把代码改一下:

?再运行,结果:

卖票:10
卖票:9
卖票:8
卖票:7
卖票:6
卖票:5
卖票:4
卖票:3
卖票:2
卖票:1

资源共享的问题也算是解决了。
还有一个问题就是线程同步的问题,这也是值得我们注意的问题,把上面的代码再进行修改:

?运行结果:
卖票:10
卖票:9
卖票:8
卖票:7
卖票:6
卖票:5
卖票:4
卖票:3
卖票:2
卖票:1
卖票:0
卖票:-1

出现了两个不该出现的结果,那我们来分析一下出现这个结果的原因。
我们分三个售票点共同买10张票,当票数只剩一张的时候,假如被A拿走了,然后进入sleep中,而在这个时候,B也将最后一张票拿走了,而此时的tickets还等于1,当A把tickets放回的时候,tickets--变为了0,当B再放回的时候则出现了-1的情况。这就是不用步造成的。
那我们就要解决这个不同步的问题
下面介绍一下synchronized关键字:
??? 当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
??? 当两个并行的线程同时访问object的一个synchronized修饰的同步块是,同一时间只能有一个线程可以对其访问,只有当他访问完之后,另一个才能对其访问。
建立一个同步方法:

?运行结果:
b 卖票:10
b 卖票:9
b 卖票:8
b 卖票:7
b 卖票:6
b 卖票:5
b 卖票:4
b 卖票:3
b 卖票:2
b 卖票:1
这个结果虽然对票数同步了,但似乎又出现了其他的问题,一个售票点就把所有的票卖完了,回头看看我们的代码是哪里出了问题。
做如下改正:

?运行结果:
a 卖票:10
a 卖票:9
a 卖票:8
a 卖票:7
a 卖票:6
a 卖票:5
c 卖票:4
c 卖票:3
b 卖票:2
b 卖票:1
c 卖票:0
a 卖票:-1
又出问题了(无奈),看看又是什么情况,我们在同步方法中加一个if(this.tickets>0)保护,在运行,看看结果吧... ...终于没问题了。

热点排行