Synchronized失效的情况
多例模式
Synchronized关键字注释在非静态方法上时,锁对象是当前对象,如果此时非单例调用,会导致锁失效!
解决方法:
解决方法:
1.使用单例模式,或锁定唯一对象
事务管理
Spring的@Transcation事务管理使用AOP方式实现,如果方法上有事务管理,则会导致锁放开后后一个方法已经执行,但此时上一个方法的事物还未提交,从而导致下一次执行时拿到的数据非最新数据,导致数据错乱
解决方法:
1.锁加在事务管理方法外
2.使用数据库锁
集群部署
Synchronized关键字只能进程内锁定,集群部署无法生效
解决方法:使用分布式锁
异常情况
如果在synchronized代码块中抛出异常,那么锁将不会被释放,因此,其他线程将无法获得锁。