java并发面试题(十)

  1. 什么是线程局部变量?
    答:线程局部变量就是局限于线程内部的变量,它是线程自身私有的,不会在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,这也是一种实现线程安全的方式。

  2. Java中用到的线程调度算法是什么?
    答:抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。

  3. 使用synchronized修饰静态方法和非静态方法有什么区别?
    答:静态方法属于类,所以synchronized修饰静态方法加的锁是类锁,而synchronized修饰非静态方法加的锁则是对象锁。

  4. Java中活锁和死锁有什么区别?
    答:活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直循环尝试,然后失败再尝试的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开,同时活锁的时候,进程是不会阻塞的,这会导致CPU资源耗尽。死锁则是指两个或两个以上的进程(或线程)在执行过程中,因为争夺资源而造成的一种相互等待的现象,如果没有外力干扰,这些线程都将无法继续运行。

  5. Java中的线程饥饿说的是什么?
    答:线程的优先级高低之分,如果线程优先级低,完全有可能就一直得不到资源分配,而优先级低的线程一旦等待资源的时间过长,之后就算能够继续运行,该线程所做的事情可能也没意义了,这就是发生了饥饿,线程被"饿死"了。

  6. 读写锁可以用于什么应用场景?
    答:适用于读取数据的频率远远大于写数据的频率的场合。

  7. 什么是乐观锁?
    答:乐观锁总是怀着乐观的态度,它认为竞争不是总会发生的,所以它觉得自己不需要锁,而是采用比较-替换作为一个原子操作的思想去修改变量,CAS就是乐观锁的一个实现,如果修改失败,再安排相应的重试逻辑。

  8. 什么是悲观锁?
    答:悲观锁的思想就比较悲观了,它总觉得别人会和自己竞争资源,所以每次自己操作资源的时候,都会加上一把锁,在自己操作结束前,不允许别人动这个资源,类似synchronized,直接上锁操作资源。

  9. 说说什么叫无锁?
    答:没有对资源进行锁定就叫做无锁,这样的话所有的线程都可以对同一个资源进行访问,不过只有一个线程能够成功修改资源,CAS就是无锁的体现之一,无锁没法完全替代有锁,但无锁在某些场合下的性能是非常高的,一切都是为了优化性能。

  10. 说说什么叫偏向锁?
    答:HotSpot 的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,还存在锁由同一线程多次获得的情况,偏向锁就是在这种情况下出现的,它的出现是为了解决只有在一个线程执行同步时提高性能。

发布了222 篇原创文章 · 获赞 224 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104570223