zoukankan      html  css  js  c++  java
  • Java面试题-Java中的锁

    1. 如何实现乐观锁(CAS)?如何避免ABA问题?
     答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。
            2)带参数版本来避免aba问题,在读取和替换的时候进行判定版本是否一致

    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)该变量没有包含在具有其他变量的不变式中

  • 相关阅读:
    C# 实现 Snowflake算法生成唯一性Id
    kafka可视化客户端工具(Kafka Tool)的基本使用(转)
    docker 安装kafka
    Model类代码生成器
    使用docker 部署rabbitmq 镜像
    Vue 增删改查 demo
    git 提交代码到库
    Android ble蓝牙问题
    mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
    okhttp
  • 原文地址:https://www.cnblogs.com/yeahwell/p/4544559.html
Copyright © 2011-2022 走看看