不能用账户余额this.balance和this.password做为锁对象。
这两个对象都是可变对象,一但对他们进行赋值就会变成新的对象,加的锁就失效了。不能把可变的对象当成一把锁
Integer String Boolean相关的知识:Integer会缓存-128~127这个范围内的数值,String对象同样会缓存字符串常量到字符串常量池,可供重复使用,所以不能用来用作锁对象。
比如有线程A、B、C
线程A首先拿到balance1锁,线程B这个时候也过来,发现锁被拿走了,线程B被放入一个地方进行等待。
当A修改掉变量balance的值后,锁由balance1变为balance2.
线程B也拿到那个balance1锁,这时候刚好有线程C过来,拿到了balance2锁。
由于B和C持有的锁不同,所以可以同时执行这个方法来修改balance的值,这个时候就有可能是线程B修改的值会覆盖掉线程C修改的值