有些基础题目由于工作中用的比较少但却又是不可少的,这样回答起来就会反应慢,不确定,不准确,特此开了文章记录遇到的不确定或者回答比较拗口的问题。

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基础题目总结的更多相关文章

  1. Java基础题目

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8, ...

  2. java基础题目日常思考(持续更新)

    public static void main(String[] args) { Integer a = 0; count(a); System.out.println(a); // 问题: a 输出 ...

  3. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  4. (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)

    题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...

  5. java面试题目偏基础

    一.JAVA基础篇-概念1.简述你所知道的Linux:Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机(An ...

  6. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  7. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  8. 微冷的雨Java基础学习手记(一)

    使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...

  9. Java基础&笔试题

    这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘.有错误欢迎指出. 一.Java基础部分 1.指针在任何情况下都可进行>,<,> ...

随机推荐

  1. PHP程序员面临的成长瓶颈

    作为Web开发中应用最广泛的语言之一,PHP有着大量的粉丝,那么你是一名优秀的程序员吗?在进行自我修炼的同时,你是否想过面对各种各样的问题,我该如何突破自身的瓶颈,以便更好的发展呢? PHP工程师面临 ...

  2. 使用WMI和性能计数器监控远程服务器权限设置

    应用场景:在web服务器中,通过.NET编码使用WMI查询远程服务器的一些硬件配置信息,使用性能计数器查询远程机器的运行时资源使用情况.在网上没有找到相关的东西,特记录与大家共享. 将web服务器和所 ...

  3. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都能保持一个积极向上的心态,去迎接丰富多彩的人生. 在开发过程中, ...

  4. javascript笔记:javascript的关键所在---作用域链

    javascript里的作用域是理解javascript语言的关键所在,正确使用作用域原理才能写出高效的javascript代码,很多javascript技巧也是围绕作用域进行的,今天我要总结一下关于 ...

  5. [php入门] 3、WAMP中的集成MySQL相关基础操作

    前言:本文以小白视角了解WAMP集成开发环境中的MYSQL,涉及的面广而浅,算是导读性质. 1.启动运行熟悉WAMP中的MySQL 先有库.再有表.数据最终以记录的形式插入表中.其中对数据进行操作使用 ...

  6. redis系列-redis的使用场景

    redis越来越受大家欢迎,提升下速度,做下缓存,完成KPI之利器呀.翻译一篇文章<<How to take advantage of Redis just adding it to yo ...

  7. JavaScript练习之for循环语句

    for循环四要素:初始条件.循环条件.循环体.状态改变. 1.for(var a=i;i<=aa;i++) { 循环体(例sum=sum+i  sum是输出的) } 例题 1-20关没关一分 2 ...

  8. 移动端基于HTML模板和JSON数据的JavaScript交互

    写本文之前,我正在做一个基于Tab页的订单中心: 每点击一个TAB标签,会请求对应状态的订单列表.之前的项目,我会在js里使用 +  连接符连接多个html内容: var html = ''; htm ...

  9. JQuery向导插件Step——第一个阉割版插件

    如果使用过JQuery Steps的朋友一定会发现这个插件有一个缺点,就是页面在第一次进入的时候,会进行一次很明显的DOM重绘--页面会闪一下. 尤其是前端代码比较庞大的时候,效果更为明显. 为了解决 ...

  10. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...