线程同步是指有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,目前实现线程同步的方法有很多,临界区对象就是其中一种。
比如说,A在车站1买票,B在车站2买票,假设车票的总数是100,A买完一张后,B再去买票则只剩下99张。我们以这个例子,以实现接口的方式创建多线程,来说明解决该问题的思路
由上显示结果可知,创建两个线程,同时调用run方法,说明定义了两个成员变量i ,则票的总数应该是200,说明该思路是错的。我们应该规定i=100,且两个线程同时共享此变量i 修改如下:
出现这个问题的原因,则是当线程1刚走完打印输出这一行代码,而没有执行i–的时候,cpu则去执行线程0,则会出现以上的情况。所以,只要是执行if()后,应该是执行if的全部代码,而不允许中途执行其他线程。修改如下:
修改的部分也就增加两行代码而已,意思很明显,就是只要执行到if,则必须执行完这整个部分,才执行其他程序。synchronized这个函数修饰代码块是则需要加(),里面放任意的字符串,如果修饰函数,则什么都不需要加。
另外可以思考这样一个问题,当我们只改变如下代码,其他的什么都不变,效果会怎样呢?
显然是错的,这是为什么呢?
我们在使用继承thread的做示例:也就是在上例中,将实现修改为继承,然后将字符串变量a定义成静态的。其他的没有任何改变,我们还是可以得出正确的结果
其实也就是创建两个对象,两个进程是相互独立的(钥匙a是独立的),所以不加static就会出错。如果实在不能理解,那可以在编写的时候钥匙a和票数全部加上static,结果也是正确的。先会写,再理解,熟能生巧。
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777