多线程 面试题—线程安全

Posted 华林顺源猎头工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程 面试题—线程安全相关的知识,希望对你有一定的参考价值。


并发编程网   多线程面试题之【线程安全】


线程安全


1、什么叫线程安全?servlet是线程安全吗? 
   

线程安全 就是多线程在运行期间不会产生不符合常规的数据。 

          同样在多线程访问同一代码,不会产生不确定的结果

小编大白话:线程安全首先呢他的是多线程,至少是2个。因为一个线程那肯定是线程安全的。就你自己一个线程执行没有人给你争用资源。你是在串行执行,不会出现不确定结果。
 如果有多个线程 那问题可就多了。比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:
     1. 在 Items[Size] 的位置存放此元素;
     2. 增大 Size 的值。
       线程A完成第一步时,被CPU暂停了。此时Size值还是原来的值线程B并不知情,又跑到线程A刚才放元素的位置又放了一遍,然后Size+1。紧接着A也被唤醒了,也去Size+1 这时候Size = 2了,但是只有一个元素。虽然放了两次放到了同样的位置上覆盖了。
      怎么解决这个问题?可以好好思考一下
1、把操作设置成原子操作,哥执行的时候不被别人打扰。
2、让修改过的值实时告知给其他线程。
3、还有我继续想~


 Servlet是线程不安全的。

小编大白话:这个问题有点大,先记下来。作为后面的单独文章发出来。



2、同步有几种实现方法?


    同步有两种方法
 分别是
synchronized
                  waitnotify

延伸阅读:http://blog.csdn.net/small_lee/article/details/51453019


3、请说明下java的内存模型及其工作流程。


    Java内存模型就是  java内存分为主内存和工作内存。  

     多线程 每一个线程都会有一个自己的工作内存,所使用到的变量都是主内存的一份拷贝。


4、volatile有什么用?能否用一句话说明下volatile的应用场景?


    Volatile 的作用就是多线程使用同一个变量时,每次都去主内存去读。保障了数据的实时性。  
    应用场景就是多线程 操作同一个变量。



5、多线程执行怎么保障变量的可见性?

可见性:就是一个线程修改了变量,其他线程可以立即知道

保证可见性的方法

volatile

synchronized (unlock之前,写变量值回主存)

final(一旦初始化完成,其他线程就可见)


6、为什么代码会重排序?


代码重排序是为了CPU的高效率执行。

JVM指令重排的基本原则

程序顺序原则:一个线程内保证语义的串行性

volatile规则:volatile变量的写,先发生于读

锁规则:解锁(unlock)必然发生在随后的加锁(lock)前

传递性:A先于B,B先于C 那么A必然先于C

线程的start方法先于它的每一个动作

线程的所有操作先于线程的终结(Thread.join())

线程的中断(interrupt())先于被中断线程的代码

对象的构造函数执行结束先于finalize()方法


ps: 今天这篇有点难,我在整理的同时也在回顾,也在查看别人博客的解释、看到以后用自己理解的方式再表达出来,也不是一件容易的事呐~

      其实今天的每一道题都可以单独写一篇文章出来的~ 我先闭关看完那两本并发编程书再回来给你们解答.....

赠人玫瑰,手有余香!

关注、点赞、转发是对顾逸最大的鼓励和支持!


以上是关于多线程 面试题—线程安全的主要内容,如果未能解决你的问题,请参考以下文章

四面美团开发岗,面试题分享

.NET面试题系列数据结构(ArrayListQueueStack)及线程安全问题

Java面试题-多线程

一道非常棘手的 Java 面试题:i++ 是线程安全的吗?

线程池的一些面试题

面试题:写出常见线程安全与线程不安全的类