线程安全

线程安全

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-28 00:58:29
什么叫线程安全? 线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。 servlet是线程安全吗? Servlet不是线程安全的,servlet是单实例多线程的,当多个线程同时访问同一个方法,是不能保证共享变量的线程安全性的。 Struts2的action是多实例多线程的,是线程安全的,每个请求过来都会new一个新的action分配给这个请求,请求完成后销毁。 SpringMVC的Controller是线程安全的吗?不是的,和Servlet类似的处理流程。 Struts2好处是不用考虑线程安全问题;Servlet和SpringMVC需要考虑线程安全问题,但是性能可以提升不用处理太多的gc,可以使用ThreadLocal来处理多线程的问题。 来源: https://www.cnblogs.com/zwhu1216/p/11384722.html

Android单例模式

拟墨画扇 提交于 2019-11-28 00:23:19
一、单例模式 1.定义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 2.特点 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 二、创建单例模式的方法 1.懒汉式,线程不安全 懒汉式其实是一种比较形象的称谓。既然懒,那么在创建对象实例的时候就不着急。会一直等到马上要使用对象实例的时候才会创建,懒人嘛,总是推脱不开的时候才会真正去执行工作,因此在装载对象的时候不创建对象实例。 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这段代码简单明了,而且使用了懒加载模式,但是却存在致命的问题。当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。也就是说在多线程下不能正常工作。 2.懒汉式,线程安全 为了解决上面的问题,最简单的方法是将整个 getInstance() 方法设为同步(synchronized)。

2019最新整理JAVA面试题附答案

喜夏-厌秋 提交于 2019-11-27 21:29:34
2019最新整理JAVA面试题附答案! 程序员面试 前天 作者:Zz_maker https://www.cnblogs.com/Zz-maker/p/11193930.html 包含的模块: 本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 ==================================================== 一. Java 基础模块 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说

同步容器和并发容器

て烟熏妆下的殇ゞ 提交于 2019-11-27 19:12:47
同步容器和并发容器:   Vector 线程安全,在方法上加Synchronized   ArrayList   Collections 工具类   Hashtable 线程安全,在方法上加Synchronized   HashMap 并发容器:   CopyOnWriteArrayList:当写的时候,就复制。   缺点:     1、因为是基于拷贝复制实现的,所有内存占用会变大。     2、因为在写和删除的时候,会加锁,因此当线程并发写的时候,会产生阻塞问题。导致数据的最终一致性,而不是强一致性。   ConcurrentHashMap: 降低锁的粒度。 队列:先进先出(FIFO : First Input First Outpu) 非阻塞队列:   ConcurrentLinkedQueue: 并发的解决方式:CAS(比较的是指针) 阻塞队列:(如果队列中没有元素,则阻塞等待元素的到来。)   接口:BlockingQueue,阻塞的方法:put,take     实现:ArrayBlockingQueue:基于数组        LinkedBlockingQueue:基于链表 来源: https://www.cnblogs.com/chen--biao/p/11373664.html

并发集合类 ConcurrentHashMap 和 CopyOnWriteArrayList

孤街浪徒 提交于 2019-11-27 18:41:22
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK 1.0的一部分。Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的基类和一个同步的包装器Collections.synchronizedMap,解决了线程安全性问题。通过将基本的功能从线程安全性中分离开来,Collections.synchronizedMap允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。 Hashtable和synchronizedMap所采取的获得同步的简单方法(同步Hashtable中或者同步的Map包装器对象中的每个方法)有两个主要的不足。首先,这种方法对于可伸缩性是一种障碍,因为一次只能有一个线程可以访问hash表。同时,这样仍不足以提供真正的线程安全性,许多公用的混合操作仍然需要额外的同步。虽然诸如get()和put()之类的简单操作可以在不需要额外同步的情况下安全地完成,但还是有一些公用的操作序列,例如迭代或者put-if-absent(空则放入),需要外部的同步,以避免数据争用。

ArrayList, LinkedList, CopyOnWriteArrayList, Vector对比

[亡魂溺海] 提交于 2019-11-27 18:40:29
1. 列表划分为线程安全和线程非安全两类 线程安全:Vector,CopyOnWriteArrayList,Collections.synchronizedList() 线程非安全:ArrayList,LinkedList 2. 底层存储 数组:ArrayList, Vecotr, CopyOnWriteArrayList 双向链表:LinkedList 通过三个添加元素的过程图,来看数据结构 ArrayList,Vector: 底层存储为数组 LinkedList: 底层存储为双向链表 CopyArrayList:底层存储为数组 3. 使用场景和说明 ArrayList 底层为数组,适合随机访问 删除不会引起数组容量变小 动态插入可能涉及到数组长度重新分配 为避免频繁的数组扩容,可设置一个合适的初始容量 不适用于频繁的在数组中间进行插入删除的场景 LinkedList 底层为双向链表,适合频繁删除新增的场景 随机访问不友好,需要遍历 Vector 线程安全 所有的方法都加锁,导致性能较差 CopyOnWriteArrayList 线程安全 读方法不加锁;修改方法加锁,一次只能一个写线程访问 修改时,会拷贝一份内容出来,对拷贝的结果进行操作,最后覆盖之前的内容;每次修改都会先上锁,然后进行数组拷贝,所以性能较ArrayList低;读取无锁,所以读的性能比Vector高(没有竞争)

JUC 总结

别说谁变了你拦得住时间么 提交于 2019-11-27 18:25:18
1创建线程的方式 比较常见的一个问题了,一般就是四种: (1)继承Thread类 (2)实现Runnable接口 (3)实现 Callable 接口:该方式相较于实现 Runnable 接口,方法多了返回值,并且可以抛出异常 FutureTask (4)线程池 2 start()方法和run()方法的区别 只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码 全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。 3什么是线程安全 如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是 线程安全的 。 (1)不可变 像String、Integer、Long这些,都是final类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用 设置不可变对象的原因: 因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误.此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读取数据时不会有任何问题.我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象. (2)绝对线程安全 不管运行时环境如何

线程安全

三世轮回 提交于 2019-11-27 18:02:37
单线程相当于一个人做一件事,而多线程程序中,当需要多个线程共享同一个数据时,一个线程对共享的数据进行修改时,在他没有完成相关操作之前不允许其他线程进行相关操作,否则会出现线程安全问题。 package pers.zhb.runnable; public class MyThread implements Runnable { private int tickets = 10; public void run() { while (true) { if (tickets > 0) System.out.println(Thread.currentThread().getName() + "售票窗口,售卖了" + tickets-- + "号票"); else System.exit(0); } } } package pers.zhb.runnable; public class RunnableDemo { public static void main(String[] args) { MyThread mt=new MyThread(); Thread thread1 = new Thread(mt); Thread thread2 = new Thread(mt); Thread thread3 = new Thread(mt); Thread thread4 = new

JUC基本使用——并发集合和同步工具类

╄→尐↘猪︶ㄣ 提交于 2019-11-27 16:21:33
并发集合 普通的集合中有List(ArrayList|LinkedList)、Set(HashSet|TreeSet)和Map(HashMap|TreeMap)集合,这些集合只适合在单线程情况下使用。 在Collecionts工具类中有synchronized开头方法可以把单线程集合转成支持并发的集合,但是效率不高,很少使用。 为了更好的实现集合的高并发访问处理,JUC创建了一组新的集合工具类,其使用和一般的集合一样,使用方法参照 “Java之集合” 的分类。 1. List和Set集合 CopyOnWriteArrayList相当于线程安全的ArrayList,实现了List接口,支持高并发 CopyOnWriteArraySet相当于线程安全的HashSet,它继承了AbstractSet类,内部是通过CopyOnWriteArrayList实现的,所以是有序的 set 集合 2.Map集合 ConcurrentHashMap是线程安全的哈希表(相当于线程安全的HashMap);它继承于AbstractMap类,并且实现ConcurrentMap接口。 该集合在jdk1.7之前是采用的分段锁机制,将哈希表分为16段,每段是一个锁,每个段又都是哈希表,写入扩容锁定,读取共享,类似于读写锁机制。 在jdk1.8之后,取消分段锁,改用CAS无锁算法,提高写入小路,另外put方法有锁

java之集合框架笔记

不打扰是莪最后的温柔 提交于 2019-11-27 16:09:16
一、集合框架的整体结构,用一张图片来说明 ................................................................................. 二、详解List接口中的三个实现类,以及面试题分析    1.ArrayList :对数组的一种封装,可以理解为长度可变的数组,在内存中分配连续的空间,它里面可以添加任何类型的数据,并且添加的数据都会转换为Object类型。     1.1 底层实现:我们看jdk源码不难发现,ArrayList底层实现其实就是Object类型的数组,所以它具有数组的一些特征     1.2 存取数据的效率: 由于他的底层是数组实现,所以查找效率较高,因为有数组有下标,可以直接通过下标来进行遍历查找,但是我们想一下,若是进行增删操作的时候,当删除中间的一个数据的时候,我们为了保证数组下标的连续性,要将该数组的删除位后面的元素进行向前移动,jdk源码里面是通过copy来实现这种操作,增加的时候也是一样,需要将增加位置处的后面的元素向后移动,这就大大较低了效率,所以他在增删效率上面是有欠缺的。     1.3 线程不安全:他没有要求线程安全,即没有synchronized锁来修饰他的方法,所以相对线程安全的类来说,性能会好一点     1.4 推荐使用:若不是要求线程,一般推荐使用ArrayList