zoukankan      html  css  js  c++  java
  • 乐观锁与悲观锁

    先看名字,乐观锁和悲观锁,乐观的人会假设每一次的操作都是线程安全的,只有最后返回数据的时候才校验一下。悲观的人觉得每一次的操作都是不安全的,一次只能一个人进行操作。

    有这样一个方法

    public class Sequence(){

    private int value;

    public synchronized int next(){

    return value++;

    }

    }

    如果现在有100个线程要执行这个方法,但是由于关键字sunchronized的存在,大家必须获得那把唯一的锁才能进入方法,当某个线程获得了锁之后,其他的99个线程只能进入锁池等待线程执行完释放锁之后继续争抢。

    这就是悲观锁,也叫互斥锁,就是同一时刻只有获得锁的线程才有资格去操作共享资源,其他线程都被阻塞了,被放到一个锁池的地方等待。

    乐观锁的意思就是不管几个线程要执行这个方法,大家都可以执行,但是返回的时候需要比较一下自己拿到的数据和一开始是否一致,如果一致说明没有人动过数据,那可以放心的返回。如果数据发生变化,说明自己在执行这个方法的时候时间片到了,但其他线程这时候已经进来执行完了,此时只能返回一开始重新执行,下面看一个方法

    public int next(){

    while(true){

    int A=读取的值,也就是公用资源;

    int B=A+1;

    if(A==公用资源的值){

    return B;

    }

    }

    }

    在这里是一个死循环,只有真正做到线程安全的时候才会停止。

    总结:乐观锁根本不会加锁,每个线程都可以进入这个方法,读取数据来操作,最后使用CAS来判读本次操作是否有效,如果存在CAS里的值被修改过,那就再次循环尝试。

    不和别人一样,不复制只真正理解
  • 相关阅读:
    php--点赞功能的实现
    php --图片加图片水印
    php--获取用户ip
    json
    js中eval()和$.parseJSON()的区别
    Js操作Select大全(取值、设置选中等等)
    phpexcel--导入excel表格
    远程服务器连接
    iis 重新安装后 重新注册asp.net
    筛选两个数组中不同的元素
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12759256.html
Copyright © 2011-2022 走看看