线程同步synchronized与Lock对比

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可设置锁的获取时间,使用起来相对灵活。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值