高并发相信大家都不陌生了,高并发是java核心技术之一,下面我们就来了解一下高并发下如何做到安全的修改同一行数据吧。
乐观锁,采用了相对于“悲观锁”更为宽松的加锁机制,它的实现就是:这个数据所有请求都有资格去修改,但它会取得这个数据的版本号,只有版本号符合的更新才能成功,其余都会失败。这样,我们就不需要考虑队列的问题,但它会增加CPU的计算。
二、悲观锁
悲观锁,它的本质是当前只有一个线程执行操作,并排斥外部请求的修改。当它遇到加锁的状态,就必须等待。结束了之后会唤醒其他线程进行处理。虽然这样解决了数据安全的问题,但我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,一些线程可能永远都没有机会抢到“锁”,这样的请求就会死掉。同时,这种请求会非常多,它会瞬间增大系统的平均响应时间,结果就是可用连接数一下被耗尽,系统陷入异常。
实现:
public class Test
{
//创建锁对象
static synchronizedTest instance = new synchronizedTest();
public void test()
{
//省略其他的耗时操作。。。
//使用同步代码块对方法内的代码进行同步操作,锁对象为instance
synchronized(instance)
{
//需要执行的代码。。。
}
}
}
给生成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锁,成功解决问题