线程安全

Java 集合

你。 提交于 2020-03-17 01:16:34
1、说说List,Set,Map三者的区别? List:有序、元素可重复 Set:元素不能重复 Map: 一个元素即一个键值对,key唯一标识一个键值对,key不能重复,元素可以重复,key、value均可以是任意类型。 2、Arraylist 与 LinkedList 区别? 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是都不保证线程安全; 2. 底层数据结构: Arraylist 底层使用数组; LinkedList 底层使用双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以对于 add(E e) 方法的插入

线程安全的集合

五迷三道 提交于 2020-03-17 01:02:26
集合 #集合大概有4种类型:List Set Queue Map 其中Vector、HashTable、Properties是线程安全的。其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。(线程不安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。) Collections提供多个获取线程安全的集合 CopyOnWriteArraylist #写有锁 读无锁的集合 加强版的读写分离 ); 其实现的原理为 : 写操作原理 :将底层的数组做了一次复制,写的是新数组 完成了赋值之后再讲新数组替换旧数组 每调用一次写 底层数组都会扩容一次 , 读操作原理 :读的是写操作完成之前的旧数组 ,写完成之后才能读到新数组的赋值。 CopyOnWriteArraySet( #序 无下标 元素不允许重复 线程安全的Set集合底层使用CopyOnWriteArraylist实现,不同的是在使用addIfAbsent() 添加元素,会遍历数组 ,如果有存在的元素则不添加 。 其实现的原理为 : 表面上使用add方法,底层使用的是CopyOnWriteArraylist的addIfAbsent() 来判断要插入的新值是否存在

【Linux】线程----线程安全

懵懂的女人 提交于 2020-03-17 00:59:28
线程安全 概念 实现方法 互斥 互斥锁 互斥锁原理 互斥锁操作流程: 举例 死锁 死锁产生的必要条件: 预防死锁 避免死锁 同步 条件变量 条件变量提供的接口功能 例子 问题分析 注意 概念 多个执行流 对 临界资源 进行 争抢访问 ,而不会造成 数据二义性 或者 逻辑混乱 ,称这段争抢访问的过程是线程安全的。 实现方法 线程安全的实现: 同步 :通过 条件判断 ,实现对临界资源访问的时序合理性 互斥 :通过 唯一访问 ,实现对临界资源访问的安全性 互斥 互斥的实现技术: 互斥锁 、 信号量 实现互斥的原理:只要保证 同一时间只有一个执行流能够访问资源 就是互斥 对临界资源进行状态标记:没人访问的时候标记为1,表示可以访问;有人正在访问的时候,就标记为0,表示不可访问;在对 临界资源 进行 访问之前 先 进行状态判断 ,决定是否能够访问,不能访问则使其 休眠 。 互斥锁 互斥锁原理 互斥锁:其实就是一个 计数器 ,只有0/1的计数器,用于标记资源当前的访问状态 1----可访问 0----不可访问 互斥锁想要实现互斥,每个线程在访问临界资源之前都要先访问 同一个互斥锁 (加锁);意味着 互斥锁本身就是一个临界资源 (涉及到计数器的修改,修改过程必须保证安全,如果连自己都保护不了,如何保护他人?) 如果是普通的计数器,则操作步骤为 将mutex的值加载到CPU的一个寄存器

Map集合面试题

自闭症网瘾萝莉.ら 提交于 2020-03-16 18:30:51
有可能问道你都知道哪些常用的Map集合?   HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。 Collection集合接口和Map接口有什么关系?   没关系,Collection是List、Set父接口不是Map父接口。 HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?   HashMap不是线程安全的。线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。 使用HashMap有什么性能问题吗?   使用HashMap要注意避免集合的扩容,它会很耗性能,根据元素的数量给它一个初始大小的值。 HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?   HashMap是数组和链表组成的,默认大小为16,当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。 怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?   按添加顺序使用LinkedHashMap,按自然顺序使用TreeMap,自定义排序TreeMap(Comparetor c)。

阿里P8架构师谈:Java并发编程实战

谁说我不能喝 提交于 2020-03-16 17:34:34
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门: https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 前言 并发编程是Java语言的重要特性之一, 在Java平台上提供了许多基本的并发功能来辅助开发多线程应用程序。然而,这些相对底层的并发功能与上层应用程序的并发语义之间并不存在一种简单而直观的映射关系。因此,如何在Java并发应用程序中正确且高效地使用这些功能就成了Java开发人员的关注重点。 本书介绍 全书内容由浅入深,共分为四个部分。第一部分介绍了Java并发编程的基础理论,包括线程安全性与状态对象的基础知识,如何构造线程安全的类并将多个小型的线程安全类构建成更大型的线程安全类,以及Java平台库中的一些基础并发模块:第二部分介绍了并发应用程序的构造理论,包括应用程序中并行语义的分解及其与逻辑任务的映射,任务的取消与关闭等行为的实现,以及Java线程池中的一些高级功能,此外还介绍了如何提高GUI应用程序的响应性:第三部分介绍了并发编程的性能调优,包括如何避免活跃性问题,如何提高并发代码的性能和可伸缩性以获得理想的性能,以及在测试并发代码正确性和性能时的一些实用技术

进程&线程 同步异步&阻塞非阻塞

六月ゝ 毕业季﹏ 提交于 2020-03-16 14:27:49
2015-08-19 15:23:38 周三 线程 线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 一条线程指的是进程中一个单一顺序的 控制流 ,一个进程中可以并行多个线程,每条线程并行执行不同的任务 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文 join();可以用来邀请其他线程先执行 yield();告诉系统"把自己的CPU时间让掉,让其他线程或者自己运行" 同步异步&阻塞非阻塞 1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。 2. 异步,就是 我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知) 3. 阻塞, 就是调用我(函数),我 (函数)没有接收完数据或者没有得到结果之前

java 集合(list、set、map)的特点

六月ゝ 毕业季﹏ 提交于 2020-03-16 14:12:37
集合相关的类有一大堆,一般也只用到常用的方法增删改查,而且它它们的方法名也基本一样,所以一直都不知道什么时候用什么集合, 今天趁有空特意从网上整理资料方便日后回忆。 一、List:、有顺序以线性方式存储,可以存放重复对象 线程安全方法:List list = Collections.synchronizedList(new LinkedList(...)); LinkedList:双向链表实现存储  索引数据慢插入数度较快  线程不安全(比安全性能好) ArrayList:数组方式存储数据  索引数据快插入数据慢  线程不安全 Vector:数组方式存储数据  索引数据快插入数据慢  线程安全 Stack:继承自 Vector ,实现一个后进先出的堆栈 二、Set:无顺序,不包含重复的元素 HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。 TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。 LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。 三、Map:键必须是唯一 同步方法:Map m = Collections.synchronizedMap(new TreeMap(...));

2019JAVASpring面试题集总结

心不动则不痛 提交于 2020-03-16 08:39:03
**什么是 spring?** 答:spring是个 Java企业级应用的开源开发框架。Spring主要用来开发 Java应用,但是有些扩 展是针对构建 J2EE平台的 web应用。 Spring框架目标是简化 Java企业级应用开发,并通过 POJO为基础的编程模型促进良好的编 程习惯 **使用 Spring框架的好处是什么?** 轻量:Spring是轻量的,基本的版本大约 2MB。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找 依赖的对象们。 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring包含并管理应用中对象的生命周期和配置。 MVC框架:Spring的 WEB框架是个精心设计的框架,是 Web框架的一个很好的替代品。 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务 (JTA)。 异常处理:Spring提供方便的 API把具体技术相关的异常(比如由 JDBC,hibernateorJDO 抛出的)转化为一致的 unchecked异常。 **IOC的优点是什么?** 答:IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现

JDBC 线程安全 数据库连接池

烂漫一生 提交于 2020-03-15 09:27:12
jdbc 是线程安全的,但是, 推荐一个线程用一个链接 JDBC is thread safe: It is quite OK to pass the various JDBC objects between threads. For example, you can create the connection in one thread; another thread can use this connection to create a PreparedStatement and a third thread can process the result set. The single major restriction is that you cannot have more than one ResultSet open on a single PreparedStatement at any time . See Does Oracle DB support multiple (parallel) operations per connection?    你不能在一个statment上面存在超过一个打开的resultset(不打开的可以有多个)。 Note that a database commit occurs on a Connection, and so all

Servlet小结

泄露秘密 提交于 2020-03-12 19:23:34
一 .Servlet是伪单例多线程的 1.Servlet借鉴了懒汉式单例模式 2.Servlet的构造方法没有私有化,是通过配置文件来实现的 <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.sgxg.life.singleton.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test.action</url-pattern> </servlet-mapping> 二. Servlet的生命周期(面试常问点) 1.加载的过程(创建对象的过程) 2.初始化 调用 Servlet实例对象的init()方法 3.服务 service() ;每请求一次,就执行一次,可执行多次 4.销毁 调用 Servlet的destroy()方法 ,有两种情况 : 第一种:服务器关闭的时候销毁 第二种:当服务器内存溢出的时候,会将最近不被频繁访问的servlet对象销毁 三 .Servlet默认借鉴了懒汉式单例模式,我们可以将其设置为饿汉式单例模式,服务启动的时候,就创建对象,后续用户直接访问即可 <servlet> <servlet