欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

环球ug代理:看到大厂的面试题,你慌了吗?,【朝花夕拾】Android多线程之(二)ThreadLocal篇,android中getWidth()和getMeasuredWidth()之间的区别

admin2020-06-173

       最近参加了TX音乐Android工程师岗位的面试,这里凭影象记录了面试中的一些考点,希望能帮到正在面试的你(谜底还在整理中)!

1、Java挪用函数传入现实参数时,是值通报照样引用通报?

2、单例模式的DCL方式,为什么需要第二次判空?

    单例模式的DCL是一种比较好的单例实现方式,面试中被问及的频率异常高,考察的方式也多种多样。凭据本题的提问,这里简朴整理了一下,这里面的每一个点最好都能够做到烂熟于心:

 1 public class Test {
 2     private volatile static Test instance;
 3 
 4     private Test() {
 5 
 6     }
 7 
 8     public static Test getInstance() {
 9         if (instance == null) {
10             synchronized (Test.class) {
11                 if (instance == null) {
12                     instance = new Test();
13                 }
14             }
15         }
16         return instance;
17     }
18 }

 这里有5个要点需要注重:

    (1)第一个注重点:使用私有的组织函数,确保正常情形下该类不能被外部初始化(非正常情形好比通过反射初始化,一样平常使用反射之后单例模式也就失去效果了)。

    (2)第二个注重点:getInstance方式中第一个判空条件,逻辑上是可以去除的,去除之后并不影响单例的正确性,然则去除之后效率低。由于去掉之后,不管instance是否已经初始化,都市举行synchronized操作,而synchronized是一个重操作消耗性能。加上之后,若是已经初始化直接返回效果,不会举行synchronized操作。

    (3)第三个注重点:加上synchronized是为了防止多个线程同时挪用getInstance方式时,各初始化instance一遍的并发问题

    (4)第四个注重点:getInstance方式中的第二个判空条件是不可以去除,若是去除了,而且恰好有两个线程a和b都通过了第一个判空条件。此时假设a先获得锁,进入synchronized的代码块,初始化instance,a释放锁。接着b获得锁,进入synchronized的代码块,也直接初始化instance,instance被初始化多遍不符合单例模式的要求~。加上第二个判空条件之后,b获得锁进入synchronized的代码块,此时instance不为空,不执行初始化操作。

    (5)第五个注重点:instance的声明有一个voliate关键字,若是不用该关键字,有可能会出现异常。由于instance = new Test();并不是一个原子操作,会被编译成三条指令,如下所示。
          1)给Test的实例分配内存

          2)初始化Test的组织器

          3)将instance工具指向分配的内存空间(注重,此时instance就不为空)

        然后咧,java会指令重排序,JVM凭据处理器的特征,充分利用多级缓存,多核等举行适当的指令重排序,使程序在保证营业运行的同时,充分利用CPU的执行特点,最大的施展机械的性能!简朴来说就是jvm执行上面三条指令的时刻,纷歧定是1-2-3这样执行,有可能是1-3-2这样执行。若是jvm是根据1-3-2来执行的话,当1-3执行完2还没执行的时刻,若是另外一个线程挪用getInstance(),由于3执行了此时instance不为空,直接返回instance。问题是2还没执行,此时instance相当于什么都没有,肯定是有问题的。然后咧,voliate有一个特征就是克制指令重排序,上面的三条指令是根据1-2-3执行的,这样就没有问题了。

       参考:https://blog.csdn.net/hnd978142833/article/details/81633730

3、volatile有什么作用?AtomiticInteger有什么作用,底层实现原理是什么?与synchronized关键字有什么区别?cas有什么坏处?

       关于多线程相关的知识点,volatile、AtomiticInteger、synchronized、cas问题都是高频考点,与之相关的知识点如:重量级锁/轻量级锁、乐观锁/消极锁、JMM(Java Memmory Mode Java内存模子)、用户空间/内核空间、多线程三要素(原子性、可见性、顺序性)、自旋、ABA问题等,都是需要掌握的要点。

       推荐阅读:【死磕Synchronized底层实现】

                         【面试官没想到,volatile能吹上半个小时】

                         【《吊打面试官》系列-乐观锁、消极锁】

                         【「逐日知识点」什么是 CAS 机制】

4、Android Log中的tag,用类名.class.getSimpleName()来获取,会有什么坏处?

5、反射有什么作用?有什么坏处?

6、广播底层实现机制?为什么会比AIDL方式慢?与EventBus相比有什么区别?

7、Handler若何保证每个线程只有一个looper?ThreadLocal有什么作用?

       这道题实在主要考察ThreadLocal,不领会ThreadLocal的可以阅读博文:【朝花夕拾】Android多线程之(二)ThreadLocal篇,以及【再有人问你什么是ThreadLocal,就把这篇文章甩给他!】

8、100个0~100之间的整数,实现排序

9、RxJava先容

10、Glide先容

11、measuredWidth和width的区别

      结论:getMeasuredWidth()获取的是view原始的巨细,也就是这个view在XML文件中设置或者是代码中设置的巨细。getWidth()获取的是这个view最终显示的巨细,这个巨细有可能即是原始的巨细也有可能不即是原始巨细。

      推荐阅读:【android中getWidth()和getMeasuredWidth()之间的区别】

12、SparseArray先容,为什么能提高性能

13、MVP与MVVM的区别,MVVM的实现方式

14、分享时,Android N最先对url做了什么限制?

15、HashSet先容

16、软引用和弱引用的区别,什么时刻会GC?System.gc()的时刻系统会立刻接纳系统垃圾吗?

17、Exception和Error有什么区别?Error能被捕捉吗?OOM Error能被捕捉吗?

18、Sharepreference commit()和apply()的区别。Sharepreference历程平安吗?线程平安吗?

19、500x500的png图片所占的内存巨细。统一张图片在xxdpi-drawable和drawable中谁占用的内存更大,大若干?

20、RecyclerView与ListView的区别。

大体上这记得么多,面试官会凭据回覆的内容进一步深入提问,读者可以在该知识点上进一步拓展。

,

欧博亚洲网址

欢迎进入欧博亚洲网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:http://www.czshenhaifb.com/post/1234.html

网友评论