2017Android面试题解析 --(一)
来源:互联网 发布:plsql查看存储过程源码 编辑:程序博客网 时间:2024/06/07 12:57
每篇章10道题解析
1. 简述synchronized?Object;
synchronized确保每次只有一个线程能持有对象锁并对同步代码块进行访问,并在访问结束之前,不会被其它线程访问。也就说,即使同步代码块在执行过程中遭遇线程调度,其它线程也无法访问该同步代码块,直到该线程被重新调度并完成同步代码块的访问并释放对象锁。这样就保证了线程对同步代码块访问的连续性不受线程调度而中断。
1、直接在方法前面进行声明,这种方式的声明,整个方法都是同步代码块,至于其对象锁则是访问该方法时所使用的对象也就是this,示例:
class C{
public synchronized void syncMethod(...){
...
}
}
注:在这种方式的声明中,如果方法前面有static关键字,那么该方法是一个类方法,由于类在Java中其实也是一个class对象,所以类方法的对象锁不是该类的实例化对象,而是该类的class对象。
public void syncMethod(...){
...
synchronized(object){
....
}
...
}
}
public class Dog extends Object{
}
与
public class Dog{
}
重点掌握equals()和==的区别,重写equals(),同时要注意对hashcode()的重写
1.equals()和==的区别
==:对于基本类型(int,short,byte,long,float……),比较的是他们的值。对于复合类型(比如string,比如新建一个类
Employee e1,e2;
e1=new Employee("王劲",26,6300);
e2=new Employee("张山",30,3800);
这里 e1 e2 都是复合数据了)比较的是它们在内存中的地址。(JVM的栈、堆、方法区),理解下JVM内存地址分配
equals():Object类中equals的默认实现是return(this=obj),即默认是比较对象的内存地址,一般会重写equals()。
2.Monitor机制;
Monitor其实是一种同步工具,也可以说是一种同步机制,它通常被描述为一个对象,主要特点是:
- 对象的所有方法都被“互斥”的执行。好比一个Monitor只有一个运行“许可”,任一个线程进入任何一个方法都需要获得这个“许可”,离开时把许可归还。(用synchronized上锁)
- 通常提供singal机制:允许正持有“许可”的线程暂时放弃“许可”,等待某个谓词成真(条件变量),而条件成立后,当前进程可以“通知”正在等待这个条件变量的线程,让他可以重新去获得运行许可。
3.简述happen-before规则;
我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens-before规则,不能说你想怎么排就怎么排,如果那样岂不是乱了套。
happen-before原则是什么?
常见的happens-before规则:
1.程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。(注解:如果只有一个线程的操作,那么前一个操作的结果肯定会对后续的操作可见。)
(注解:这个最常见的就是syncronized 方法 和 syncronized块)
4.JUC(Lock)和Object,Monitor机制(synchronized)区别是什么;
了解Lock和synchronized的区别
5.简述AQS原理;简述DCL失效原因,解决方法;
(一)AQS原理:AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里volatile是核心关键词,
——————————————————————————————————
DCL失效
DCL单例模式(1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。)
针对延迟加载法的同步实现所产生的性能低的问题,我们可以采用DCL,即双重检查加锁(Double Check Lock)的方法来避免每次调用getInstance()方法时都同步。实现方式如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
优点:资源利用率高,不执行getInstance就不会被实例,多线程下效率高。
缺点:第一次加载时反应不快,由于Java 内存模型一些原因偶尔会失败,在高并发环境下也有一定的缺陷,虽然发生概率很小。
DCL对instance进行了两次null判断,第一层判断主要是为了避免不必要的同步,第二层的判断则是为了在null的情况下创建实例。
- 2017Android面试题解析 --(一)
- Android面试题(一)
- android面试题(一)
- android面试题(一)
- android面试题(一)
- Android面试题(一)
- android面试题(一)
- Android面试题(一)
- Android 面试题(一)
- 软件测试面试题解析(一)
- 尝试解析js面试题(一)
- android 面试题一
- android面试题一
- Android面试题一
- Android面试题一
- android 面试题一
- Android 面试题一
- android 面试题一
- 网易云课堂-数据结构-第二讲-线性结构
- 第三周项目四(2)—顺序表的应用
- ClassLoader原理与实践(分享讲稿整理,不放图)
- 欢迎使用CSDN-markdown编辑器
- 图像增强之03锐化
- 2017Android面试题解析 --(一)
- VS2010——动态库的错误号反馈
- HDU3493 The Little Architect 【BM算法推公式+矩阵快速幂】
- POJ
- 洛谷 P1463 [SDOI2005]反素数ant && P1820 寻找AP数
- 单例设计模式之破坏
- 《Java从小白到大牛精简版》之第1章 开篇综述
- 学习笔记之面向对象编程18(流之 InputStream,OutputStream)
- PAT A1088. Rational Arithmetic (20)