java锁cas(java锁的实现原理)

一、Java锁1.常见的锁有synchronized和Lock()①synchronized是jvm层面实现的,可以直接用,不过要锁住某个对象;lock是属于j.u.c包下的接口,用的时候要实现lock接口。②synchronized一般和wait()、notify()、notifyAll()一起使用,使用完不用释放锁;lock必须在finally里面手动释放。@lock锁与s…

大家好,又见面了,我是你们的朋友全栈君。

一、 Java锁

1.常见的锁有synchronized和Lock()
①synchronized 是jvm层面实现的,可以直接用,不过要锁住某个对象;lock是属于j.u.c包下的接口,用的时候要实现lock接口。
②synchronized一般和wait()、notify()、notifyAll()一起使用,使用完不用释放锁;lock必须在finally里面手动释放。
@lock锁与synchronized相比,lock锁添加一些其他特性,如中断锁等候和定时锁等候。
④资源竞争激励的情况下,lock性能会比synchronize好,竞争不激励的情况下,synchronize比lock性能好。

2.悲观锁与乐观锁
①悲观锁认为世界是悲观的,当去拿数据的时候就上锁,这样别人想拿这个锁就会阻塞直到拿到锁,传统的数据库用到了这种锁,像行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。
②乐观锁,认为一般并发是不会发生的,所以不会上锁。基于CAS(无锁编程)实现,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制(解决ABA问题)。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

3.CAS是什么?
答:CAS是一种无锁思想
当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

CAS里有三个操作数,原值V、预期原只A、修改数B,当V==A时才进行修改,否者竞争失败。

4.ABA问题
①如何产生的?
Thread1开始cas(1,1,2)操作,读到了val=1;的值,线程挂起
Thread2将A的值改为2又改回来,相当于值没变,但是却被修改过。
这是Thread1得到cpu,继续执行,这时判断V是否等于A,虽然相等,但事情的本质已经发生了改变。
②如何解决
加标志:在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128456.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一文弄懂罗斯蒙特644温度变送器接线

    一文弄懂罗斯蒙特644温度变送器接线罗斯蒙特644温度变送器分为单输入644H和双输入644S两种,昌晖仪表在本文介绍温度变送器644接线,大家学习一起罗斯蒙特644温度变送器接线的注意事项。问题1:下图①位置这四个端子是干什么的?问题2:下图②位置这三个端子是干什么的?问题3:下图③位置这三个端子是干什么的?问题4:下图④位置这个插针是干什么的?问题5:下图⑤位置拨盘L和H位置代表什么?问题6:上图⑥位置这两个端子是干什么的?结…

    2022年6月21日
    74
  • malloc函数实现原理!

    malloc函数实现原理!任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很

    2022年5月31日
    40
  • ssdp协议 upnp_SSDP协议编程 upnp设备查找方法[通俗易懂]

    ssdp协议 upnp_SSDP协议编程 upnp设备查找方法[通俗易懂]SSDP协议编程upnp设备查找方法SSDP协议编程upnp设备查找方法[cpp]viewplaincopyintssdp_discovery(){structsockaddr_inaddrin;structtimevalrtime;intnewsock;intret;charbuf[1024];inti=0;intyes=1;rtime.tv_sec=2;rtime.tv_usec…

    2022年10月11日
    0
  • StringBuilder和StringBuffer的区别

    StringBuilder和StringBuffer的区别StringBuilder和StringBuffer的区别在哪里?当接触这个问题的时候,我们可能第一反应就是,StringBuilder是线程不安全的,StringBuffer是线程安全的为什么StringBuilder是线程不安全,StringBuffer是线程安全?针对这个问题,大部分的人可能就无言以对了,我们只知道StringBuilder是线程不安全的,StringBuffer…

    2022年6月28日
    22
  • 怎么新建pytest的ini文件_pytest.ini配置

    怎么新建pytest的ini文件_pytest.ini配置前言pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行查看pytest.ini的配置选项pytest-h找到以下

    2022年7月31日
    5
  • mybatis的rowbounds是物理分页吗_rowbounds分页

    mybatis的rowbounds是物理分页吗_rowbounds分页mybatis中,使用RowBounds分页,非常方便不需要在sql语句中写limit,mybatis会自动拼接sql,添加limit最核心的是在mapper接口层,传参时传入RowBounds(intoffset,intlimit)对象,即可完成分页注意:由于java允许的最大整数为2147483647,所以limit能使用的最大整数也是…

    2022年9月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号