首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试系列之-JMM内存模型(JAVA基础)

两个概念 主存 主要存储的是Java实例对象,所有线程创建的实例对象存放在主存中,无论该实例对象是成员变量还是方法中的本地变量(也称局部变量),当然也包括共享信息、常量、静态变量。...由于是共享数据区域,因此多条线程同一个变量进行访问可能会发现线程安全问题。...JMM将所有的变量存放在公共主存中,线程使用变量,会把公共主存中的变量复制到自己的工作内存(或者叫作私有内存)中,线程对变量的读写操作是自己的工作内存中的变量副本。...类似i++的问题,多个线程同时访问该共享变量i,每个线程都会将变量i复制到工作内存中进行修改,如果线程A读取变量i的值线程B正在修改i的值,问题就来了:线程B对变量i的修改对线程A而言就是不可见的...JMM内存屏障主要有Load和Store两: (1)Load Barrier(读屏障) 在读指令前插入读屏障,可以让高速缓存中的数据失效,重新从主存加载数据

22460

Java 面试问题大全

使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。...线程隔离的秘密在于ThreadLocalMap(ThreadLocal的静态内部类) 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享。...JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。...重载和重写允许你用相同的名称来实现不同的功能,但是重载是编译活动,而重写是运行时活动。你可以同一个中重载方法,但是只能在子类中重写方法。重写必须要有继承。...120)Java 中,嵌套公共静态与顶级有什么不同? 的内部可以有多个嵌套公共静态,但是一个 Java 源文件只能有一个顶级公共,并且顶级公共的名称与源文件名称必须一致。

89040
您找到你想要的搜索结果了吗?
是的
没有找到

Java基础总结大全(1)

13、数组: 概念:同一种数据类型的集合。 好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。 14、内存结构: 栈内存:用于存储局部变量,数据使用完,所占空间会自动释放。...A:所有对象共享某个数据的时候,就把这个成员变量定义为静态修饰的。 B:某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。 静态的生命周期比较长,所以一般不推荐使用。...,而sleep可以在任何地方使用 10、多线程安全问题: (1)原因:程序的多条语句在操作线程共享数据(如买票例子中的票就是共享资源),由于线程的随机性导致 一个线程对多条语句,...如果没有同步,一个线程在 修改一个共享数据,而另外一个线程正在使用或者更新同一个共享数据,这样容易导致程序出现错误的结果。 12、什么是锁?锁的作用是什么?...,所有前台线程结束后,守护线程会自动结束。

87450

【Linux】线程互斥

,所以这个教室属于公共资源, 有可能一个社团在这个教室举办活动,别的社团也想占用这个教室 即 一个公共资源被并发访问了 为了保证访问不能被别人去抢走,所以就把门窗关上,直到访问完,才让别人进来...与销毁锁 ---- 使用 锁 ,进行加锁操作 ,保证共享资源的安全 ---- 执行可执行程序后,,发现tickets的值没有负数存在 设置为局部锁 锁要被所有线程看到 所以要定义一个 TData...包含线程的名字 互斥锁对应的指针 表示线程创建,要被传的参数 ---- 在主函数内部,通过 TData 类型new一个对象td,将公共的锁传递给所有线程 将对象td传递给自定义函数,作为参数args...临界区可以是一行代码,也可以是一批代码 访问全局资源,可能会存在多并发访问的问题 ---- 切换会有影响? 加锁在临界区内,加锁后,对临界区代码进行任意切换会不会影响数据出现安全方面的问题?...---- 所以线程a把数据放入寄存器中,这个数据依旧属于线程a的上下文 ---- 第一条指令 本质为 调用线程,向自己的上下文写入0 ---- 第二条指令,将cpu的寄存器中的%al 与 内存中的

15530

Java基础总结大全(1)

13、数组: 概念:同一种数据类型的集合。 好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。 14、内存结构: 栈内存:用于存储局部变量,数据使用完,所占空间会自动释放。...A:所有对象共享某个数据的时候,就把这个成员变量定义为静态修饰的。 B:某个方法没有访问该类中的非静态成员,就可以把这个方法定义为静态修饰。 静态的生命周期比较长,所以一般不推荐使用。...,而sleep可以在任何地方使用 10、多线程安全问题: (1)原因:程序的多条语句在操作线程共享数据(如买票例子中的票就是共享资源),由于线程的随机性导致 一个线程对多条语句,...如果没有同步,一个线程在 修改一个共享数据,而另外一个线程正在使用或者更新同一个共享数据,这样容易导致程序出现错误的结果。 12、什么是锁?锁的作用是什么?...,所有前台线程结束后,守护线程会自动结束。

1.1K110

Java面试题整理及参考答案

抽象的意义 抽象的意义可以用三句话来概括: 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义一致的 接口和抽象的区别 比较 抽象 接口 默认方法...几乎所有的人知道static关键字这两个基本的用法:静态变量和静态方法.也就是被static所修饰的变量/方法属于的静态资源,实例所共享....首先,前面叙述的所有方法属于 Thread ,但是这一对却直接隶属于 Object ,也就是说,所有对象拥有这一对方法。.... // Perform action appropriate to condition } 什么是线程局部变量ThreadLocal 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享...栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享

46420

史上最全Java面试题(带全部答案)

抽象的意义 抽象的意义可以用三句话来概括: 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义一致的 接口和抽象的区别 比较...几乎所有的人知道static关键字这两个基本的用法:静态变量和静态方法。也就是被static所修饰的变量/方法属于的静态资源,实例所共享。...首先,前面叙述的所有方法属于 Thread ,但是这一对却直接隶属于 Object ,也就是说,所有对象拥有这一对方法。.... // Perform action appropriate to condition } 什么是线程局部变量ThreadLocal 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享...栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。 简述JVM内存分配 基本数据类型比变量和对象的引用都是在栈分配的。

59120

面试总结-Java高级篇

阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:阻塞队列进行插入数据,如果队列已满,线程将会阻塞等待直到队列非满...,它先获取了锁,并且获取的是可中断锁,然后判断当前元素个数是否等于数组的长度,如果相等,则调用notFull.await()进行等待,被其他线程唤醒,通过enqueue(e)方法插入元素,最后解锁。...它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)被阻塞,直到最后一个线程到达屏障,屏障才会开门,所有被屏障拦截的线程才会继续干活。...注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。...int是基本数据类型,Integer是包装,类似HashMap这样的结构必须使用包装,因为包装继承自Object,需要实现HashCode,所以可以使用在HashMap这类数据结构中。

79830

Java面试宝典

抽象的意义 抽象的意义可以用三句话来概括: 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义一致的 ## 接口和抽象的区别 比较 抽象 接口...几乎所有的人知道static关键字这两个基本的用法:静态变量和静态方法.也就是被static所修饰的变量/方法属于的静态资源,实例所共享....首先,前面叙述的所有方法属于 Thread ,但是这一对却直接隶属于 Object ,也就是说,所有对象拥有这一对方法。.... // Perform action appropriate to condition } 什么是线程局部变量 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享。...简述堆和栈的区别 VM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享

84420

如何编写线程安全的代码?

在刚才我们提到的堆区、数据区以及文件,这些就是所有线程可以共享的资源,也就是公共场所,线程在这些公共场所就不能随便浪了。...值得注意的是,关于线程安全的一切问题全部围绕着线程私有数据线程共享数据来处理,抓住了线程私有资源和共享资源这个主要矛盾也就抓住了解决线程安全问题的核心。...答案很简单,因为堆上的资源也是所有线程共享的。 ?...假如有两个线程调用func函数传入的指针(引用)指向了同一个堆上的变量,那么该变量就变成了这两个线程共享资源,在这种情况下func函数依然不是线程安全的。...因为该函数使用了一个静态全局变量,只要能拿到该变量的地址那么所有线程可以修改该变量的值,因为这是线程间的共享资源,不到万不得已不要写出上述代码,除非老板拿刀架在你脖子上。

74040

Java高质量面试总结

最常见的缓存行是64个字节 线程修改相互独立的变量,如果这些变量共享同一个缓存行,就会影响彼此的性能,这就是伪共享 线程的状态?...第一范式: 数据库中的表的所有字段值都是不可分割的原子数据项 第二范式: 数据库表中的每一列和主键相关,而不能只和主键的某一部分相关 第三范式: 数据库表中每一列数据和主键直接相关,不能间接相关 范式是为了减少数据冗余...线程个数太多会导致OOM,但是这里的线程包括程序的所有线程?比如包括pigeon的线程? JVM中的加载过程,双亲委派模型中有哪些方法?...方法区(Method): 被所有线程共享,方法区包含所有信息和静态变量 堆(Heap): 被所有线程共享,存放对象实例以及数组,Java堆是GC的主要区域 栈(Stack): 每一个线程包含一栈区...Java中的堆和栈属于不同的内存区域,使用目的也不同 栈通常用于保存方法帧和局部变量.而对象总是在堆上分配 栈通常比堆小,也不会在多个线程之间共享,而堆是被整个JVM所有线程共享 Java堆空间及GC?

43710

如果你这样回答“什么是线程安全”,面试官都会对你刮目相看

在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程可以访问到该区域,这就是造成问题的潜在原因。...因为公共区域人来人往,你放的东西在没有看管措施,一定是不安全的。内存中的情况亦然如此。 所以线程安全指的是,在堆内存中的数据由于可以被任何线程访问到,在没有限制的情况下存在被意外修改的风险。...其实从数据所在“位置”的角度来讲,它们位于公共的堆内存中,只不过被线程认领了而已。这一点我要特地强调一下。 其实就像大街上的共享单车。原来只有1辆,大家抢着骑,老出问题。...共享单车就是数据,你就是线程。骑行期间,这辆单车从逻辑上来讲是属于你的,从所在位置上来讲还是在大街上这个公共区域的,因为你发现每个小区大门口贴着“共享单车,禁止入门”。哈哈哈哈。...第一个线程之所以敢大胆的去睡觉,就是因为它手里拿着锁呢,其它线程是不可能操作数据的。它回来后继续把数据操作完,就可以把锁给释放了。锁再次回到空闲状态,其它线程可以来抢这把锁了。

59350

java面试题汇总一(会持续更新)

29.假设把实例化的数组的变量当成方法参数,方法执行的时候改变了数组内的元素,那么在方法外,数组元素有发生改变?...数据库连接是非常消耗资源的,影响到程序的性能指标。连接池是用来分配、管理、释放数据库连接的,可以使应用程序重复使用同一个数据库连接,而不是每次创建一个新的数据库连接。...将线程池中的所有线程唤醒。...资源分配给进程,同一进程的所有线程共享该进程的所有资源。 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。 线程是指进程内的一个执行单元,也是进程内的可调度实体。...拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。 系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程的开销。

45200

疯转|最近5年133个Java面试问题列表

(答案) 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享。Java 提供 ThreadLocal 来支持线程局部变量,是一种实现线程安全的方式。...(答案) JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。...遍历一个 PriorityQueue ,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。 51)ArrayList 与 LinkedList 的不区别?...(答案) 重载和重写允许你用相同的名称来实现不同的功能,但是重载是编译活动,而重写是运行时活动。你可以同一个中重载方法,但是只能在子类中重写方法。重写必须要有继承。...120)Java 中,嵌套公共静态与顶级有什么不同?(答案) 的内部可以有多个嵌套公共静态,但是一个 Java 源文件只能有一个顶级公共,并且顶级公共的名称与源文件名称必须一致。

2K50

这份 Java 多线程面试知识点请查收!

一个进程中可以有多个线程所有线程共享该进程的资源。 1.3 进程和线程的区别?...而线程是应用程序的一部分,和同一程序的其他线程共享公共内存,通过公共内存从而减少内存开销,能够更快的交换数据和进行线程间协作; 1.4 线程分类 Java 线程由两种,一种是 用户线程,一种是 守护线程...每次去拿数据认为别人会修改,所以每次在读写数据均上锁,这样别人想读写该数据就会阻塞直接拿到锁。...Synchronized 作用范围 作用于方法,锁住的是对象实例(this); 作用于静态方法,锁住 Class 实例,而 Class 的相关数据存储在永久代(PermGen),属于全局共享区域,...,减少同一个线程内多个方法或组件间一些公共变量的传递的复杂度; 9.5 volatile 和 synchronized 的区别 volatile 解决的是内存可见性问题,会使得所有对 volatile

33720

2 万多字,183 道 Java 面试题分析及答案

线程隔离的秘密在于ThreadLocalMap(ThreadLocal的静态内部类) 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享。...JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。...(答案) 重载和重写允许你用相同的名称来实现不同的功能,但是重载是编译活动,而重写是运行时活动。你可以同一个中重载方法,但是只能在子类中重写方法。重写必须要有继承。...120)Java 中,嵌套公共静态与顶级有什么不同?(答案) 的内部可以有多个嵌套公共静态,但是一个 Java 源文件只能有一个顶级公共,并且顶级公共的名称与源文件名称必须一致。...15) 如何在两个线程共享数据? 你可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。

1K20

java学习要点

使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。...线程隔离的秘密在于ThreadLocalMap(ThreadLocal的静态内部类)线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享。...JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。...(答案) 重载和重写允许你用相同的名称来实现不同的功能,但是重载是编译活动,而重写是运行时活动。你可以同一个中重载方法,但是只能在子类中重写方法。重写必须要有继承。...120)Java 中,嵌套公共静态与顶级有什么不同?(答案) 的内部可以有多个嵌套公共静态,但是一个 Java 源文件只能有一个顶级公共,并且顶级公共的名称与源文件名称必须一致。

1.2K61

分享 Java 常见面试题及答案(上)

意思就是说,在你写一个 volatile 域,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。...使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。...线程隔离的秘密在于ThreadLocalMap(ThreadLocal的静态内部类) 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程共享。...JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。...遍历一个 PriorityQueue ,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。 51)ArrayList 与 LinkedList 的不区别?

72720

100道最新Java面试题,常见面试题及答案汇总

在下面的例子中,score既不是1也不是2,就会执行default之后的语句。 Q14:Java中所有派生的基是什么?...同一个包中的名字是不同的,不同的包中的的名字是可以相同的,同时调用两个不同包中相同类名的,应该加上包名加以区别。因此,包可以避免名字冲突。...答案:多线程是一个编程概念,可以在单个程序中以并发方式执行多个任务。同一个进程的多个线程堆栈共享,有助于程序的性能改进。 Q35:为什么在ava中使用Runnable Interface?...答案:Java中没必要定义析构函数,它有自己的垃圾回收机制,不再引用对象,会自动执行。 Q75:Java中变量可以既是局部变量又是静态变量?...Q97:Java的类型转换可以所有其他转换为布尔类型? 答案:不可以,其它原始类型不能转换为布尔类型,布尔类型也不能转换为其它原始数据类型。 Q98:方法的重写允许返回类型不同

5K21

22道Java面试题,看看你会了多少?

,JVM的算法 JVM内存结构主要有三大块:堆内存、方法区和栈,几乎所有的对象实例存放在堆里,如果在堆中没有内存完成实例分配,并且堆也无法再扩展,将会抛出OutOfMemoryError异常。...方法区用于存储已被虚拟机加载的信息、常量、静态变量、即时编译器编译后的代码等数据方法区无法满足内存分配需求,将抛出OutOfMemoryError异常。...System.out.println("递归次数:"+test.depth); } } } 22)ThreadLocal可以用来共享数据...而ThreadLocal为每一个线程提供了变量的副本,使得每个线程在某一间访问到的并不是同一个对象,这样就隔离了多个线程数据数据共享。...而Synchronized却正好相反,它用于在多个线程间通信能够获得数据共享。 Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

48910

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券