Synchronized ,大家都知道这个是Java 提供的一种原子性内置锁,其实现原理是通过获取对象的监视器monitor进行来实现同步的,只有当线程获取到对象monitor才能继续执行,否则该线程进行阻塞(等待)
public class DemoServiceImpl {
@Autowired
private DemoDao demoDao;
// 根据id获取序列号,获取完之后进行 + 1
@Transactional
public synchronized String getSn(Long id) {
DemoSn sn = demoDao.getSnById(id);
sn.setSn(sn.getSn() + 1);
demoDao.update(sn);
return sn.getSn().toString();
}
}
描述一下代码示例: 该方法涉及++ 1 ,当如果多个线程进行调用该方法时,会出现数据安全性问题,所以在这里进行加了 Synchronized, 保证该方法的每次执行只能允许一个线程进来。
测试后发现,这个 Synchronized 没起作用。
Synchronized 失效关键原因:是因为Synchronized锁定的是当前调用方法对象,而Spring AOP 处理事务会进行生成一个代理对象,并在代理对象执行方法前的事务开启,方法执行完的事务提交,所以说,事务的开启和提交并不是在 Synchronized 锁定的范围内