zoukankan      html  css  js  c++  java
  • 多线程

    多线程

    1.synchronized和ReentrantLock的区别

    synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

    (1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
    (2)ReentrantLock可以获取各种锁的信息
    (3)ReentrantLock可以灵活地实现多路通知

    另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word,这点我不能确定。

    2. 线程池中 submit() 和 execute() 方法有什么区别?

    execute():只能执行 Runnable 类型的任务。

    submit():可以执行 Runnable 和 Callable 类型的任务。

    Callable 类型的任务可以获取执行的返回值,而 Runnable 执行无返回值。

    3. 在 Java 程序中怎么保证多线程的运行安全?

    方法一:使用安全类,比如 Java. util. concurrent 下的类。

    方法二:使用自动锁 synchronized。

    方法三:使用手动锁 Lock。

    手动锁 Java 示例代码如下:

    Lock lock = new ReentrantLock();
    
    lock. lock();
    
    try {
    
    System. out. println("获得锁");
    
    } catch (Exception e) {
    
    // TODO: handle exception
    
    } finally {
    
    System. out. println("释放锁");
    
    lock. unlock();
    
    }
    

    4. 多线程中 synchronized 锁升级的原理是什么?

    synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致。

    如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。

    锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

    5. 怎么防止死锁?

    尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

    尽量使用 Java. util. concurrent 并发类代替自己手写锁。

    尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

    尽量减少同步的代码块

    6. 说一下 synchronized 底层实现原理?

    synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。

    在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。

    但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。

    7. synchronized 和 volatile 的区别是什么?

    volatile 是变量修饰符;synchronized 是修饰类、方法、代码段。

    volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。

    volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

    8. synchronized 和 Lock 有什么区别?

    synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

    synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

    通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

    9. synchronized 和 ReentrantLock 区别是什么?

    synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。

    主要区别如下:

    ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;

    ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;

    ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。

    volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。

    10. 说一下 atomic 的原理?

    atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

  • 相关阅读:
    EasyNVR流媒体服务器网页兼容调试:ie浏览器下的接口调用成功但页面无法显示实时的数据
    EasyNVR流媒体服务器网页兼容调试:ie浏览器下的接口调用成功但页面无法显示实时的数据
    实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
    实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
    RTSP转RTMP-HLS网页无插件视频直播-EasyNVR功能介绍-音频开启
    rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events- none
    RTSP转RTMP-HLS网页无插件视频直播-EasyNVR功能介绍-音频开启
    rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events- none
    EasyNVR无插件流媒体服务器前端技术防止重复提交的方法
    EasyNVR无插件流媒体服务器前端技术防止重复提交的方法
  • 原文地址:https://www.cnblogs.com/yiyangyu/p/javaexam002.html
Copyright © 2011-2022 走看看