连咸鱼都能学会的Java多线程同步实现

来源:互联网 发布:c语言中strtok 编辑:程序博客网 时间:2024/04/30 03:21

哈喽,上期博客我们讲了下多线程的实现,那么这期我们来讲下多线程的同步问题


多线程为什么要同步?

问的好,因为存在这样的情况:

当多个线程同时访问一个对象/变量时,这些线程有对对象/变量进行读/写操作,会导致当前对象或变量值状态出现混乱,从而导致程序异常。我举个例子给你看看:

在银行里,小明的卡里有0块,当其账户同时被两个线程操作,一个存100块,一个取100块,会出现什么结果呢?

1.取钱不成功,卡里余额为100

2.取钱成功,卡里余额为0

到底是结果1 , 还是结果2? 

无法确定,所以要采用多线程同步解决这种问题。


接下来,我们先用不同步代码来实现这个例子:

我们先来定义小明的账户,及其存取钱的方法(不同步)



接着,我们写个测试类来测试多线程来同时运行存取钱线程,




很好,我们来运行下看看结果:


很好,一开始的时候状态量都非常清晰明确, 我们再接着看,


我们可以清晰的看到,状态量开始混乱起来了,就同我上文所说一样,状态量的混乱会导致程序出现异常


接着,我们来试下用线程同步来运行下存取钱线程

首先,我们先对Bank.java 的存取钱方法进行改造,用synchronized 来修饰,确保线程同步



测试类SyncThreadTset.java 保持不变, 我们运行它,看看结果如何:


从结果可以看到,状态量混乱的情况已经看不到了,很好


当然,我们也能用synchronized代码块同步关键的代码,毕竟同步是一种高开销的操作,应该尽量减少同步的内容。


我们还可以用重入锁来实现线程同步(通过ReenreantLock类的 lock(), unlock()方法来实现),我们这边就不详细说了。


这期博客就到这里,下回见~



参考文献:

http://blog.csdn.net/ewili/article/details/8808491

http://blog.csdn.net/wenwen091100304/article/details/48318699