大家好,又见面了,我是你们的朋友全栈君。
一、 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,虽然相等,但事情的本质已经发生了改变。
②如何解决
加标志:在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128456.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...