synchronized 加锁失败

如梦之猿 发布于 09/08 10:37
阅读 723
收藏 0
//Controller.class
public static final Object lock = new Object();

String taskNo;
synchronized (lock) {
    taskNo = this.taskOrderManager.getTask(loginUser, getTask);
}
//TaskOrderManager.class
public String getTask(LoginUser loginUser, GetTask getTask)

在Controller层调用的时候加锁未生效,在实际调用的时候还是会有多个线程获取到相同的数据。

以下是问题补充:

@如梦之猿:系统框架用的spring boot (09/09 11:28)
加载中
0
120011676
120011676

上面代码没有问题

0
首席测试
首席测试

你初始化的时候给 taskNo 加锁?

如梦之猿
如梦之猿
不是初始化,是每个用户在获取任务时候需要返回的taskNo都是不同,但是在处理数据时,从数据库获取taskNo的时候会有相同的taskNo。由于业务处理问题,现在不能在表里添加version来控制。
0
10进制宇宙
10进制宇宙

new ReentrantLock().lock; 

然后try catch。

 

其实我也不懂,Google搜的。

0
March0605
March0605

代码看着没问题,没有达到期望效果,也许不是没有加锁成功,可能是你业务上的的问题,比如你的getTask方法的问题。可以在加锁代码块,加入日志,来验证有没有加锁成功。

0
keelahselai
keelahselai

这个是对象锁,加锁失败了,有可能是每个controller被调用的时候,都被重新创建了。

试试升级为类锁,这样肯定能锁住!

static syncronized() {}

 

kakai
kakai
他定义的lock是static的,这个代码没问题。
0
keelahselai
keelahselai

引用来自“osc_48449090”的评论

这个是对象锁,加锁失败了,有可能是每个controller被调用的时候,都被创新创建了。

试试升级为类锁,这样肯定能锁住!

static syncronized() {}

或者直接锁类 syncronized(this.class)

0
keelahselai
keelahselai

还有不建议在controller中加锁。

0
keelahselai
keelahselai

但是问题又来了,我记得controller是单例模式,单例模式,加对象锁,应该不会失效的。

0
keelahselai
keelahselai

引用来自“keelahselai”的评论

但是问题又来了,我记得controller是单例模式,单例模式,加对象锁,应该不会失效的。

来个大佬帮我解答一下吧

 

0
aqu
aqu

1.数据是不是本身就有重复的

2.单节点部署,还是多节点部署,如果是多节点的,得用分布式锁才能锁住.

如梦之猿
如梦之猿
数据肯定没有重复,单点部署项目。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部