经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题。
此处用多线程实现,同时取款的模拟实现,使用同步代码块确保线程同步,查看取款安全隐患问题,代码如下:
--------------------------------------------------------------------------------------------------------------------------------------
* 线程同步 :使用同步块,实现线程同步
* 同步synchronized块的对象监视锁可为为: 任意的对象(此处为'account'对象)。
* (runnable适用于共享同一对象(如:this),如果thread继承就会有问题[保证thread继承下安全:1.锁使用涉及当前对象外的对象(例如:syncblock、bankaccount对象外的其他类对象;2.锁使用静态当前类对象)])
* 多个线程使用同一把锁,如果线程安全必需确保:多个线程使用的是同一个对象监视锁对象
* synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
* 所有访问此同步代码块的线程都在同步块外等待,都会判断同步锁,降低效率,但确保线程安全问题,外,同步代码块外代码正常执行
* 同步方法优于同步代码块:性能和memory空间上。
* 同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可
private void makewithdraw(int amount){
/*.........同步代码块外代码.............*/
synchronized (account) {
//同步代码
}
}
银行账户:
同步代码块代码:
测试代码:
测试结果:
分析结果:
双线程总共取款10次,账户总额为500.
取款结果:在多线程访问下,成功取款总额为500,并且其他取款下,正确提示信息。
多线程访问安全保证!