线程安全

面经——Java基础

﹥>﹥吖頭↗ 提交于 2019-12-17 06:15:05
Java基础 ArrayList 和 LinkedList 区别 双亲委派模型以及优点 String是否可以被继承及相关原因 String 和 StringBuffer、StringBuilder 的区别是什么?String 为什么是不可变的? 接口和抽象类的区别 Java 中的异常体系 synchronized 底层实现 final关键字 重载和重写的区别 浅拷贝和深拷贝的区别 static 关键字 wait和sleep区别 反射 为什么java是跨平台的 int和Integer区别 HashMap详解 HashSet 和 HashMap 区别 HashMap 和 HashTable 区别 ConcurrentHashMap解析 ConcurrentHashMap 和 Hashtable 的区别 == 和 equals 区别 Java 序列化和反序列化 注:题目从牛客 Java部门面经整理而来。 2020秋招面经大汇总!(岗位划分) ArrayList 和 LinkedList 区别 1. ArrayList概览 因为 ArrayList 是基于数组实现的,所以支持快速随机访问。RandomAccess 接口标识着该类支持快速随机访问。 public class ArrayList < E > extends AbstractList < E > implements List

线程安全

旧巷老猫 提交于 2019-12-17 03:24:52
1.线程安全概念: 当 多个线程访问某一个类 (对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区" 2.实例:MyTread 上面图是没加synorized的情况. 当多个线程访问myThread的润方法时,以排队的方式进行处理(这里的排队是按照CPU分配的先后顺序而定的),一个线程想要执行synchronized修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行synchronized代码提内容;拿不到锁,这个线程就会不断的尝试获得这把锁,直到拿到为止, 而且是多个线程同时去竞争这把锁.(也就是会有锁竞争的问题) 应当避免多线程竞争的问题,因为这会导致CPU使用率急剧上升 来源: https://www.cnblogs.com/curedfisher/p/11977952.html

ArrayList是非线程安全的,但是为什么是非线程安全的呢?

爱⌒轻易说出口 提交于 2019-12-16 22:27:18
自己通过学习ArrayList的源码,谈一下自己的感悟,不足之处,望多加指出,运维出身自学Java。 ArrayList源码中的属性 //默认容量 private static final int DEFAULT_CAPACITY = 10 ; //空数组,如果传入的容量为0时使用 private static final Object [ ] EMPTY_ELEMENTDATA = { } ; //空数组,传入容量时使用,添加第一个元素的时候会重新初始为默认容量大小 private static final Object [ ] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = { } ; //存储元素的数组 transient Object [ ] elementData ; //集合中元素的个数 private int size ; add操作的源码 public boolean add ( E e ) { //检查是否需要扩容 ensureCapacityInternal ( size + 1 ) ; //把元素插到最后一位 elementData [ size ++ ] = e ; return true ; } private void ensureCapacityInternal ( int minCapacity ) {

Java集合框架常见面试题

给你一囗甜甜゛ 提交于 2019-12-16 14:56:15
点击关注 公众号 及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 剖析面试最常见问题之Java基础知识 说说List,Set,Map三者的区别? Arraylist 与 LinkedList 区别? 补充内容:RandomAccess接口 补充内容:双向链表和双向循环链表 ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢? 说一说 ArrayList 的扩容机制吧 HashMap 和 Hashtable 的区别 HashMap 和 HashSet区别 HashSet如何检查重复 HashMap的底层实现 JDK1.8之前 JDK1.8之后 HashMap 的长度为什么是2的幂次方 HashMap 多线程操作导致死循环问题 ConcurrentHashMap 和 Hashtable 的区别 ConcurrentHashMap线程安全的具体实现方式/底层具体实现 JDK1.7(上面有示意图) JDK1.8 (上面有示意图) comparable 和 Comparator的区别 Comparator定制排序 重写compareTo方法实现按年龄来排序 集合框架底层数据结构总结 Collection 1. List 2. Set Map 如何选用集合? 剖析面试最常见问题之Java基础知识

线程安全的可控制最大容量且带有过期时间的本地缓存(转)

痞子三分冷 提交于 2019-12-16 14:20:45
最近在公司优化一个接口的时候打算使用一个key-value结构的本地缓存。 需要实现的功能非常简单: 1、可以控制本地缓存的最大对象数量。 2、线程安全,防止发生OOM。 3、同时支持设置单个对象的过期时间。 面对这个需求,我的选择很多,有很多框架都做的非常好,但大多数框架对我来说都太重量级了,我希望一个简单高效的实现,所以我开发了一个简单的小工具,在这里可以分享下实现思路和开发当中遇到的问题以及解决办法。 首先是key-value的结构,我底层封装了一个Map来保存数据。然后要解决线程安全问题,所以我使用了 ConcurrentHashMap这个Map的实现,关于ConcurrentHashMap这个类网上有很多介绍,我在这里就不多说了。 接下来就是需要控制最多存储的对象数量,防止本地缓存太多对象(而且对象一直都被引用,还无法被GC)造成OOM,一开始我只是简单的使用比较size和最大值来判断是否还能添加对象,但是在后来的测试发现并发量非常高的时候会多存几倍的对象,为了保证性能我还不希望加锁或使用synchronized关键字,所以我选择了AtomicInteger这个原子类巧妙的处理添加和删除方法。这个问题的解决我会在代码里详细解释。 对于过期时间实现,我参考了Redis底层对于过期部分的实现,它分为主动和被动过期,前者更节约空间后者性能更好,为此我兼容了两者的优势,采取了主动

java面试题

混江龙づ霸主 提交于 2019-12-16 13:12:43
1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: 1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 2)防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题

80道最新java基础部分面试题(六)

三世轮回 提交于 2019-12-16 11:39:04
59、ArrayList和Vector的区别 答: 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。 接着才说ArrayList与Vector的区别,这主要包括两个方面:. (1)同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的

java基础-线程

孤街醉人 提交于 2019-12-16 07:12:36
线程 状态:新建(new),可运行(runnable),运行(running),阻塞(blocked),死亡(dead) 线程等待和睡眠,sleep不释放锁,wait是释放锁标记,为无限期等待状态,调用 notify 去解除waiT状态进行下以一个时间片的抢夺。 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。 2.线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。 3.如何在Java中实现线程? 在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run方法实现线程。第三种就是使用Callable和Future 4.用实现Runnable还是继承Thread? 大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程

JVM---内存结构

筅森魡賤 提交于 2019-12-16 00:23:47
程序计数器 Program Counter Register 是记住下一条JVM指令的执行地址 特点 是线程私有的 不会存在内存溢出 虚拟机栈 每个线程运行所需要的内存,成为虚拟机栈 每一个栈是由多个栈帧组成,栈帧是每个方法运行时需要的内存,一个栈帧对应着一个方法调用 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 垃圾回收是否涉及栈内存? 不会,栈内存是一次次的方法调用产生的栈帧内存,而栈帧内存在方法调用完成后,会自动出栈。 栈内存分配越大越好吗? 通过参数-Xss size参数来指定栈的大小 栈内存如果分配的大,则可以执行的线程数,越来越少,因为物理内存是一定的。 方法内的局部变量是否是线程安全? 局部变量是线程私有的,所以是线程安全的 如果变量是多个共享的,则需要考虑线程安全问题 总结:如果方法内的局部变量没有逃离方法的作用范围,它是线程安全的 如果局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全 (引用作为参数,作为返回值) /** * 局部变量的线程安全问题 */ public class Demo1_17 { public static void main ( String [ ] args ) { StringBuilder sb = new StringBuilder ( ) ; sb . append ( 4 ) ; sb . append (

80道最新java基础部分面试题(六)

大憨熊 提交于 2019-12-15 18:04:46
自己整理的面试题,希望可以帮到大家,需要更多资料的可以私信我哦,大家一起学习进步! 59、ArrayList和Vector的区别 答: 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。 接着才说ArrayList与Vector的区别,这主要包括两个方面:. (1)同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的