关于Jfinal 并发处理问题

@JFinal    

        在方法前加入了synchronized锁 但还是有很多请求在同一时间进入 怎么办呢 我现在就想只能有一个请求进入方法 其他请求都处于等待状态,当上一个请求处理完之后再处理下一个请求如果所有请求同时进入的话整个发送红包接口就不安全了 在我的实际检测中总是有请求在同一好眠进入 我真的是不会了 这样的话钱老师发多 公司已经损失了一部分钱了 blob.png 

blob.png

评论区

JFinal

2016-08-22 11:28

如果你在此类之上创建了多个对象,即便这个类上的方法用了 synchronized 也是没用的,因为 synchronized 是针对对象。如果要针对类级需要将方法声明为 static,这个是 java 基础,此外,你的昵称里面带有 @ 字符,所以 at 不到你,我帮你将 @ 改为下划线可否?

yuan_123

2016-08-22 11:31

@JFinal 可以改吧

JFinal

2016-08-22 11:32

补充一下,"非 static" synchronized 方法,如果想让其有效,就必须保证多线程都在在同一个对象实例上调用的该方法,而不是 new 出不同的对象去调用该方法

yuan_123

2016-08-22 11:34

@JFinal 加入了static 就能保证该方法 一次只能执行一个请求是吗

JFinal

2016-08-22 11:37

@yuan_123 对,但一般不是工具类方法都不用 static 方法。只要保障多线程都在使用的在这同一个对象调用该方法就可以,不一定要使用 static 方法

yuan_123

2016-08-22 11:37

@JFinal 加入static后就不具备controller属性了 getP不好使了

JFinal

2016-08-22 11:39

你这个对象是放在哪里的?如果是在 controller 中,可以将其声明我 static 的:
private static MySerivce myService = new MySerivce();
然后在 controller 中使用这个 myService 的时候就是共享的同一个对象了, synchronized 就有效了

yuan_123

2016-08-22 11:56

@JFinal 我大概理解你的意思了 我们锁的其实是一个对象 而如果有多个对像的话 有没有声明到底要锁哪个对象的时候 实际上锁是没有用的 但我现在问题是这样的 我这controller的方法里面有很多的限制条件 操作数据库等 没有一个 绝对的条件作为对象 所以 你说的那个不是很理解

JFinal

2016-08-22 11:58

@yuan_123 你只要记住:控制多线程不能同时进入一个方法,只能一个一个进入同一个方法,必须保证这些个线程是作用在同一个对象之上

IvyHelen

2016-08-22 14:28

你发红包的话,如果单单通过controller里面的锁来限制,挺麻烦的,而且效率也不是很高。 建议通过redis进行排队。或者使用MQ消息队列。 排好队之后,获取前N条记录即可。 web还是多线程的,但是可以通过redis或者rabbitMQ ,使其排队。 @Jfinal 我这种思路不知道有没有不妥之处。 之前我们小型的秒杀是用redis排队,大型的就用了rabbitMQ。

yuan_123

2016-08-22 14:32

@IvyHelen 恩恩 你有这个redis的小demo吗我要学习学习 之前我师傅用过 syn锁 但是其访问页面的时候会出现空白 我先在其实遇到的主要问题是这个接口被人家攻破了 然后他通过线程向我发送请求 我这边判断不好使了 导致总是给别人发多这样钱就损失了

IvyHelen

2016-08-22 15:00

@yuan_123 http://my.oschina.net/ydsakyclguozi/blog/536748 乐观锁秒杀

Romeo

2016-08-22 15:39

@IvyHelen 大兄弟 一个活动有200个红包, 有很多人同时抢,redis排队能应付吗,rabbitMQ我没有用过,请问到多少数量的时候用这个比较合适

IvyHelen

2016-08-22 17:02

@Romeo 200理论上没问题啊, 这个我测试过, 双tomcat, 600不出错。 95%反应时间为3s。

IvyHelen

2016-08-22 17:03

@Romeo 我使用的是jmeter, 0s之内发出600请求。 这种算是基本的高并发吧。 单tomcat不会支持很多的。 两个tomcat如果并发高了都扛不住。

IvyHelen

2016-08-22 17:04

@Romeo rabbitMQ的话, 大约几千并发的时候可以采用了。

IvyHelen

2016-08-22 17:50

@IvyHelen 没做过具体统计,赶紧1500以上就可以上了。 再说,现在大一点的公司,MQ应该是标配。 所以200并发都可以上。

canx

2016-08-26 18:03

赞成IvyHelen,唯一资源,就得用同步处理

ssf123

2018-04-16 21:02

@JFinal synchronized public static String getsmallcode(Object shop_id) {

ssf123

2018-04-16 21:03

@JFinal synchronized public static String getsmallcode(Object shop_id) {这样写也不管用啊!

JJfinal

2019-05-29 10:14

@JFinal 感谢大哥科普

yuan_123

2020-03-31 11:36

public static final String SYNSTRCODE="synstrcode";

yuan_123

2020-03-31 11:37

synchronized (SYNSTRCODE){}
这么写就行啦

yuan_123

2020-03-31 11:37

方法外面定义一个 static 变量

yuan_123

2020-03-31 11:37

方法里面把这个锁上

热门反馈

扫码入社