chaofx

volatile . synchronized . lock 区别介绍
这些应该都是自己面试过和和网上摘录的问题。 !!!OωO锁方面的知识1 悲观锁和乐观锁的区别乐观锁是比较乐观的, ...
扫描右侧二维码阅读全文
20
2019/04

volatile . synchronized . lock 区别介绍

这些应该都是自己面试过和和网上摘录的问题。 !!!OωO


锁方面的知识

1 悲观锁和乐观锁的区别

  • 乐观锁是比较乐观的, 他认为在读写数据的时候不会发生冲突,不加上锁,在更新数据的时候入如果有冲突就就行一次数据回滚
    常用在读多少写的环境下。(hibernate 就有处理数据就有这样的锁机制)
  • 悲观锁就是在读写数据的时候必然会冲突,在每次请求资源的时候就会加上锁,这样就保护了数据的安全。效率会低下,在写操作频繁的时候使用

2 synchronized、volatile、Lock 详解和区别

可以先首先这么回答 , volcatile是解决多线程访问共享变量之间可见性的问题,Synchronizd 是解决资源同步访问的问题的,lock是一个接口。 

volatile

  • 然后可能会叫你谈谈volatile怎么保持可见性
  • volatile 重要的两个特点是 1:编译不被重新排序 2 保持可见性 这是一个java的关键字
  • volatile 不会造成线程阻塞 可以理解他是一个轻量级的锁,他的功能是确保某个共享变量P在某个线程中数据被改变(比如在缓存A改变) 然后他立刻写入到主内存当中去 并且通知其他还有该值的缓存清除此数据(比如在缓存B中清除P的数据), 当缓存B中用到P变量 从主内存读取P值到缓存B中

synchronized

  • synchronized也是一个java 的一个关键字 jdk1.6之前是重量级锁, 后续被优化过
  • synchroneized 因为是同步线程获取资源 可能会导致线程阻塞
  • 可以保证数据安全,但是效率会偏低
  • 如果想了解其实现底层 可以看位大神写的

Lock

  • lock是jdk 1.5之后增加的一个接口,他下面有三个常用的实现类
    ReentrantLock :这个是常用lock的实现的一个类,同步块需要放在lock和unlock之间(看代码)
final static ReentrantLock lock = new ReentrantLock();
lock.lock()//锁定 /如果拿不到锁就在这里阻塞
//另外一种方式锁定 lock.tryLock() 锁定并返回 是否成功拿到锁,如果不成功就进行其他处理
try{

   .......

}catch(Exception e){

}finally{
  lcok.unlock();//一定要finally这里释放锁,不然会造成死锁
}

ReentrantReadWriteLock :这个重入锁我觉得他就是ReentrantLock 的升级版 就是完全实现了读写分离的操作。他里面分读锁readLock()和 写锁writeLock()
注意点
1 ReetrantReadWriteLock读写锁的效率明显高于synchronized关键字
2 .ReetrantReadWriteLock读写锁的实现中,读锁使用共享模式;写锁使用独占模式,换句话说,读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占
3 ReetrantReadWriteLock读写锁的实现中,需要注意的,当有读锁时,写锁就不能获得;而当有写锁时,除了获得写锁的这个线程可以获得读锁外,其他线程不能获得读锁

stampedLock : 这是jdk8 新加的一个锁机制,应该说读写锁的改进。
1:可以调用一把乐观锁tryOptimisticRead(), 满足多读少写的操作。stamepedLock 加锁之后会返回一个时间戳stamp 用于判断是此时是否被或许锁 去修改数据,如果有就用validate(stamp)去判断 如果有就进行乐观的具体回滚在操作(可以是升级锁 ,或者是放弃执行,或者是其他也无操作)。
2:StampedLock的内部实现是基于CLH锁的,CLH锁是一种自旋锁。

版权属于:本文为原创文章,版权归本博所有,转载请注明出处!。

如果文章 语句 文字 描述等有错误 只能请在座的各位多多包涵 博主说话没有切格瓦拉好听。

感谢您本次的阅读

Last modification:September 6th, 2019 at 12:08 am
If you think my article is useful to you, please feel free to appreciate

One comment

  1. 1721627794

    简单的介绍 很棒

Leave a Comment

隐藏