1.java关键字synchronized实现线程同步
@RequestMapping(value="xctb.htm", method={RequestMethod.GET, RequestMethod.POST})
public void xctb(HttpServletRequest request) throws Exception{
synchronized (this) {
String sql = "select number from tablename where id=1";
List<Map> list = baseDao.getResultMap(sql);
if(list != null && list.size() > 0){
System.out.println("总数:"+list.get(0).get("number"));
Thread.sleep(1000);
String s = "update tablename set number=number-1 where id=1";
baseDao.executeSQL(s);
}
}
}
2.Lock接口实现线程同步
private ReentrantLock lock = new ReentrantLock();
@RequestMapping(value="xctb.htm", method={RequestMethod.GET, RequestMethod.POST})
public void xctb(HttpServletRequest request) throws Exception{
if (lock.tryLock(3, TimeUnit.SECONDS)) {
try {
String sql = "select number from tablename where id=1";
List<Map> list = baseDao.getResultMap(sql);
if(list != null && list.size() > 0){
System.out.println("总数:"+list.get(0).get("number"));
Thread.sleep(1000);
String s = "update tablename set number=number-1 where id=1";
baseDao.executeSQL(s);
}
}catch(Exception e){
e.printStackTrace();
} finally {
lock.unlock();
}else{
System.out.println("3秒内没有获得锁");
}
}
总结:synchronized适合少量线程并发,Lock适合大量线程并发,另ReentrantLock可设置锁的获取时间,使用起来相对灵活。