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

TheDisguiser 2020-05-10 20:48:13 java常见问答 10556

高并发相信大家都不陌生了,高并发是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常见问答知识就请多多关注我们吧。

推荐阅读:

高并发是什么?其定义标准是什么?

高并发系统最关键的要注意什么?什么需要注意?

高并发java实现方式有哪些?该怎么实现