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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cocos2dx-2.x CCFileUtils文件管理分析(2)

    cocos2dx-2.x CCFileUtils文件管理分析(2)

    2022年1月13日
    51
  • TTL转RS232电路–分享原理图和参考资料

    RS232串口经常用到,本文分享下RS232协议方面基本点,并介绍一种简单的串口TTL(3.3V)电平转换为RS232电平的电路,这个电路是经过制板验证过的。使用芯片MAX3232E(tssop16封装),电源用3.3V,电路如下图MAX3232是支持两路uart转成RS232,分享的电路只接了一路,如有需要可以接两路另外上面电路是没有做隔离的,如果要做成隔离式的,可以加上光电开关。…

    2022年4月6日
    74
  • Redis入门指南(第2版) – 电子书下载 -(百度网盘 高清版PDF格式)

    Redis入门指南(第2版) – 电子书下载 -(百度网盘 高清版PDF格式)Redis入门指南(第2版)-李子骅在线阅读百度网盘下载(z793)书名:Redis入门指南(第2版)作者:李子骅格式:EPUB,HTMLZ,PDF路径:点击打开排序作者:李子骅排序书名:Redis入门指南(第2版)日期:0812月2018uuid:ed21285a-4c67-40ce-b811-4d407b40b4a9id…

    2022年4月20日
    72
  • logback日志文件路径_mysql的日志文件在哪里

    logback日志文件路径_mysql的日志文件在哪里mysql日志文件在哪如何修改MySQL日志文件位置(2013-01-2415:57:13)标签:itMySQL日志文件相信大家都有很多的了解,MySQL日志文件一般在:/var/log/mysqld.log,下面就教您修改MySQL日志文件位置的方法,供您参考。今天需要改MySQL日志文件的位置,发现在/etc/my.cnf中怎么也改不了。后来发现MySQL日志位是指定的:[root@loc…

    2022年10月14日
    4
  • 华为笔记本键盘锁住了(笔记本电脑键盘怎么亮起来)

    展开全部1、取消键:(退出e69da5e887aa62616964757a686964616f31333366306434键Esc)意思是逃脱、出口。主要作用是退出某个程序。如:在玩游戏时想退出来,按一下这个键即可。2、功能键:(F1——F12)在不同软件中,可起到不同的相应功用,也可以配合其它的键共同起作用。如:F1是帮助功能。3、切换键:(表格键Tab)意思是表格。主要是在文字处理软件里(如W…

    2022年4月14日
    300
  • resnet源码pytorch_pytorch conv1d

    resnet源码pytorch_pytorch conv1d#Pytorch 0.4.0 ResNet34实现cifar10分类.#@Time:2018/6/17#@Author:xfLiimporttorchvisionastvimporttorchastimporttorchvision.transformsastransformsfromtorchimportnnfromtorch.utils.da…

    2022年10月6日
    4

发表回复

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

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