线程安全

多线程(三)-- 线程安全问题

社会主义新天地 提交于 2020-03-08 07:53:13
安全解决 -- 互斥锁 @synchronized(self) { //开始加锁,操作 } 优: 解决多线程抢夺资源产生的数据安全问题 缺: 消耗CPU资源多 使用前提: 多条线程执行一块代码时加锁 线程同步:@synchronized() 多条线程在同一条线上执行(按顺序执行,与线程并发不同) nonatomic 与 atomic atomic保护线程安全,自动加锁 为setter加锁 对比 atomic:线程安全,消耗大量资源 nonatomic:非线程安全,适合内存小的移动设备 来源: https://www.cnblogs.com/fangchun/p/4684910.html

如何编写线程安全但可伸缩的类

落花浮王杯 提交于 2020-03-06 16:41:19
编写线程安全类时,主要问题是将数据分为多个独立的部分,并为这些部分选择合适的大小。如果部分太小,则我们的类不是线程安全的。如果部件太大,则该类不可扩展。 让我们看一个进一步说明这种情况的示例: 一个例子 假设我们要跟踪一个城市中有多少人。我们要支持两种方法,一种是获取当前居住在城市中的人数,另一种是将一个人从一个城市转移到另一个城市。因此,我们有以下界面: 由于我们要从多个线程并行使用此接口,因此必须选择实现此接口的选项。使用该类 java.util.concurrent. ConcurrentHashMap 或使用该类 java.util.HashMap 和一个锁。这是使用类的实现 java.util.concurrent.ConcurrentHashMap : 方法移动使用线程安全方法计算来减少源城市中的计数。然后,使用计算来增加目标城市中的计数。count方法使用线程安全方法 get 。 这是使用该类的实现 java.util.HashMap : 该方法 move 还使用该方法 compute 来增加和减少源城市和目标城市中的计数。仅在这一次,因为该 compute 方法不是线程安全的,所以两个方法都被同步块包围。该 count 方法 get 再次使用被同步块包围的方法。 两种解决方案都是线程安全的。 但是在使用的解决方案中 ConcurrentHashMap

栈01--[栈接口设计&&栈应用]

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-06 11:58:15
1.栈 2.栈的接口设计 java官方的stack实现是继承自 vector(类似数组) vector 是线程安全的 ArrayList是非线程安全的 3.栈的应用--浏览器的前进和后退 只要输入新的网址 右边的那个栈数据都会被清空 4.代码 java版本实现 public class Stack<E> { private List<E> list = new ArrayList<>(); public void clear() { list.clear(); } public int size() { return list.size(); } public boolean isEmpty() { return list.isEmpty(); } public void push(E element) { list.add(element); } public E pop() { return list.remove(list.size() - 1); } public E top() { return list.get(list.size() - 1); } } View Code 来源: https://www.cnblogs.com/ggnbnb/p/12425604.html

java基础进阶篇(六)------HashTable

孤街浪徒 提交于 2020-03-06 11:02:17
文章目录 一.概述 二.和HashMap的比较 1.不同点 1).接口 2).线程安全 3).初始容量和扩容 4).键值null 的情况 2.相同点 三.结构图 一.概述   前面介绍了HashMap的结构和原理,这里介绍个类似HashMap的结构Hashtable。   HashTable 官方解释是HashMap的轻量级实现, 和 HashMap 一样,Hashtable 也是一个 散列表 ,它存储的内容是 键值对(key-value)映射 。   所以我们结合HashMap来介绍HashTable, 比较下两者的区别。   HashTable 使用的很少, 它支持线程安全, 通过内部方法加上 synchronized 实现, 因此同步锁的密度太大了, 在实际情况中笔者用的很少, 所以关于方法就不像HashMap 详细介绍了.后面会单独准备一章解决HashMap的线程同步问题. 二.和HashMap的比较 1.不同点 1).接口    Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。   HashMap继承AbstractMap,实现了Map, Cloneable, Serializable接口。 2).线程安全    Hashtable 线程安全,支持多线程并发,

【Java】LinkedBlockingQueue、PriorityQueue and ConcurrentLinkedQueue

烂漫一生 提交于 2020-03-06 07:08:44
1、LinkedBlockingQueue:   基于链接节点的可选限定的blocking queue 。 这个队列排列元素FIFO(先进先出)。 队列的头部是队列中最长的元素。 队列的尾部是队列中最短时间的元素。 新元素插入队列的尾部,队列检索操作获取队列头部的元素。 链接队列通常具有比基于阵列的队列更高的吞吐量,但在大多数并发应用程序中的可预测性能较低。 blocking queue说明:不接受null元素;可能是容量有限的;实现被设计为主要用于生产者 - 消费者队列;不支持任何类型的“关闭”或“关闭”操作,表示不再添加项目实现是线程安全的; 2、PriorityQueue: 2.1、基于优先级堆的无限优先级queue 。 优先级队列的元素根据它们的有序natural ordering ,或由一个Comparator在队列构造的时候提供,这取决于所使用的构造方法。 优先队列不允许null元素。 依靠自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException )。 2.2、该队列的头部是相对于指定顺序的最小元素。 如果多个元素被绑定到最小值,那么头就是这些元素之一 - 关系被任意破坏。 队列检索操作poll , remove , peek和element访问在队列的头部的元件。 2.3、优先级队列是无限制的

如何创建不可变(Immutable)的Java类或对象

一曲冷凌霜 提交于 2020-03-05 22:58:50
不可变对象(immutable objects),后面文章我将使用immutable objects来代替不可变对象! 那么什么是immutable objects?什么又是mutable Objects呢? immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects就是那些创建后,状态可以被改变的Objects. 举个例子:String和StringBuilder,String是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变,而StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。 但有的时候String的immutable特性也会引起安全问题,这就是 密码应该存放在字符数组中而不是String中 的原因! immutable objects 比传统的mutable对象在多线程应用中更具有优势,它不仅能够保证对象的状态不被改变,而且还可以不使用锁机制就能被其他线程共享。 实际上JDK本身就自带了一些immutable类,比如String,Integer以及其他包装类。为什么说String是immutable的呢?比如:java.lang

java基础进阶篇(六)_HashTable------【java源码栈】

被刻印的时光 ゝ 提交于 2020-03-05 18:30:25
一.概述   前面介绍了HashMap的结构和原理,这里介绍个类似HashMap的结构Hashtable。   HashTable 官方解释是HashMap的轻量级实现, 和 HashMap 一样,Hashtable 也是一个 散列表 ,它存储的内容是 键值对(key-value)映射 。   所以我们结合HashMap来介绍HashTable, 比较下两者的区别。   HashTable 使用的很少, 它支持线程安全, 通过内部方法加上 synchronized 实现, 因此同步锁的密度太大了, 在实际情况中笔者用的很少, 所以关于方法就不像HashMap 详细介绍了.后面会单独准备一章解决HashMap的线程同步问题. 二.和HashMap的比较 1.不同点 1).接口    Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。   HashMap继承AbstractMap,实现了Map, Cloneable, Serializable接口。 2).线程安全    Hashtable 线程安全,支持多线程并发, 内部方法使用synchronized 关键字约束同步代码块.   HashMap 线程不安全,需要开发人员额外解决. 后面章节会专门解释并发情况下数组和集合的处理. 3).初始容量和扩容   

Java 集合小结

倖福魔咒の 提交于 2020-03-05 12:26:33
1.List 1.1 ArrayList 以数组实现。节约空间,但数组有容量限制。 超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组 。 按数组下标访问元素-get(i)、set(i,e) 的性能很高,这是数组的基本优势。 如果按下标插入元素、删除元素- add(i,e)、 remove(i)、remove(e),则要用System.arraycopy()来复制移动部分受影响的元素 ,性能就变差了。 越是前面的元素,修改时要移动的元素越多。直接在数组末尾加入元素-常用的add(e),删除最后一个元素则无影响。 1.2 LinkedList 以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。 按下标访问元素-get(i)、set(i,e) 要悲剧的部分遍历链表将指针移动到位 (如果i>数组大小的一半,会从末尾移起)。 插入、删除元素时修改前后节点的指针即可,不再需要复制移动。但还是要部分遍历链表的指针才能移动到下标所指的位置。 只有在链表两头的操作-add()、addFirst()、removeLast()或用iterator()上的remove()倒能省掉指针的移动。 Apache

collection 框架

喜夏-厌秋 提交于 2020-03-04 11:31:04
集合框架(Collection Framework)泛指java.util包的若干个类和接口.如Collection,List,ArrayList,LinkedList,Vector(自动增长数组),HashSet,HashMap等. 集合框架中的类主要封装的是典型的数据结构,如动态数组,链表,堆栈,集合,哈希表等. 集合框架类似编程中经常用到的工具类,使得编码这专注于业务层的实现,不需要从底层实现相关细节—“数据结构的封装”和”典型算法的实现”. 1. Collection框架中实现比较要实现什么接口? Comparable/comparator 2. ArrayList和Vector的区别? 这两个类都实现了List接口,List接口继承了Collection接口,他们都是有序集合.即存储在这两个集合中的元素的位置都是由顺序的,相当于一种动态的数组,我们以后可以按位置索引号来取出某个元素,并且其中的数据是允许重复的.这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素.也不允许有重复的元素.本题目本与hashset没有任何关系,但为了说清楚ArrayList和Vector的功能,我们使用对比方式,有利于说明问题. 接着才说ArrayList与Vector的区别,主要包括两个方面: (1)同步性 Vector是线程安全的

(第一期)大厂面试系列_ArrayList 公众号java源码栈

拥有回忆 提交于 2020-03-02 11:15:48
目录: 1.ArrayList是什么?可以用来干嘛? 2.ArrayList数组的初始大小长度是怎样的?长度不够时怎么办. 3.为什么说数组增删速度慢,增删时ArrayList是怎么实现的? 4.ArrayList(int initialCapacity)是初始化数组大小吗? 5.ArrayList是线程安全的么?怎样线程安全的使用ArrayList呢? 6.ArrayList适合用来做队列么? 7.removeAll, retrain, clean三个方法有什么不同? 8.ArrayList的浅复制和深复制有什么不同?分别怎样实现? 1.ArrayList是什么?可以用来干嘛? ArrayList就是数组列表,主要用来装载数据,当我们装载的是基本类型的数据时int,long,boolean,short,byte…的时候我们只能存储他们对应的包装类,它的主要底层实现是数组Object[] elementData。 与它类似的是LinkedList,和LinkedList相比,它的查找和访问元素的速度较快,但新增,删除的速度较慢。 小结 :ArrayList底层是用数组实现的存储。 特点 :查询效率高,增删效率低,线程不安全。使用频率很高。 正常使用的场景中,都是用来查询,不会涉及太频繁的增删,如果涉及频繁的增删,可以使用LinkedList,如果你需要线程安全就使用Vector