「java锁id」java锁ID
今天给各位分享java锁id的知识,其中也会对java锁ID进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java如何实现对Mysql数据库的行锁
- 2、java线程锁的问题,如何保证web应用中的synchronized用到同一个对象锁?
- 3、java 产生递增id
- 4、Java通过id访问方法,不让id重复访问怎么实现?
- 5、java 登陆界面的id,密码验证怎么做?
- 6、java中悲观锁和乐观锁的区别
Java如何实现对Mysql数据库的行锁
下面通过一个例子来说明
场景如下:
用户账户有余额,当发生交易时,需要实时更新余额。这里如果发生并发问题,那么会造成用户余额和实际交易的不一致,这对公司和客户来说都是很危险的。
那么如何避免:
网上查了下,有以下两种方法:
1、使用悲观锁
当需要变更余额时,通过代码在事务中对当前需要更新的记录设置for update行锁,然后开始正常的查询和更新操作
这样,其他的事务只能等待该事务完成后方可操作
当然要特别注意,如果使用了Spring的事务注解,需要配置一下:
!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --
bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
property name="dataSource" ref="dataSource" /
/bean
!-- 使用annotation定义事务 --
tx:annotation-driven transaction-manager="transactionManager" /
在指定代码处添加事务注解
@Transactional
@Override
public boolean increaseBalanceByLock(Long userId, BigDecimal amount)
throws ValidateException {
long time = System.currentTimeMillis();
//获取对记录的锁定
UserBalance balance = userBalanceDao.getLock(userId);
LOGGER.info("[lock] start. time: {}", time);
if (null == balance) {
throw new ValidateException(
ValidateErrorCode.ERRORCODE_BALANCE_NOTEXIST,
"user balance is not exist");
}
boolean result = userBalanceDao.increaseBalanceByLock(balance, amount);
long timeEnd = System.currentTimeMillis();
LOGGER.info("[lock] end. time: {}", timeEnd);
return result;
}
MyBatis中的锁定方式,实际测试该方法确实可以有效控制,不过在大并发量的情况下,可能会有性能问题吧
select id="getLock" resultMap="BaseResultMap" parameterType="java.lang.Long"
![CDATA[
select * from user_balance where id=#{id,jdbcType=BIGINT} for update;
]]
/select
2、使用乐观锁
这个方法也同样可以解决场景中描述的问题(我认为比较适合并不频繁的操作):
设计表的时候增加一个version(版本控制字段),每次需要更新余额的时候,先获取对象,update的时候根据version和id为条件去更新,如果更新回来的数量为0,说明version已经变更
需要重复一次更新操作,如下:sql脚本
update user_balance set Balance = #{balance,jdbcType=DECIMAL},Version = Version+1 where Id = #{id,jdbcType=BIGINT} and Version = #{version,jdbcType=BIGINT}
这是一种不使用数据库锁的方法,解决方式也很巧妙。当然,在大量并发的情况下,一次扣款需要重复多次的操作才能成功,还是有不足之处的。不知道还有没有更好的方法。
java线程锁的问题,如何保证web应用中的synchronized用到同一个对象锁?
把这个类配置成单例模式,用代码来完善一下。设计模式里面有。只有一个私有构造方法。自己去找,网上很多
java 产生递增id
id作为一个static成员并初始化一个值,在构造方法里面对id做自增运算,应该可以实现,但这样做的话,多线程是不安全的,用多线程就要加锁。
public class QQ{
static long id = 10000;
public QQ(){
id++;
}
}
不知道是不是你问的这个意思,是的话,求采纳哦,5044群5871
Java通过id访问方法,不让id重复访问怎么实现?
就是一个id只能访问一次吗?
1,在调用方法前要有控制
2,判定id是否访问过
比较简单的,比如访问过的id存起来,调用前查一下看看是不是已经有了,有了不允许访问
然后说点逼格高的,
1,用数据库保存已经访问的id,但是数据库会慢一点
2,用缓存保存先过滤一下,不过会越来越大。id不长还是能存很多很多很多的,如果缓存失效再向库里查,万无一失
3,布隆过滤器特别适合你这个,每次id访问过来就加到过滤器里面,后面直接先用布隆过滤器过滤下,性能特别高,误判再往后面缓存数据库走就行
java 登陆界面的id,密码验证怎么做?
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
title快捷键管理/title
script language="javascript"
function check(){
var userName=document.form1.urser.value;
var passWord=document.form1.password.value;
if(passWord=="123")
alert("成功登入")
else
alert("密码错误")
}
/script
/head
body
form name="form1" action=""
strong用户:/stronginput type="text" name="urser" size="58"
strong密码:/stronginput type="text" name="password" size="58"
br
input type="button" value="登入" onclick="check() "
input type="button" value="取消" onclick="window.close() "
/body
/html
这是页面,action后面跟的就是JSP页面或JVAE的处理业务的代码,这里密码就是123,实际的情况是页面中输入数据传入后台,取出数据库中的数据作比较,正确后通过,错误就提示密码错误。
java中悲观锁和乐观锁的区别
乐观锁和悲观锁的区别如下:
1、悲观锁是当线程拿到资源时,就对资源上锁,并在提交后,才释放锁资源,其他线程才能使用资源。
2、乐观锁是当线程拿到资源时,上乐观锁,在提交之前,其他的锁也可以操作这个资源,当有冲突的时候,并发机制会保留前一个提交,打回后一个提交,让后一个线程重新获取资源后,再操作,然后提交。和git上传代码一样,两个线程都不是直接获取资源本身,而是先获取资源的两个copy版本,然后在这两个copy版本上修改。
3、悲观锁和乐观锁在并发量低的时候,性能差不多,但是在并发量高的时候,乐观锁的性能远远优于悲观锁。
4、常用的synchronized是悲观锁,lock是乐观锁。
java锁id的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java锁ID、java锁id的信息别忘了在本站进行查找喔。
发布于:2022-11-28,除非注明,否则均为
原创文章,转载请注明出处。