分析 Java 并发下的乐观锁
聊完原子操作了,我们进入正题。 大家都知道,一般而言,由于多线程并发会导致安全问题,针对变量的读和写操作,都会采用锁的机制。锁一般会分为乐观锁和悲观锁两种。 悲观锁 对于悲观锁,开发者认为数据发送时发生并发冲突的概率很大,所以每次进行读操作前都会上锁。 乐观锁 对于乐观锁,开发者认为数据发送时发生并发冲突的概率不大,所以读操作前不上锁。 到了写操作时才会进行判断,数据在此期间是否被其他线程修改。如果发生修改,那就返回写入失败;如果没有被修改,那就执行修改操作,返回修改成功。 乐观锁一般都采用 Compare And Swap(CAS)算法进行实现。顾名思义,该算法涉及到了两个操作,比较(Compare)和交换(Swap)。 CAS 算法的思路如下: 该算法认为不同线程对变量的操作时产生竞争的情况比较少。 该算法的核心是对当前读取变量值 E 和内存中的变量旧值 V 进行比较。 如果相等,就代表其他线程没有对该变量进行修改,就将变量值更新为新值 N。 如果不等,就认为在读取值 E 到比较阶段,有其他线程对变量进行过修改,不进行任何操作。 当线程运行 CAS 算法时,该运行过程是原子操作,也就是说,Compare And Swap 这个过程虽然涉及逻辑比较繁冗,但具体操作一气呵成。 Java中 CAS 的底层 实现Java 中的 Unsafe 类我先问大家一个问题: 什么是指针? 针对学过 C、C++ 语言的同学想必都不陌生。说白了,指针就是内存地址,指针变量也就是用来存放内存地址的变量。 但对于指针这个东西的使用,有利有弊。有利的地方在于如果我们有了内存的偏移量,换句话说有了数据在内存中的存储位置坐标,就可以直接针对内存的变量操作; 弊端就在于指针是语言中功能强大的组件,如果一个新手在编程时,没有考虑指针的安全性,错误的操作指针把某块不该修改的内存值修改,容易导致整个程序崩溃。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |