线程安全

集合

谁说我不能喝 提交于 2019-11-27 04:56:05
List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口 Set下有HashSet,LinkedHashSet,TreeSet List下有ArrayList,Vector,LinkedList Map下有Hashtable,LinkedHashMap,HashMap,TreeMap Connection 接口 List — List 有序,可重复 ArrayList 优点: 底层数据结构是 数组 , 查询快 ,增删慢。 缺点: 线程不安全 ,效率高 Vector 优点: 底层数据结构是 数组 , 查询快 ,增删慢。 缺点: 线程安全 ,效率低 LinkedList 优点: 底层数据结构是 链表 ,查询慢, 增删快 。 缺点: 线程不安全 ,效率高 Set —Set 无序,唯一 HashSet 底层数据结构是 哈希表 。(无序,唯一) 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals() LinkedHashSet 底层数据结构是 链表和哈希表 。(FIFO插入有序,唯一) 1.由链表保证元素有序 2.由哈希表保证元素唯一 TreeSet 底层数据结构是 红黑树 。( 唯一,有序 ) 1. 如何保证元素排序的呢? 自然排序 比较器排序 2.如何保证元素唯一性的呢? 根据比较的返回值是否是0来决定

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

强颜欢笑 提交于 2019-11-27 04:36:00
50道Java线程面试题   下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 1) 什么是线程?   线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请 点击这里 。 2) 线程和进程有什么区别?   线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请 点击这里 。 3) 如何在Java中实现线程?   在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。更多详细信息请 点击这里 . 4) 用Runnable还是Thread?   这个问题是上题的后续

ArrayList的实现原理以及实现线程安全

心不动则不痛 提交于 2019-11-27 04:13:11
一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用 Collections.synchronizedList(List list) 函数返回一个线程安全的ArrayList集合,或者使用concurrent并发包下的CopyOnWriteArrayList的。 //使用Collections.synchronizedList(List list)方法实现线程安全 List<?> list=Collections.synchronizedList(new ArrayList<>()); 二、通过源码解析Collections.synchronizedList(List list)方法如何实现线程安全? public static List synchronizedList(List list1) { return ((List) ((list1 instanceof RandomAccess) ? new SynchronizedRandomAccessList(list1) : new SynchronizedList(list1))); } 通过判断传入的list类是否为RandomAccess类

JAVA并行编程-第二章 线程安全性-学习总结

天涯浪子 提交于 2019-11-27 03:13:17
第二章 线程安全性 如果当多个线程访问同一个可变的状态变量是没有使用合适的同步,那么程序就会出现错误。有三种方法可以修复这个问题: 不在线程之间共享该状态变量。 将状态变量修改成不可变的变量。 在访问状态变量时使用同步。 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确行为,那么这个类就是线程安全的。 对象的状态是指存储在状态变量中的数据。对象的状态可能包括其他依赖对象的域。无状态:它既不包括任何域,也不包括任何对其他类中域的引用。无状态对象一定是线程安全的。 原子性 竞态条件 由于不恰当的执行时序而出现不正确的结果是一种非常重要的情况:竟态条件。 复合操作 “先检查后执行”(例如延迟初始化)和“读取-修改-写入”(例如递增运算)等操作统称为复合操作:包含了一组必须以原子方式执行的操作以确保线程安全性。 假如有两个操作A和B,如果从执行A的线程来看,当一个个线程执行B时,要么将B全部执行,要么完全不执行B,那么A和B对彼此来说就是原子的。原子操作指:对于访问同一状态的所有操作(包括该操作本身)来说,这个操作是一个以原子方式执行的操作 在实际情况中,应尽可能使用现有的线程安全对象啦管理类的状态。 加锁机制 要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量

40道Java基础常见面试题及详细答案

喜欢而已 提交于 2019-11-27 01:22:01
八种基本数据类型的大小,以及他们的封装类 引用数据类型 Switch能否用string做参数 equals与==的区别 自动装箱,常量池 Object有哪些公用方法 Java的四种引用,强弱软虚,用到的场景 Hashcode的作用 HashMap的hashcode的作用 为什么重载hashCode方法? ArrayList、LinkedList、Vector的区别 String、StringBuffer与StringBuilder的区别 Map、Set、List、Queue、Stack的特点与用法 HashMap和HashTable的区别 JDK7与JDK8中HashMap的实现 HashMap和ConcurrentHashMap的区别,HashMap的底层源码 ConcurrentHashMap能完全替代HashTable吗 为什么HashMap是线程不安全的 如何线程安全的使用HashMap 多并发情况下HashMap是否还会产生死循环 TreeMap、HashMap、LindedHashMap的区别 Collection包结构,与Collections的区别 try?catch?finally,try里有return,finally还执行么 Excption与Error包结构,OOM你遇到过哪些情况,SOF你遇到过哪些情况 Java(OOP)面向对象的三个特征与含义

mybatis

笑着哭i 提交于 2019-11-27 00:25:37
   依赖注入框架可以创建 线程安全的 、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。 作用域 SqlSessionFactoryBuilder 局部变量,用于创建SqlSessionFactory SqlSessionFactory 应用运行期间 SqlSession 每个线程应该有自己的SqlSession,非线程安全,不能共享,所以它的最佳的作用域是请求或方法作用域 如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中 换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。 try (SqlSession session = sqlSessionFactory.openSession()) { // 你的应用逻辑代码 } 来源: https://www.cnblogs.com/siqi/p/11336508.html

JDBC 线程安全 数据库连接池

点点圈 提交于 2019-11-26 22:54:26
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

Java集合类总结

☆樱花仙子☆ 提交于 2019-11-26 22:51:12
前言 之前一直做C++开发,在使用标准集合类的类库时都是使用的STL,觉的这个就是比C语言非常大的进步,很好用;后来玩Java,发现Java中的集合类更是好用,但是由于Java语言的发展原因,在使用的过程中也有很多坑,有很多的细节需要去处理。最近在进行组内代码评审时,就发现开发人员乱用集合类的情况。很多开发人员就不明白各个集合类的特性和使用场景,反正列表就用 ArrayList ,键值就用 HashMap ,仿佛在他们眼中Java的集合类就只有 ArrayList 和 HashMap 这两种。不怕大家笑话,曾经我也是这么使用的,今天就用一点时间,好好的对Java集合类的使用进行一次扫盲。 Java集合概述 Java提供的众多集合类由两大接口衍生而来: Collection 接口和 Map 接口。为了更好的把握Java集合类的整体结构,我这里先贴一个Java集合的整体类图,以便大家对Java集合类有一个整体的印象。 乍一看这个图很复杂,其实我们仔细梳理一下,这个图还是非常清晰的。可以这么看,在Java的集合类中,主要分为 List 、 Map 、 Set 和 Queue 这四大类,这四大接口类下面,又根据使用场景分为多个具体的子类。下面就一一进行总结。 Collection接口说明 从类图上可以看到, Collection 接口作为一个非常重要的基础接口,所以我们有必要对

并发数据结构:谈谈volatile变量

不问归期 提交于 2019-11-26 21:44:40
由来 在 CLR 2.0 Memory Model 中,我们知道现代CPU架构从CPU到Memory Controller每一级都有速度,容量不同的高速缓存。之所以这样设计,主要是因为性能。为了进一步提升性能,当线程读取内存中所期望的元素值时,CPU并不是只读取我们所期望的元素值,它实际上会同时读取该值周围的若干字节,并将其放入高速缓存中。这是因为应用程序通常读取的字节在内存中彼此相邻。当应用程序又读取该值周围的字节时,这些字节已经在高速缓存中了,这样就避免了应用程序再次访问内存,也提升了性能。 应用程序在单核CPU的机器上运行时,高速缓存不会有什么影响。但是当应用程序跑在多CPU/多核CPU的机器上时,我们就要考虑高速缓存所带来的显著影响了(请参考 CLR 2.0 Memory Model )。更槽糕的是,C#或JIT编译器编译代码时,会将指令重新排序。因此,应用程序的执行顺序可能会跟编写的顺序不同,而且现代CPU本身也支持乱序执行CPU指令。 这样,我们就不得不考虑如何来处理高速缓存一致性。不同的CPU处理方式也不尽相同。比如在 CLR 2.0 Memory Model 中讲到的x86架构的CPU就会维持高速缓存一致性,而x64架构向后兼容x86架构,所以也有此特性。但是IA64架构的CPU则被设计用来充分利用每个CPU的高速缓存,而且为了提升性能,尽量避免高速缓存一致性问题。

并行思维 [III]

时间秒杀一切 提交于 2019-11-26 21:44:23
书接上回: 并行思维 [I] , 并行思维 [II] 线程是什么玩意 对于并行程序设计来说,线程的重要性不言而喻。 现代操作系统是典型的基于抢占式调度机制的多任务操作系统。 所谓多任务,指同一时刻,允许操作系统内有多个应用程序运行。比如,我们可以在同一时刻,一边收听音乐,一边浏览网页。当然,计算机能做到的远不止于此。 所谓抢占式调度机制,指在操作系统强制让另外的应用程序运行之前,正在运行的应用程序究竟可以占用 CPU 多少时间。这正是为什么我们感觉多个应用程序同时运行的真正原因,即使在单核处理器上。举例来说,Windows 操作系统任务调度的时间间隔大约在 20 毫秒左右(注:这个极短的时间,人眼无法感知,而人眼又欺骗了大脑,我们就感觉有多个程序在同时运行。实践所知,人眼能感知的最小时间大概是 100 毫秒。因此,Windows Client UI 开发人员应当注意,千万不要让你的程序界面响应大于 100 毫秒。假如大于此数,客户就会感到界面顿卡,带来槽糕的用户体验。Web UI 可以适当放宽界限。但无论怎样,快速的响应策略应当成为实现良好用户体验的首选)。 每个正在运行的应用程序实例都是一个进程。进程通常相对独立于其他进程运行。尤其是程序所使用的内存资源。举个例子,浏览器一般都不能直接访问音乐播放器的内存资源。如果有这个需求,则需要通过其他手段来达到该目的。比如文件映射,IPC