在平常开发中,我们经常会用到多线程的开发,在使用多线程的时候,我们就需要注意线程安全的问题,特别是重要的操作共享变量时,线程安全的问题又是重中之重。我们今天就来了解一下锁中的乐观锁和悲观锁。
在面试中,如果是Java后天研发的工程师,很有可能会考到这一个知识点。所以今天也就来说下这个。
两者的概念
乐观锁
悲观锁
java中实现该两种机制的锁
在整个操作系统中,Cpu是分片操作的,在程序的执行过程中,会进行线程间的切换,也就是cpu的切换。Cpu的切换是很耗费时间,所以我们如果想减少CPU的切换,可以让某个线程一直持有该CPU,所以可以采用循环的方式来实现。
悲观锁
我们Java中使用的synchronized 就是一种典型的悲观锁的实现,该锁是拥有独占性,和排他性保证了线程 的安全,所以我们说synchronized是悲观锁。
乐观锁
平常使用的CAS的安全操作类就属于乐观锁机制。还有我们经常说的自旋锁,轻量级锁,偏向锁这些也属于乐观锁。乐观锁为什么乐观,是因为减少了对CPU之间的切换,挂起,阻塞 ,唤醒等机制的操作造成的开销。所以在开销上,乐观锁更占一筹,减少了性能的损耗。建议对性能要求高,读请求多的使用该机制。
下面介绍下可以使用这些CAS操作一些类的使用
```
AtomicInteger one = new AtomicInteger();
AtomicLong atomicLong = new AtomicLong();
AtomicReference student = new AtomicReference<>();
one.get() ; //获得值
one.addAndGet(2) ; //增加指定的值
one.incrementAndGet(); //增加1
one.getAndSet(0); //先得到 原先值 然后在置为0
one.longValue(); //转为 long型
```
具体方法可以看如图所示