线程安全

SessionFactory是线程安全的吗?Session是线程安全的吗?两个线程能共享一个Session吗?

筅森魡賤 提交于 2019-12-02 02:09:43
(1)SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例的模式进行封装以便于访问。 (2)Session是一个轻量级非线程安全的对象(线程间不能共享Session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用TreadLocal来获取当前的session,无论你调用多少次getCurrentSession()方法,返回的都是同一个session 来源: https://www.cnblogs.com/Yanss/p/11725347.html

十一、并发安全

别来无恙 提交于 2019-12-02 00:26:26
并发安全 【1】什么是类的线程安全? ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 【2】线程不安全引发的问题 死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。 ​ 解决:保证加锁的有序性 动态顺序死锁 动态顺序死锁是在实现时按照某种顺序加锁了,但是因为外部调用的问题,导致无法保证加锁顺序而产生的。 解决方法: 1)通过内在排序,保证加锁的顺序性(使用identityHashCode获得原生的hashcode,按照这个的hashcode大小制定加锁顺序); 2)通过显示锁tryLock()进行尝试拿锁 活锁 尝试拿锁的机制中,发生多个线程之间互相谦让,不断发生拿锁,释放锁的过程。 解决办法:每个线程休眠随机数,错开拿锁的时间。 线程饥饿 【3】怎么才能做到类的线程安全? 栈封闭 所有的变量都是在方法内部声明和使用,这些变量都处于栈封闭状态。 无状态类 没有任何成员变量的类,就叫无状态的类 让类不可变 让类不可变有两种方法: 加final关键字,对于一个类,所有的成员变量应该是私有的,同样的只要有可能

《深入理解Java虚拟机》-----第13章 线程安全与锁优化

天大地大妈咪最大 提交于 2019-12-01 22:53:37
概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题,称为面向过程的编程思想。与此相对的是,面向对象的编程思想是站在现实世界的角度去抽象和解决问题,它把数据和行为都看做是对象的一部分,这样可以让程序员能以符合现实世界的思维方式来编写和组织程序。 面向过程的编程思想极大地提升了现代软件开发的生产效率和软件可以达到的规模,但是现实世界与计算机世界之间不可避免地存在一些差异。例如,人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事件在计算机世界中则是很正常的事情。有时候,良好的设计原则不得不向现实做出一些让步,我们必须让程序在计算机中正确无误地运行,然后再考虑如何将代码组织得更好,让程序运行得更快。对于这部分的主题“高效并发”来讲,首先需要保证并发的正确性,然后在此基础上实现高效。本章先从如何保证并发的正确性和如何实现线程安全讲起。 线程安全 “线程安全”这个名称,相信稍有经验的程序员都会听说过,甚至在代码编写和走查的时候可能还会经常挂在嘴边,但是如何找到一个不太拗口的概念来定义线程安全却不是一件容易的事情,在Google中搜索它的概念,找到的是类似于

java里的单例实现

孤街醉人 提交于 2019-12-01 20:03:55
枚举实现单例 线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用 public enum SingletonFactory { //枚举元素本身就是单例 INSTANCE; //添加自己需要的操作 public SingletonObject getInstance(){ return new SingletonObject(); } } 静态内部类实现单例 线程安全,调用效率高,可以延时加载, 使用内部类的好处是,静态内部类不会在单例加载时就加载,而是在调用getInstance()方法时才进行加载,达到了类似懒汉模式的效果,而这种方法又是线程安全的. public class SingletonFactory { public static SingletonObj getInstance() { return SingletonObj.instance.context; } private static class instance { private static final SingletonObj context = new SingletonObj(); } } 来源: https://www.cnblogs.com/lori/p/11715825.html

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

纵然是瞬间 提交于 2019-12-01 19:30:50
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。 当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。 因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。 ②HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 HashMap几乎可以等价于Hashtable

集合

我只是一个虾纸丫 提交于 2019-12-01 16:55:24
集合的由来及集合继承体系图 * A: 集合的由来   * 数组长度是固定 , 当添加的元素超过了数组的长度时需要对数组重新定义 , 太麻烦 ,java 内部给我们提供了集合类 , 能存储任意对象, 长度是可以改变的 , 随着元素的增加而增加 , 随着元素的减少而减少 * B: 数组和集合的区别   * 区别 1 :     * 数组既可以存储基本数据类型 , 又可以存储引用数据类型 , 基本数据类型存储的是值 , 引用数据类型存储的是 地址值     * 集合只能存储引用数据类型 ( 对象 ) 集合中也可以存储基本数据类型 , 但是在存储的时候会自动装箱变成对象 Integer int double Double   * 区别 2:     * 数组长度是固定的 , 不能自动增长     * 集合的长度的是可变的 , 可以根据元素的增加而增长 * C: 数组和集合什么时候用   * 1, 如果元素个数是固定的推荐用数组   * 2, 如果元素个数不是固定的推荐用集合 ( 用处更多 ) * D: 集合继承体系图 List 的三个子类的特点 * A:List的三个子类的特点   ArrayList:     底层数据结构是数组,查询快,增删慢。     线程不安全,效率高。   Vector:     底层数据结构是数组,查询快,增删慢。     线程安全,效率低。    

Android内存优化之内存缓存

烂漫一生 提交于 2019-12-01 15:37:07
什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全集,经过算法标记哪些是用户经常访问的对象,把这些对象放到一个集合里,这个集合是全集一个子集,下一次用户再访问的时候会先从这个子集集合中查找用户要访问的对象如果找到就直接返回这个对象,如果没有找到则再去全集中查找。当然了我这里说的只是原理性的东西,缓存是有很多算法的,并且有的不止一级缓存,这里就不过多讲了。 为什么要用到缓存? 有缓存的话可以不必每次从源地址读取文件,既节省了时间也节省了流量。尤其是手机设备,频繁的访问网络资源会消耗很多用户的流量和电量,这是用户不能忍受的,所以无论从哪个方面考虑应用程序都必须加上缓存。 Android 中的图片缓存有哪些?各有什么特点? Android 设备的图片缓存分两种,一种是内存缓存,图片缓存在设备的内存中,一种是外部缓存,图片缓存在磁盘上,磁盘可以是内部的存储空间也可以是外部的 sd 卡。这两种缓存各有各的优点,内存缓存优点是快,缺点是因为也是读取到内存中所以也会消耗内存,所以不能太大,用的时候要考虑分配的空间,还有一个缺点是应用重启后就会消失。外部缓存的优点是可以长久保存大量的数据 ( 相比较内存缓存而言 ) ,缺点就是慢。 内存缓存: 在 Android 中官网推荐使用 LruCache 作为内存缓存, LruCache 实际上就是一个 LinkedHashMap( 补充知识:

java多线程并发面试题

我怕爱的太早我们不能终老 提交于 2019-12-01 15:29:18
1、多线程有什么用? (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。 (3)便于建模 这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D

Java多线程之线程安全(0)Java内存区域与Java内存模型

自作多情 提交于 2019-12-01 15:25:05
概况 本文内容 1.Java内存区域划分 2.Java内存模型JMM 3.硬件内存架构与Java内存模型 4.Jvm中线程实现机制 5.线程安全问题的原因 一.理解Java内存区域与Java内存模型 看下图 1.1Java内存区域 各个区域的解释和功能 方法区(Method Area): 方法区属于线程 共享 的内存区域,又称Non-Heap(非堆),主要用于 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码 等数据,根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。值得注意的是在方法区中存在一个叫 运行时常量池(Runtime Constant Pool)的区域,它主要用于存放编译器生成的各种字面量和符号引用 ,这些内容将在类加载后存放到运行时常量池中,以便后续使用。 JVM堆(Java Heap): Java 堆也是属于线程 共享 的内存区域,它在虚拟机启动时创建,是Java 虚拟机所管理的内存中最大的一块,主要用于存放对象实例, 几乎所有的对象实例都在这里分配内存 ,注意Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做 GC 堆 ,如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常。 程序计数器(Program Counter

设计模式——单例模式

不羁岁月 提交于 2019-12-01 15:07:19
单例模式 (Singleton Pattern)使用的比较多,比如我们的 controller 和 service 都是单例的,但是其和标准的单例模式是有区别的。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 模式结构 单例模式的结构很简单,只涉及到一个单例类,这个单例类的构造方法是私有的,该类自身定义了一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。 源码导读 单例模式分为懒汉单例和饿汉单例;饿汉单例代码很简单,顾名思义,饿汉单例就是类初始化的时候就将该单例创建,示例代码如下: public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是 static public static void doSomething(){ } }