线程安全

Java线程面试题 Top 50 (转载)

Deadly 提交于 2020-02-26 10:06:30
 本文由 ImportNew - 李 广 翻译自 javarevisited 。欢迎加入 Java小组 。转载请参见文章末尾的要求。   不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。   在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如: 继承thread类还是调用Runnable接口 ),然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编程常用的 设计模式 ,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理 死锁 , 竞态条件 ,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。   许多Java程序员在面试前才会去看面试题,这很正常。因为收集面试题和练习很花时间,所以我从许多面试者那里收集了Java多线程和并发相关的50个热门问题

两年Java的面试经验

落花浮王杯 提交于 2020-02-26 09:34:26
一:面试中的问题 java集合框架: 1:介绍一下java的集合框架 2:HashMap遇见哈希冲突会如何怎么办?HashMap是线程安全的吗?HashMap在高并发下会有什么问题?然后引入ConcurrentHashMap的原理? 3:Hahtable和concurrentHashMap的区别? 4:数组和ArrayList的区别?Arraylist是如何扩容的? 5:线程池中的阻塞队列一般会选择哪种队列?为什么? 6:RetreenLock的原理?AQS的原理? 7:HashMap的容量为什么推荐是2的幂次方? 框架类: 1:mybatis的二级缓存有什么问题? 2:mybaits中的mapper的#{}和${}有什么区别?哪种可以防止sql注入? 2:我们知道mybatis的mapper和接口之间是没有对象的,那么它是如何映射的? 4:说说springmvc的注解有哪些?他们的原理是什么? 5:springmvc的控制器是单例的吗?是线程安全的吗? 6:struts1和struts2的区别?是线程安全的吗? 7:spring如何解析它的xml文件? 8:spring的核心是什么?Aop的原理是什么? redis相关: 1:redis数据类型有哪些? 2:zset数据类型是如何排序的? 3:redis如何做项目的中间缓存层? 4:redis的Hash的时间复杂度是多少? 数据库

单例模式——独一无二的对象

二次信任 提交于 2020-02-26 02:37:24
面试官:带笔了吧,那写两种单例模式的实现方法吧 沙沙沙刷刷刷~~~ 写好了 面试官:你这个是怎么保证线程安全的,那你知道,volatile 关键字? 类加载器?锁机制???? 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 单例模式——独一无二的对象 单例模式,从我看 《Java 10分钟入门》那天就听过的一个设计模式,还被面试过好几次的设计模式问题,今天一网打尽~~ 有一些对象我们确实只需要一个,比如,线程池、数据库连接、缓存、日志对象等,如果有多个的话,会造成程序的行为异常,资源使用过量或者不一致的问题。你也许会说,这种我用全局变量不也能实现吗,还整个单例模式,好像你很流弊的样子,如果将对象赋值给一个全局变量,那程序启动就会创建好对象,万一这个对象很耗资源,我们还可能在某些时候用不到,这就造成了资源的浪费,不合理,所以就有了单例模式。 单例模式的定义 单例模式确保一个类只有一个实例,并提供一个全局唯一访问点 单例模式的类图 单例模式的实现 饿汉式 static 变量在类装载的时候进行初始化 多个实例的 static 变量会共享同一块内存区域 用这两个知识点写出的单例类就是饿汉式了,初始化类的时候就创建,饥不择食,饿汉 public class Singleton { //构造私有化,防止直接new private

HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别

ぐ巨炮叔叔 提交于 2020-02-26 00:00:26
HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是 HashMap , Hashtable , ConcurrentHashMap 和 synchronized Map 的原理和区别。当时有些紧张只是简单说了下HashMap不是线程安全的;Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁;而 ConcurrentHashMap 不仅线程安全而且效率高,因为它包含一个 segment 数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术。当时忘记了 synchronized Map 和解释一下 HashMap 为什么线程不安全。面试结束后问了下面试官哪里有些不足,面试官说上面这个问题的回答算过关,但可以在深入一些或者自己动手尝试一下。so~~~虽然拿到了 offer,但还是再整理一下,不能得过且过啊。 为什么HashMap是线程不安全的 总说 HashMap 是线程不安全的,不安全的,不安全的,那么到底为什么它是线程不安全的呢?要回答这个问题就要先来简单了解一下 HashMap 源码中的使用的 存储结构 (这里引用的是 Java 8 的源码,与7是不一样的)和它的 扩容机制 。 HashMap的内部存储结构 下面是 HashMap 使用的存储结构: 1 2

单例模式

戏子无情 提交于 2020-02-25 19:27:00
1.单例模式 保证一个类仅有一个实例。 (1)实现方式 1、懒汉模式(线程不安全) 2、懒汉模式(线程安全) 3、饿汉模式(线程安全) 4、静态类内部加载(线程安全) 5、枚举方法(线程安全) 6、双重校验锁法(通常线程安全,低概率不安全) 7、带 volatile 的双重校验锁法(线程安全) 8、使用 ThreadLocal 实现单例模式(线程安全) 9、使用 CAS 锁实现(线程安全) … 实际还有各种奇淫技巧,不只只 9 种方式。 单例模式的安全方式 单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。 下面是一个简单的小实例: [java] view plaincopyprint? 1. //简单懒汉式 2. public class Singleton { 3. 4. //单例实例变量 5. private static Singleton instance = null; 6. 7. //私有化的构造方法,保证外部的类不能通过构造器来实例化 8. private Singleton() {} 9. 10. //获取单例对象实例 11. public static Singleton getInstance() { 12. 13. if (instance ==

ArrayList与Vector区别

一世执手 提交于 2020-02-25 17:18:06
Vector类所有方法都是同步的,保证线程安全,但是一般是两个线程以上,否则单线程访问在同步操作上耗费大量的时间; ArrayList是线程不同步的,既不保证线程安全,在不保证线程安全的情况下建议使用 来源: oschina 链接: https://my.oschina.net/u/4434424/blog/3171022

并发编程之J.U.C的第二篇

走远了吗. 提交于 2020-02-25 12:46:30
并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类概述 8. ConcurrentHashMap 3. JDK7 ConcurrentHashMap 3. 性能比较 10. ConcurrentLinkedQueue 11. CopyOnWriteArrayList 3.2 StampedLock 该类自JDK8加入,是为了进一步优化读性能,它的特点是使用读锁、写锁时都必须配合【戳】使用 加解读锁 加锁写锁 乐观锁,StampedLock 支持 tryOptimisticRead()方法(乐观读),读取完毕后需要做一次戳校验,如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。 4. Semaphore 信号量,用来限制能同时访问共享资源的线程上限。 Semaphore原理 加锁解锁流程 Semaphore 有点像一个停车场,permits 就好像停车位数量,当线程获得了 permits就像是获得了停车位,然后停车场显示空余车位减一 刚开始,permits(state)为3,这时5个线程来获取资源 假设其中 Thread - 1,Thread - 2,Thread -4 cas

String, StringBuffer和StringBuilder的区别

六眼飞鱼酱① 提交于 2020-02-24 11:01:12
StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。既然可变和不可变都有了,为何还有一个StringBuilder呢?相信初期的你,在进行append时,一般都会选择StringBuffer吧! 先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。 原文链接:https://blog.csdn.net/mad1989/article/details/26389541 来源: https://www.cnblogs.com/yingying7/p/12355906.html

Python3标准库:queue线程安全的FIFO实现

允我心安 提交于 2020-02-24 09:34:24
1. queue线程安全的FIFO实现 queue模块提供了一个适用于多线程编程的先进先出(FIFO,first-in,first-out)数据结构,可以用来在生产者和消费者线程之间安全地传递消息或其他数据。它会为调用者处理锁定,使多个线程可以安全而容易地处理同一个Queue实例。Queue的大小(其中包含的元素个数)可能受限,以限制内存使用或处理。 1.1 基本FIFO队列 Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一端,使用get()从另一端删除。 import queue q = queue.Queue() for i in range(5): q.put(i) while not q.empty(): print(q.get(), end=' ') print() 这个例子使用了一个线程来展示按插入元素的相同顺序从队列删除元素。 1.2 LIFO队列 与Queue的标准FIFO实现相反,LifoQueue使用了(通常与栈数据结构关联的)后进后出(LIFO,last-in,first-out)顺序。 import queue q = queue.LifoQueue() for i in range(5): q.put(i) while not q.empty(): print(q.get(), end=' ') print()

Java源码解读系列(一):ArrayList

僤鯓⒐⒋嵵緔 提交于 2020-02-24 07:47:02
本文简单介绍了 ArrayList ,并对扩容,添加,删除操作的源代码做分析。能力有限,欢迎指正。 ArrayList是什么? ArrayList 就是数组列表,主要用来装载数据。底层实现是数组 Object[] elementData ,当我们装载的是基本数据类型 int, long, boolean, shot...的时候我们只能存储他们对应的包装类型。 与它类似的是 LinkedList ,和 LinkedList 相比,它的查找和访问元素的速度较快,但新增,删除的速度较慢。 线程安全吗? 线程不安全。 正常使用场景中, ArrayList 都是用来查询,不会涉及太频繁的增删,如果涉及频繁的增删,可以使用 LinkedList 。如果需要线程安全就使用 Vector 。 Vector 是 ArrayList 的线程安全版本,实现方式就是在所有方法加上 synchronized ,性能较差。 如何扩容? 因为数组的大小是固定,当容量超出了现有数组的大小,就需要进行扩容。 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; // 每次扩大原有容量的一半 int newCapacity = oldCapacity +