线程安全

集合(一)

微笑、不失礼 提交于 2019-11-28 18:58:45
备注:若有不正之处,请多谅解并欢迎批评指正。转载请标明链接: https://www.cnblogs.com/pmbb/p/11421506.html 1. 集合的概念和作用 集合类存放于java.util包中。 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。 集合类型主要有3种:set(集)、list(列表)和map(映射)。 集合接口分为:Collection和Map,list、set实现了Collection接口 集合和数组的区别 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1:数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身! 2:数组容易固定无法动态改变,集合类容量动态改变。 3:数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数 4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式 5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率 此图可用 Windows 系统自带画图工具查看比较清晰 Collection 和 Map ,是集合框架的根接口。

线程安全

半世苍凉 提交于 2019-11-28 18:58:31
非线程安全:在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是取到的数据其实是被更改过的(同个对象的变量即共享变量)。 线程安全:获得的实例变量的值是经过同步处理的,不会出现脏读的现象。   另外还有static修饰的类变量。 来源: https://www.cnblogs.com/myitnews/p/11421517.html

为什么用枚举类来实现单例模式越来越流行?

让人想犯罪 __ 提交于 2019-11-28 18:45:09
前言 单例模式是 Java 设计模式中最简单的一种,只需要一个类就能实现单例模式,但是,你可不能小看单例模式,虽然从设计上来说它比较简单,但是在实现当中你会遇到非常多的坑,所以,系好安全带,上车。 单例模式的定义 单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象,有点像 Java 的静态变量,但是单例模式要由于静态变量,静态变量在程序启动的时候就要创建,会造成大量的资源浪费,好的单例模式不会有这个问题。开发中的很多工具类都应用了单例模式,线程池、缓存、日志对象等,它们都只需要创建一个对象,如果创建多份实例,可能会带来不可预知的问题,比如资源的浪费、结果处理不一致等问题。 单例的实现思路 静态化实例对象 私有化构造方法,禁止通过构造方法创建实例 提供一个公共的静态方法,用来返回唯一实例 单例的好处 只有一个对象,内存开支少、性能好(当一个对象的产生需要比较多的资源,如读取配置、产生其他依赖对象时,可以通过应用启动时直接产生一个单例对象,让其永驻内存的方式解决) 避免对资源的多重占用(一个写文件操作,只有一个实例存在内存中,避免对同一个资源文件同时写操作 ) 在系统设置全局访问点,优化和共享资源访问(如:设计一个单例类,负责所有数据表的映射处理) 单例模式的实现 单例模式的主流写法有饿汉模式、懒汉模式、双重检查锁模式、静态内部类单例模式、枚举类实现单例模式五种方式

Java中的线程安全

淺唱寂寞╮ 提交于 2019-11-28 17:48:09
1. XXX电影院出售首场《哪吒》电影,一共100张电影票,在三个窗口进行销售 编写一个Ticket对象,其中每售出一张票,库存就减去一张。当库存大于0的时候,进行卖票 public class Ticket implements Runnable { //共100票 int ticket = 100; @Override public void run() { //模拟卖票 while (true) { if (ticket >0) { System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket+"已被售出"); ticket --; } } } }   执行以下多线程的售票, public class Test { public static void main(String[] args) { //创建票对象 Ticket ticket = new Ticket(); //创建3个窗口 Thread t1 = new Thread(ticket, "窗口1"); Thread t2 = new Thread(ticket, "窗口2"); Thread t3 = new Thread(ticket, "窗口3"); t1.start(); t2.start(); t3.start(); } }

线程安全、类锁、对象锁

最后都变了- 提交于 2019-11-28 17:40:57
文章目录 文章思路 synchronized作用 锁和synchronized的关系 synchronized有几种用法 锁有几种 对象锁和类锁的使用 文章思路 哪些概念难理解 类锁和对象锁区别 类锁所有对象一把锁 对象锁一个对象一把锁,多个对象多把锁 同步是对同一把锁而言的,同步这个概念是在多个线程争夺同一把锁的时候才能实现的,如果多个线程争夺不同的锁,那多个线程是不能同步的 两个线程一个取对象锁,一个取类锁,则不能同步 两个线程一个取a对象锁,一个取b对象锁,则不能同步 文章关键内容: 什么是锁 锁有几种 什么是synchronized synchronized用法 用于方法 得到类锁 得到对象锁 用与代码块 得到类锁 得到对象锁 两种锁的使用 synchronized作用 synchronized是用来完成多线程条件下同步工作的 若没有同步,一个方法有多条语句,两个线程A和B都要都用某个方法,而A线程在调用这个方法的时候,B线程可不会等它多条语句都执行完再去调用这个方法,更有可能的是A线程没有执行完这个方法,B线程夺得CPU执行权,A对这个方法的调用就停止在它最后执行到的语句位置,直到A下一次抢到CPU执行权A才能继续执行它未执行完的代码。 有了同步后,当A获得执行权并开始执行此方法,B就必须乖乖等A将方法全部执行完之后才有权去执行此方法。 锁和synchronized的关系

1 String、StringBuffer与StringBuilder区别

耗尽温柔 提交于 2019-11-28 17:26:50
区别: String内容不可变,StringBuffer和StringBuilder内容可变; StringBuilder非线程安全(单线程使用),String与StringBuffer线程安全(多线程使用); 如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。 (2)String 字符串常量; 这句话总结归纳了String的两个最重要的特点: String是值不可变的常量,是线程安全的(can be shared)。 String类使用了final修饰符,String类是不可继承的。 (3)StringBuffer字符串变量(线程安全)是一个容器,最终会通过toString方法变成字符串; (4)StringBuilder 字符串变量(非线程安全)。 (1) String在修改时不会改变对象自身   在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 。 (2) StringBuffer在修改时会改变对象自身   每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下

Java多线程-线程中止

五迷三道 提交于 2019-11-28 16:38:46
不正确的线程中止-Stop Stop:中止线程,并且清除监控器锁的信息,但是可能导致 线程安全问题,JDK不建议用。 Destroy: JDK未实现该方法。 /** * @author simon */ public class StopThread extends Thread { private int i = 0, j = 0; @Override public void run() { synchronized (this) { // 增加同步锁,确保线程安全 ++i; try { // 休眠10秒,模拟耗时操作 Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } ++j; } } /** * 打印i和j */ public void print() { System.out.println("i=" + i + " j=" + j); } } /** * @author simon * 示例3 - 线程stop强制性中止,破坏线程安全的示例 */ public class Demo { public static void main(String[] args) throws InterruptedException { StopThread thread = new

java多线程常见面试题(上)

邮差的信 提交于 2019-11-28 16:22:45
前言 Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎。大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 Runnable 接口),然后逐渐问到并发问题像在 Java 并发编程的过程中遇到了什么挑战,Java 内存模型,JDK1.5 引入了哪些更高阶的并发工具,并发编程常用的 设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。 热门线程面试题 ps:没有包含全部答案,想了解更全面的同学,可以Google。 1、什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位 。 程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要 100 毫秒,那么用十个线程完成改任务只需 10 毫秒。Java

Android面试——并发编程

喜夏-厌秋 提交于 2019-11-28 16:16:40
编写线程安全的并发代码,主要在于要对共享的可变状态访问操作进行管理。因为共享状态可被多条线程同时访问导致线程安全问题,可以通过同步手段,或者干脆状态不共享、不可变,就不会出现线程安全的问题。 从使用同步手段角度考虑,有时不恰当的执行时序导致不正确的结果,可以通过锁和volatile来确保该变量的操作不被重排序(在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整),比如递增变量出现的线程不安全,使用Atomic类将复合操作变为原子操作可以解决。 从状态不共享角度考虑,对象逸出(没有安全的发布对象,就是某个不应该发布的对象被发布)导致的线程安全问题,可以通过控制方法域,或者线程封闭的方式解决。 从状态不可变角度考虑,将对象域设置为final类型,此对象就是不可变的,然后通过volatile类型来发布不可变对象,可以达到线程安全的目的。 Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)。ConcurrentHashMap、CopyOnWriteArrayList分别用于代替同步状态下的Map和List。 参考: 《Java并发编程实战》 来源: https://blog.csdn.net/WzoneLayer/article/details

SSM分别用了什么设计模式

故事扮演 提交于 2019-11-28 16:13:38
SSM分别用了什么设计模式 Spring的核心是Spring IoC,而Spring IoC的基本原理就是反射机制。 运用反射机制的目的就是要极大程度地增强java的可配置性和可扩展性。 主要的设计模式 一.动态代理模式 1.动态代理模式的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问。 责任链模式 1.责任链模式就是当动态代理模式的拦截器有多个时的设计模式。 2.比如对象调用【请假】,请假单需要项目经理审批,部门经理审批,人事部门审批… 观察者模式 1.观察者模式对我来说算是最容易理解的模式了吧,比如实现小游戏的时候或多或少都模拟了观察者模式。虽让有点出入,但大致符合观察者模式的思想了嘛。 (1)new一个女朋友中,我假设了一个“管理员”对象(一个线程)充当观察者,“自己”对象充当被观察者,属性会随着键盘事件和鼠标事件而改变。然后管理员对象就通过自己对象的变化来对女朋友对象进行操作,比如亲亲抱抱举高高。。。。啊呜。 工厂模式和抽象工厂模式 1.工厂模式还是用小游戏来加强记忆吧,其实现在想着想着就想把之前的小游戏全部重构为运用了设计模式的那种,那样才能加强对设计模式的理解嘛,可是…哭了。 (1)抽象出一个军火商(抽象工厂),这个军火商有坦克工厂和子弹工厂,甚至还可以再扩展导弹,大炮等工厂。而对局的双方无需知道到底有几个工厂,只需知道他们有一个统一的工厂—