volatile

Java面试题汇总

喜夏-厌秋 提交于 2019-12-05 19:44:13
没有什么套路,就是直接上干货!!!最新Java面试题汇总整理连答案一块儿分享给大家,希望对大家有帮助~ 之后还会推出Java面试题系列文章,敬请关注! 按照技术模块:Java热点技术、多线程、微服务、JVM、Redis、消息队列、SQL相关的面试题。不要走开,稍后更精彩! 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用size()方法。 6、Java支持的数据类型有哪些?什么是自动拆装箱? 7、int 和 Integer 有什么区别? 8、Java类的实例化顺序? 父类静态成员和静态代码块 -> 子类静态成员和静态代码块 -> 父类非静态成员和非静态代码块 -> 父类构造方法 -> 子类非静态成员和非静态代码块 -> 子类构造方法 9、什么是值传递和引用传递? 10、String能被继承吗?为什么? 11、String和StringBuilder、StringBuffer的区别? StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况(是线程不安全的) StringBuffer

JAVA内存模型

為{幸葍}努か 提交于 2019-12-05 19:28:41
#一、硬件内存和JAVA内存 硬件的效率与一致性 Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成 #二、JAVA内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。 JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。 简单来说,堆是Java代码可及的内存,留给开发人员使用的;非堆是JVM留给自己用的,包含方法区、JVM内部处理或优化所需的内存(如 JIT Compiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。 JVM 内存包含如下几个部分: 堆内存(Heap Memory): 存放Java对象 非堆内存(Non-Heap Memory): 存放类加载信息和其它meta-data 其它(Other): 存放JVM 自身代码等 在JVM启动时

redis常见问题(转)

感情迁移 提交于 2019-12-05 19:14:28
常见问题: 1、为什么使用redis (一)性能 我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 (二)并发 在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。 2.使用redis有什么缺点 (一)缓存和数据库双写一致性问题 (二)缓存雪崩问题 (三)缓存击穿问题 (四)缓存的并发竞争问题 3、单线程的redis为什么这么快 (一)纯内存操作 (二)单线程操作,避免了频繁的上下文切换 (三)采用了非阻塞I/O多路复用机制     参照上图,简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。 4、redis的数据类型,以及每种数据类型的使用场景 回答:一共五种 (一)String 这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。 (二)hash 这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候

串烧 JavaCAS相关知识

自闭症网瘾萝莉.ら 提交于 2019-12-05 18:10:19
JMM与问题引入 为啥先说JMM,因为CAS的实现类中维护的变量都被volatile修饰, 这个volatile 是遵循JMM规范(不是百分百遵循,下文会说)实现的保证多线程并发访问某个变量实现线程安全的手段 一连串的知识点慢慢缕 首先说什么是JMM, JMM就是大家所说的java的内存模型, 它是人们在逻辑上做出的划分, 或者可以将JMM当成是一种规范, 有哪些规范呢? 如下 可见性: 某一个线程对内存中的变量做出改动后,要求其他的线程在第一事件内马上马得到通知,在CAS的实现中, 可见性其实是通过不断的while循环读取而得到的通知, 而不是被动的得到通知 原子性: 线程在执行某个操作的时,要么一起成功,要么就一起失败 有序性: 为了提高性能, 编译器处理器会进行指令的重排序, 源码-> 编译器优化重排 -> 处理器优化重排 -> 内存系统重排 -> 最终执行的命令 JVM运行的实体是线程, 每一个线程在创建之后JVM都会为其创建一个工作空间, 这个工作空间是每一个线程之间的私有空间, 并且任何两条线程之间的都不能直接访问到对方的工作空间, 线程之间的通信,必须通过共享空间来中转完成 JMM规定所有的变量全部存在主内存中,主内存是一块共享空间,那么如果某个线程相对主内存中共享变量做出修改怎么办呢? 像下面这样: 将共享变量的副本拷贝到工作空间中 对变量进行赋值修改

Is volatile required here

戏子无情 提交于 2019-12-05 17:42:44
I'm implementing a 'sequence lock' class to allow locked write and lock-free reads of a data structure. The struct that will contain the data contains the sequence value, which will be incremented twice while the write takes place. Once before the writing starts, and once after the writing is completed. The writer is on other threads than the reader(s). This is what the struct that holds a copy of the data, and the sequence value looks like: template<typename T> struct seq_data_t { seq_data_t() : seq(0) {}; int seq; <- should this be 'volatile int seq;'? T data; }; The whole sequence lock

超细面试(妖魔鬼怪无处遁形,面试用时一个半小时)

梦想的初衷 提交于 2019-12-05 17:39:07
请画出线程的生命周期,并列出创建线程的方式 线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead) 创建方式:继承Thread 实现Runnable 实现Callable 使用Executors问题来了:  1. sleep结束后进入什么状态?  2. Runnable和Callable的区别?  3. FutureTask是什么  4. Executors创建的几种线程池? ThreadPoolExecutor的参数?   请描述Synchuronized关键字,列出他常用锁。 请描叙一下Volatile和Synchronized的区别。 Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现 ReentrantLock 区别: volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的 volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性 volatile不会造成线程的阻塞

Methods in trait become volatile methods when mixed in concrete classes in 2.9.0-1 but not 2.8.1

此生再无相见时 提交于 2019-12-05 17:14:44
I noticed this breaking (for me using it with OGNL) change in 2.9.0-1: I find that, in 2.9, methods declared in a trait become volatile when mixed in a class: Example in 2.9.0-1 import java.lang.reflect.Modifier trait SuperTrait { def getKnoll = "Kanutten" } class KlassWithKnoll extends SuperTrait { def getKnall = "Mars" } val qsc = classOf[KlassWithKnoll] val knollGetter = qsc.getDeclaredMethod("getKnoll") println("isVolatile: " + Modifier.isVolatile(knollGetter.getModifiers())) This prints out isVolatile: true But in 2.8.1: it prints out isVolatile: false This is actually a breaking change

Does volatile influence non-volatile variables?

房东的猫 提交于 2019-12-05 17:07:22
问题 Okay, suppose I have a bunch of variables, one of them declared volatile: int a; int b; int c; volatile int v; If one thread writes to all four variables (writing to v last), and another thread reads from all four variables (reading from v first), does that second thread see the values written to a , b and c by the first thread, even though they are not themselves declared volatile? Or can it possibly see stale values? Since there seems to be some confusion: I'm not deliberately trying to do

Why is “volatileQualifiedExpr + volatileQualifiedExpr” not necessarily UB in C but in C++?

五迷三道 提交于 2019-12-05 15:57:21
问题 When I today read the C Standard, it says about side effects Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects and the C++ Standard says Accessing an object designated by a volatile glvalue (3.10), modifying an object, calling a library I/O function, or calling a function that does any of those operations are all side effects Hence because both forbid unsequenced side effects to occur on the same

Java并发之volatile关键字

偶尔善良 提交于 2019-12-05 15:47:00
引言 说到多线程,我觉得我们最重要的是要理解一个临界区概念。 举个例子,一个班上1个女孩子(临界区),49个男孩子(线程),男孩子的目标就是这一个女孩子,就是会有竞争关系(线程安全问题)。推广到实际场景,例如对一个数相加或者相减等等情形,因为操作对象就只有一个,在多线程环境下,就会产生线程安全问题。理解临界区概念,我们对多线程问题可以有一个好意识。 Jav内存模型(JMM) 谈到多线程就应该了解一下Java内存模型(JMM)的抽象示意图.下图: 线程A和线程B执行的是时候,会去读取共享变量(临界区),然后各自拷贝一份回到自己的本地内存,执行后续操作。 JMM模型是一种规范,就像Java的接口一样。JMM会涉及到三个问题:原子性,可见性,有序性。 所谓原子性。就是说一个线程的执行会不会被其他线程影响的。他是不可中断的。举个例子: int i=1 这个语句在Jmm中就是原子性的。无论是一个线程执行还是多个线程执行这个语句,读出来的i就是等于1。那什么是非原子性呢,按道理如果Java的代码都是原子性,应该就不会有线程问题了啊。其实JMM这是规定某些语句是原子性罢了。举个非原子性例子: i ++; 这个操作就不是原子性的了。因为他就是包含了三个操作:第一读取i的值,第二将i加上1,第三将结果赋值回来给i,更新i的值。 所谓可见性。可见性表示如果一个值在线程A修改了