高并发相信大家都不陌生了,高并发是java核心技术之一,下面我们就来了解一下高并发下如何做到安全的修改同一行数据吧。
一、乐观锁
乐观锁,采用了相对于“悲观锁”更为宽松的加锁机制,它的实现就是:这个数据所有请求都有资格去修改,但它会取得这个数据的版本号,只有版本号符合的更新才能成功,其余都会失败。这样,我们就不需要考虑队列的问题,但它会增加CPU的计算。
二、悲观锁
悲观锁,它的本质是当前只有一个线程执行操作,并排斥外部请求的修改。当它遇到加锁的状态,就必须等待。结束了之后会唤醒其他线程进行处理。虽然这样解决了数据安全的问题,但我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,一些线程可能永远都没有机会抢到“锁”,这样的请求就会死掉。同时,这种请求会非常多,它会瞬间增大系统的平均响应时间,结果就是可用连接数一下被耗尽,系统陷入异常。
三、使用Synchronized
实现:
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锁,成功解决问题
以上就是高并发的最新内容了,想知道更多java常见问答知识就请多多关注我们吧。
推荐阅读: