下面代码里无锁和有锁比是更好的实现吗?我用jmeter每秒20个请求,无锁代码执行test()里的sleep操作的输出大部分与500毫秒差别巨大,而有锁代码的输出基本就是500毫秒相差1,2毫秒的样子,这个问题很怪异啊....
@Controller
@RequestMapping("/bench/")
public class BenchController {
@Autowired
private FlowService flowService;
private static Object[] lockObj;
private static AtomicReference[] locks;
static {
lockObj = new Object[100];
for (int i = 0; i < lockObj.length; i++) {
lockObj[i] = new Object();
}
locks = new AtomicReference[100];
for (int i = 0; i < locks.length; i++) {
locks[i] = new AtomicReference(null);
}
}
@RequestMapping("a")
@ResponseBody
public long a(int id) throws Exception {
long start = System.currentTimeMillis();
int index = id % 100;
long inner=0;
synchronized (lockObj[index]) {
inner=test();
}
long result = System.currentTimeMillis() - start;
System.out.println("all: "+result+" inner: "+inner);
return result;
}
@RequestMapping("b")
@ResponseBody
public long b(int id) throws Exception {
long start = System.currentTimeMillis();
AtomicReference lock=locks[id % 100];
while (!lock.compareAndSet(null, id)) {}
long inner=test();
boolean flag=lock.compareAndSet(id, null);
long result = System.currentTimeMillis() - start;
System.out.println("all: "+result+" inner: "+inner+" flag:"+flag);
return result;
}
public long test()throws Exception{
long innerstart = System.currentTimeMillis();
Thread.sleep(500);
System.out.println(System.currentTimeMillis()-innerstart);
return System.currentTimeMillis()-innerstart;
}
}
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号