连咸鱼都能学会的Java多线程同步实现
哈喽,上期博客我们讲了下多线程的实现,那么这期我们来讲下多线程的同步问题
多线程为什么要同步?
问的好,因为存在这样的情况:
当多个线程同时访问一个对象/变量时,这些线程有对对象/变量进行读/写操作,会导致当前对象或变量值状态出现混乱,从而导致程序异常。我举个例子给你看看:
在银行里,小明的卡里有0块,当其账户同时被两个线程操作,一个存100块,一个取100块,会出现什么结果呢?
1.取钱不成功,卡里余额为100
2.取钱成功,卡里余额为0
到底是结果1 , 还是结果2?
无法确定,所以要采用多线程同步解决这种问题。
接下来,我们先用不同步代码来实现这个例子:
我们先来定义小明的账户,及其存取钱的方法(不同步)
接着,我们写个测试类来测试多线程来同时运行存取钱线程,
很好,我们来运行下看看结果:
很好,一开始的时候状态量都非常清晰明确, 我们再接着看,
我们可以清晰的看到,状态量开始混乱起来了,就同我上文所说一样,状态量的混乱会导致程序出现异常
接着,我们来试下用线程同步来运行下存取钱线程
首先,我们先对Bank.java 的存取钱方法进行改造,用synchronized 来修饰,确保线程同步
测试类SyncThreadTset.java 保持不变, 我们运行它,看看结果如何:
从结果可以看到,状态量混乱的情况已经看不到了,很好
当然,我们也能用synchronized代码块同步关键的代码,毕竟同步是一种高开销的操作,应该尽量减少同步的内容。
我们还可以用重入锁来实现线程同步(通过ReenreantLock类的 lock(), unlock()方法来实现),我们这边就不详细说了。
这期博客就到这里,下回见~
参考文献:
http://blog.****.net/ewili/article/details/8808491
http://blog.****.net/wenwen091100304/article/details/48318699