MySQL安全的修改同一行数据_高并发下如何做到安全的修改同一行数据?有几种方式?...

高并发相信大家都不陌生了,高并发是java核心技术之一,下面我们就来了解一下高并发下如何做到安全的修改同一行数据吧。

乐观锁,采用了相对于“悲观锁”更为宽松的加锁机制,它的实现就是:这个数据所有请求都有资格去修改,但它会取得这个数据的版本号,只有版本号符合的更新才能成功,其余都会失败。这样,我们就不需要考虑队列的问题,但它会增加CPU的计算。

二、悲观锁

悲观锁,它的本质是当前只有一个线程执行操作,并排斥外部请求的修改。当它遇到加锁的状态,就必须等待。结束了之后会唤醒其他线程进行处理。虽然这样解决了数据安全的问题,但我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,一些线程可能永远都没有机会抢到“锁”,这样的请求就会死掉。同时,这种请求会非常多,它会瞬间增大系统的平均响应时间,结果就是可用连接数一下被耗尽,系统陷入异常。

实现:public class Test

{

//创建锁对象

static synchronizedTest instance = new synchronizedTest();

public void test()

{

//省略其他的耗时操作。。。

//使用同步代码块对方法内的代码进行同步操作,锁对象为instance

synchronized(instance)

{

//需要执行的代码。。。

}

}

}

20a377177bdc3d3ea4ba345809126213.png

给生成ID的代码加上同步代码块,成功解决问题,

使用同步代码块的作用是:同一时刻,只有一个线程可以执行该代码块.

四、Lock的使用

实现:public class LockTest

{

private Lock lock = new ReentrantLock();

//需要参与同步的方法

private void test(Thread thread)

{

//获取锁,如果锁被暂用则一直等待

lock.lock();

try

{

System.out.println("获得了锁");

}

catch (Exception e)

{

//打印异常

e.printStackTrace();

}

finally

{

System.out.println("释放了锁");

//释放锁

lock.unlock();

}

}

给生成ID的代码加上Lock锁,成功解决问题

d4788c57635acbe01ec08c6d82806900.png

以上就是高并发的最新内容了,想知道更多java常见问答知识就请多多关注我们吧。

推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值