java 锁 面试题_Java面试题-Java中的锁

本文探讨了Java中的锁机制,包括乐观锁的实现与ABA问题的避免、读写锁的应用场景、可重入锁的使用时机以及volatile关键字与synchronized的对比。通过实例分析了何时使用挥发性变量代替同步,并指出使用volatile需满足的条件。
摘要由CSDN通过智能技术生成

1. 如何实现乐观锁(CAS)?如何避免ABA问题?

答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。

2)带参数版本来避免aba问题,在读取和替换的时候进行判定版本是否一致

1363269437_5451.jpg

2. 读写锁可以用于什么应用场景?

答: 读写锁可以用于 “多读少写” 的场景,读写锁支持多个读操作并发执行,写操作只能由一个线程来操作

ReadWriteLock对向数据结构相对不频繁地写入,但是有多个任务要经常读取这个数据结构的这类情况进行了优化。ReadWriteLock使得你可以同事有多个读取者,只要它们都不试图写入即可。如果写锁已经被其他任务持有,那么任何读取者都不能访问,直至这个写锁被释放为止。

ReadWriteLock 对程序心性能的提高受制于如下几个因素也还有其他等等的因素。

1)数据被读取的频率与被修改的频率相比较的结果。

2)读取和写入的时间

3)有多少线程竞争

4)是否在多处理机器上运行

3. 什么时候应该使用可重入锁?

答:重入锁指的是在某一个线程中可以多次获得同一把锁,在线程中多次操作有锁的方法。

4. 什么场景下可以使用volatile替换synchronized?

答: 只需要保证共享资源的可见性的时候可以使用volatile替代,synchronized保证可操作的原子性一致性和可见性。volatile适用于新值不依赖于就值的情形。

volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线 程的执行有序性。而最彻底的同步要保证有序性和可见性,例如synchronized。任何被volatile修饰的变量,都不拷贝副本到工作内存,任何 修改都及时写在主存。因此对于Valatile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的。volatile存在的意义是,任何线程对某个变量的修改,都会马上被其他线程读取到,因为直接操作主存, 没有线程对工作内存和主存的同步。所以,volatile的使用场景是有限的,在有限的一些情形下可以使用 volatile 变量替代锁(synchronized)。

要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

1)对 变量的写操作不依赖于当前值。

2)该变量没有包含在具有其他变量的不变式中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值