线程安全

servlet是否存在线程安全问题

匿名 (未验证) 提交于 2019-12-03 00:26:01
今天老师问了一句,servlet存在线程安全问题吗, public class threadSafe extends HttpServlet { private static final long serialVersionUID = 1L ; private volatile int num = 0 ; protected void doGet ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException { addOne (); response . getWriter (). write ( "now access num : " + getNum ()); } /** * 读取开销低 */ private int getNum () { return num ; } /** * 其写入为非线程安全的,赋值操作开销高 */ private synchronized void addOne () { num ++; } } synchronized 关键字 转载请标明出处: servlet是否存在线程安全问题 文章来源: servlet是否存在线程安全问题

HashMap和HashTable的区别

匿名 (未验证) 提交于 2019-12-03 00:22:01
HashMap和HashTable的区别 HashTable的key和value都不允许为null值,而HashMap的key和value则都是允许null值的。这个其实没有好坏之分,只是Sun为了统一Collection的操作特性而改进的。 HashTable有一个contains(Object value)方法,功能上与containsValue(Object value)一样,但是在实现上花销更大,现在已不推荐使用。而HashMap只有containsValue(Object value)方法。 HashTable使用Enumeration,HashMap使用Iterator。Iterator其实与Enmeration功能上很相似,只是多了删除的功能。用Iterator不过是在名字上变得更为贴切一些。模式的另外一个很重要的功用,就是能够形成一种交流的语言(或者说文化)。有时候,你说Enumeration大家都不明白,说Iterator就都明白了。 hashtable是java一开始发布时就提供的键值映射的数据结构,其所有的public方法都利用synchronized关键字修饰,所以是线程安全的,效率低。 hashmap是jdk1.2推出新的Collection库包含的,hashMap是非线程安全的,效率高。 转载请标明出处: HashMap和HashTable的区别

两年阿里程序员面经(转)

匿名 (未验证) 提交于 2019-12-03 00:14:01
动机 17年换了个公司,从三月底开始面,面到四月底,面了有快二十家公司。我是一个喜欢总结经验的人,每经过一场面试,我在回来的路上都会仔细回想今天哪些问题可以答的更好,或者哪些问题是自己之前没遇到过的,或者是哪个知识点今天又问了等等。四月中旬的时候,我就在构思要写一篇面经,主要是想着可能对那些跟我相同处境的人有点帮助,再者就是稍微记录下这为期一个月的面试过程。 个人介绍 首先介绍下我面试时的自身条件情况,我把自己的情况分为优势和劣势来说可能更有利于你们比较自身情况。 劣势: 15年7月毕业后开始到上海工作,面试的时候是17年3月到4月,一年多的经验,勉强算两年经验。分析:一年多经验我认为是比较尴尬的,处于一个不上不下的位置,很多公司比较喜欢招三年经验的,或者直接招应届生来培养。 毕业于一个非985/211,勉强上一本的高校。分析:这个相对影响较小,因为有工作经验后,公司对学校的要求就没那么高了,只要是本科就基本没问题,但是还是有个别叼毛公司只要985/211。 前一家公司是传统电信行业,加入项目组时,项目已经上线有段时间了,我们的任务就是有需求就开发,有bug就优化,其他时间就聊骚,各干各的,工作一年多跟在养老一样,用一句话说就是编程5分钟,扯淡2小时,项目经验严重不足,没开发过很难的需求。分析:这一点是最伤的,公司招有经验的就想看你都干了些什么牛批的东西

ArrayList 和 Vector 的区别

匿名 (未验证) 提交于 2019-12-02 23:56:01
这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合, 即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以 按位置索引号取出某个元素,并且其中的数据是允许重复的。 接着说 ArrayList 与 Vector 的区别,这主要包括两个方面: 1、同步性: Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayList 是线程 序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使 用 ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最 好是使用 Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于 Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住 Vector 与 Hashtable 是旧的,是 java 一诞生就提供了的,它们是线程安全的,ArrayList 与 HashMap 是 java2 时才提供的,它们是线程不安全的。 2、数据增长: ArrayList 与 Vector 都有一个初始的容量大小,当存储进它们里面的元素的个数超过 了容量时,就需要增加 ArrayList 与 Vector 的存储空间,每次要增加存储空间时,不是只

设计模式之单例设计模式

匿名 (未验证) 提交于 2019-12-02 23:52:01
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。 比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建 Session 对象。SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个 SessionFactory 就够,这是就会使用到单例模式。 1)饿汉式(静态变量) - 在确定会使用到该实例时,可推荐使用 饿汉式(静态代码块) 2)懒汉式(线程不安全) - 不推荐 懒汉式(线程安全,同步方法) - 效率较低,不推荐 懒汉式(线程不安全,同步代码块) - 不推荐 3)双重检查 - 推荐使用 4)静态内部类 - 推荐使用 5)枚举 - 推荐使用 //饿汉式(静态变量) class Singleton{ //1.构造器私有化(防止new) private Singleton(){} //2.本类内部创建对象实例 private static final Singleton singleton = new Singleton(); //3.提供公有静态方法,返回实例对象 public static Singleton getInstance(){ return singleton; } } 优缺点: 1)优点:写法比较简单

为什么juc下的集合类是线程安全的的

匿名 (未验证) 提交于 2019-12-02 23:49:02
也有一些线程安全的集合,如Vector,HashTable,但大多都是基于sychronized锁控制机制,性能很低。 如果既保证线程安全,执行效率又高,就可考虑下JUC下的集合类了,如: ArrayList对应的高并发类是CopyOnWriteArrayList, HashMap对应的高并发类是ConcurrentHashMap。 它们鱼与熊掌可兼得。但它们为什么在保证效率的同时还能保证线程安全呢? 那么我们先来看看CopyOnWriteArrayList。 CopyOnWriteArrayList提供高效地读取操作,使用在读多写少的场景。CopyOnWriteArrayList读取操作不用加锁,且是安全的; 写操作时,先copy一份原有数据数组,再对复制数据进行写入操作,最后将复制数据替换原有数据,从而保证写操作不影响读操作。 同时注意:其copy的整个过程是上了锁的,所以不会产生多线程安全问题。 我们来看看CopyOnWriteArrayList的核心的源码: /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return {@code true} (as specified by {@link

Map集合

匿名 (未验证) 提交于 2019-12-02 23:47:01
Map 集合框架的第二类接口树。 它提供了一组键值的映射。其中存储的每个对象都有一个相应的关键字(key),关键字决定了对象在Map中的存储位置。 关键字应该是唯一的,每个key 只能映射一个value。 实现类: HashMap、TreeMap、LinkedHashMap、Hashtable等 HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;允许null的键或值;(数组加链表(哈希表)) Hashtable:线程安全的,不允许null的键或值; Properties::key和value都是String类型,用来读配置文件; TreeMap:对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器; (红黑树) LinkedHashMap: 此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。(哈希表加链表) HashMap: Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许重复,但允许值重复。 HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。

获取线程安全的List和Set以及Map

匿名 (未验证) 提交于 2019-12-02 23:43:01
我们都知道List和Set接口的子类都是线程不安全的,但是往往线程不安全但是使用高效,那么如何获取到高效且线程安全的list和set呢? //对于List接口Collections.synchronizedList(new ArrayList<>());CopyOnWriteArrayList<Object> objects = new CopyOnWriteArrayList<>();//对于Set接口Collections.synchronizedSet(new HashSet<>());CopyOnWriteArraySet<Object> objects1 = new CopyOnWriteArraySet<>();//对于Map接口,HashTable和ConcurrentHashMap都是线程安全的Collections.synchronizedMap(new HashMap<>());

一文看懂 Mutex vs Semaphore vs Monitor vs SemaphoreSlim

安稳与你 提交于 2019-12-02 23:08:09
C#开发者(面试者)都会遇到Mutex,Semaphore,Monitor,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别。 什么叫线程安全? 教条式理解 如果代码在多线程环境中运行的结果与 单线程运行结果一样,其他变量值也和预期是一样的,那么线程就是安全的; 线程不安全就是不提供数据访问保护,可能出现多个线程先后修改数据造成的结果是脏数据。 实际场景理解 两个线程都为集合增加元素,我们错误的理解即使是多线程也总有先后顺序吧,集合的两个位置先后塞进去就完了;实际上集合增加元素这个行为看起来简单,实际并不一定是原子操作。 在添加一个元素的时候,它可能会有两步来完成: 在 Items[Size] 的位置存放此元素; 增大 Size 的值。 在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置0,之后设置Size=1; 如果是在多线程场景下,有两个线程,线程A先将元素存放在位置0,但是此时CPU调度线程A暂停,线程B得到运行机会;线程B也向此ArrayList添加元素,因为此时Size仍然等于0 (注意哦,我们假设添加元素是经过两个步骤,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。 那好,我们来看看ArrayList的情况,元素实际上只有一个

带阻塞的线程安全队列

匿名 (未验证) 提交于 2019-12-02 23:03:14
线程安全需要:同步关键字,易失性可见性的控制 队列:就是用来存放元素的。 阻塞: 1,存放元素的时候,如果队列满了,要进行等待状态 2,去除元素的时候,如果队列空了,要进入等待状态 线程安全: 当前线程在进行放操作的时候,其他线程不能进行放操作 队列的底层存储用什么:列表 存储数据:list.add() 通知:随机抽选一个进行通知 notifyAll的:通知全部等待的; HashMap是非线程安全的数据的不一致性 HashTable是线程安全的因为put和get用了sync,加了锁,效率极低 ConcurrentHashMap是线程安全采用了分段锁的方式 线程安全: 转载请标明出处: 带阻塞的线程安全队列 文章来源: 带阻塞的线程安全队列