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.指针在任何情况下都可进行>,<,> ...
随机推荐
- Database Schemas Found in Oracle E-Business Suite
https://docs.oracle.com/cd/E26401_01/doc.122/e22952/T156458T659606.htm Table of Database Schemas in ...
- Emberjs之ComputedProperty
计算属性,以下简称CP.简单概括来讲,就是在需要属性值的时候计算一个Function,并将Function返回的值保存在属性中,当第二次获取属性值时,如果发现属性并未改变则直接读取属性,如果属性依赖的 ...
- js中的深复制和浅复制
在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...
- 【Java】ThreadLocal细节分析
ThreadLocal通过中文解释就是线程本地变量,是线程的一个局部变量.根据哲学家黑格尔“的存在即合理”的说法,ThreadLocal的出现肯定是有它的意义,它的出现也是因为多线程的一个产物.Thr ...
- C#开源磁盘/内存缓存引擎
前言 昨天写了个 <基于STSdb和fastJson的磁盘/内存缓存>,大家可以先看看.下午用到业务系统时候,觉得可以改进一下,昨晚想了一个晚上,刚才重新实现一下. 更新 1. 增加了对批 ...
- webservice 之 WSDL的解析
先看一个wsdl, <?xml version="1.0" encoding="UTF-8" standalone="no"?> ...
- ios 设置亮度、声音;调用发短信、邮件、打电话
一,设置亮度 [[UIScreen mainScreen] setBrightness:0.5];//0.0~1.0 二,设置声音 1,添加 MediaPlayer.framework 框架 2,在需 ...
- EF架构~linq模拟left join的两种写法,性能差之千里!
回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...
- Android上dip、dp、px、sp等单位说明
Android上dip.dp.px.sp等单位说明 dip device independent pixels(设备独立像素). 不同设备不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA ...
- token防止表单重复提交
出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; impo ...