加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

分析 Java 并发下的乐 观锁

发布时间:2022-12-06 12:39:40 所属栏目:语言 来源:
导读:  聊完原子操作了,我们进入正题。

  大家都知道,一般而言,由于多线程并发会导致安全问题,针对变量的读和写操作,都会采用锁的机制。锁一般会分为乐观锁和悲观锁两种。

  悲观锁

  对于悲观

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

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!