java基础题目总结
有些基础题目由于工作中用的比较少但却又是不可少的,这样回答起来就会反应慢,不确定,不准确,特此开了文章记录遇到的不确定或者回答比较拗口的问题。
1.servlet是单例的吗,是安全的吗,是多线程吗
servlet是单例的,根据web.xml实例化一次后,其他访问通过多线程的方式调用servlet实例。
因此,关于多线程访问共享变量的安全性问题已经是老生常谈了。这里只要知道servlet是单例的,其他问题也就解决了。servlet的实现方式决定了安全性。成员变量是否是静态的,是否上锁?关于调用成员变量的方法中是否上锁?或者是否是使用封装在线程内的局部变量?
2.什么是线程安全?常用的HashMap,ArrayList是否安全?
线程安全问题的重点还是共享变量的问题,想了解关于共享变量的变化就要了解jmm(java memory model),简单的说就是线程有工作区,变量放在内存堆中。线程工作必须copy一个副本到工作区去工作,这个操作叫做读取。线程工作结束后将结果写入内存。当多个线程读和写的时候就会有顺序性问题。jvm的中读写无序性使得变量的实际值不确定,每个线程得到的变量的值在于它读取的时候,而之后的时间内改变也不影响线程自己知道的值,即可见性问题。jvm中线程的工作区是互相不可见的。正是因为线程读和写是分两步进行的,在这之间会发生的其他操作造成最终结果的不准确,这就是不安全的原因:原子性。只有保证读写操作是原子的才能保证变量的准确性,于是就是线程同步,即上锁。可以使用synchronized和Lock,还有volatile。
HashMap和ArrayList不是线程安全的。可以使用并发包concurrent下的ConcurrentHashMap,此类采用分段写锁提高并发性,保证写的安全性。同样CopyOnWriteArrayList通过写时上锁并创建副本,在副本写入后,通过volatile规则使得其他线程可见以及缓存一致性,使得其他线程中的副本失效。
3.谈谈对java内存模型的了解
java memory model,jmm.
和上个问题差不多,主要是变量的存储和赋值问题。在上篇文章的volatile有描述。
首先,java对变量的操作:读取,计算,赋值都是在线程中实现的,变量是放在主内存(即内存),而计算的操作必须放在线程的工作区中(对应到硬件就是L1,L2以及寄存器)。线程之间的工作区只有线程自己持有,其他线程无法访问也看不到。这是jmm对可见性的封装。线程根据计算的时间不同而无法保证确切的写入内存的时间,即“无序写入”。java通过上锁来保证原子操作,即原子性。java允许编译器和处理器对指令进行重新排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。,java内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够保证的有序性,这个通常也成为happens-before原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么她们就不能保证有序性,虚拟机可以随意地对她们进行重新排序。
- 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
- 锁定规则:一个unlock操作先行发生于后面对同一个锁lock操作。
- volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作。
- 传递规则:如果操作a线程发生于操作b,而操作b又先行发生于操作c,则可以得出操作a先行发生于操作c。
- 线程启动规则:Thread对象的start()方法先行发生于此线程的每一个操作。
- 线程中断规则:对于线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断时间的发生。
- 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行
- 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始
- 这8条原则摘自《深入理解java虚拟机》。前4条规则是比较重要,后4条显而易见。
4.volatile有什么用?能否用一句话说明下volatile的应用场景?
详细见volatile。
volatile能保证可见性和一定的有序性。由于线程只在自己的工作区工作,如果另一个线程修改了变量的值,其他线程如果需要再次读取变量的值的时候必须从主存中读取。也就是说无法改变已经读取了的线程,但保证了可见性和相对的有序性。另外,jvm的规则:volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作。这个可以保证语句的先后执行顺序。代码中volatile标记的操作之前的代码必须执行完毕后才可执行。
应用场景:状态标记量,用作线程run的条件,如果不用volatile则可能会不读取内存标记,或者不知道何时读取。代码顺序保证,volatile标记的变量的操作之前的代码必须执行完毕。double check,双重检查。
java基础题目总结的更多相关文章
- Java基础题目
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8, ...
- java基础题目日常思考(持续更新)
public static void main(String[] args) { Integer a = 0; count(a); System.out.println(a); // 问题: a 输出 ...
- 50道JAVA基础编程练习题 - 题目
50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...
- (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)
题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...
- java面试题目偏基础
一.JAVA基础篇-概念1.简述你所知道的Linux:Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机(An ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 【JAVA面试题系列一】面试题总汇--JAVA基础部分
JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...
- 微冷的雨Java基础学习手记(一)
使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...
- Java基础&笔试题
这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘.有错误欢迎指出. 一.Java基础部分 1.指针在任何情况下都可进行>,<,> ...
随机推荐
- delphi 中如何查看网页POSTDATA
procedure TForm1.WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool ...
- angularjs 时间格式化
本地化日期格式化: ({{ today | date:'medium' }})Nov 19, 2015 3:57:48 PM ({{ today | date:'short' }})11/19/15 ...
- mongodb(map-reduce)
下例中给出mongoose的一个mapreduce例子,参考mongoose官网. 基本概念: Map函数 接受一个键值对(key-value pair),产生一组中间键值对.MapReduce框架会 ...
- Android(shape.xml)
shape用以在android设计中定义几何形状,这样简单的效果就不需要以来背景图片.基本的功能如下: <shape xmlns:android="http://schemas.and ...
- 项目八:团队项目——Alpha阶段项目总结
1.项目的预期目标 a.完成游戏的基本功能 b.游戏难度的玩家手动调节 c.游戏能够良好的运行完成 与前期的需求分析对比: 第一点不同是游戏的难度调节,原来是想通过选择难度来调节的,但由于难度的分层上 ...
- Unity3D shader简介
Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...
- ReactMix框架,让你实现一套js代码,基于ReactNative在H5,App都能完美跑起来,Write Once,Run Anywhere
ReactNative框架推出已经有一段时间了,相信很多小伙伴都在尝试实现Write Once, Run Anywhere的梦想,比如淘宝的ReactWeb等等,但是这些框架都局限于因为ReactNa ...
- 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目
系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目 实战使 ...
- linux网络编程系列-网络连接的建立
一个比较实用的连接函数,支持host为域名. #include <netdb.h> #include <sys/socket.h> #include <sys/types ...
- webservice2
按照 当然,里面没写清楚如何配置第三方jar 结果一访问就报错:org.codehaus.xfire.transport.http.XFireConfigurableServlet 4年前就搞过ws的 ...