线程安全

何为安全发布,又何为安全初始化?

你。 提交于 2020-03-12 08:40:54
前言 很多时候我们需要跨线程共享对象,若存在并发我们必须以线程安全的方式共享对象,此时将涉及到我们如何安全初始化对象从而进行安全发布,本节我们将来讨论安全初始化、安全发布,文中若有错误之处,还望批评指正。 安全发布 按照正常叙述逻辑来讲,我们应该首先讨论如何安全初始化,然后再进行安全发布分析,在这里呢,我们采取倒叙的方式,先通过非安全发布的方式讨论所出现的问题,然后最后给出如何进行安全初始化,如下,我们以单例模式为例。 public class SynchronizedCLFactory { private Singleton instance; public Singleton get() { synchronized (this) { if (instance == null) { instance = new Singleton(); } return instance; } } } public class Singleton { } 如上提供了用于获取Singleton实例的公共方法,我们通过同步关键字保持线程安全,无论有多少个线程在请求一个Singleton,也不管当前状态如何,所有线程都将获得相同的Singleton实例,Singleton初始化在第一次请求Singleton时发生,而不是在初始化Singleton类时发生,至于是否惰性初始化并不是我们关注的重点

设计模式之单例模式

流过昼夜 提交于 2020-03-12 08:22:18
单例模式 单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象,有点像 Java 的静态变量,但是单例模式要优于静态变量,静态变量在程序启动的时候JVM就会进行加载,如果不使用,会造成大量的资源浪费,单例模式能够实现懒加载,能够在使用实例的时候才去创建实例。开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象,如果创建多份实例,可能会带来不可预知的问题,比如资源的浪费、结果处理不一致等问题。 普通懒汉模式 public static LazyMode getInstance1() { if (LAZY_MODE == null) { LAZY_MODE = new LazyMode(); } return LAZY_MODE; } 优点 需要实例时才会去构造,不会浪费性能和内存空间 缺点 线程不安全,多线程同时调用方法获取实例时,无法保证实例的唯一性 加锁懒汉模式 public static LazyMode getInstance2() { synchronized (LazyMode.class) { if (LAZY_MODE == null) { LAZY_MODE = new LazyMode(); } } return LAZY_MODE; } 优点 实现懒加载,线程安全 缺点 程序串行化,带来额外的性能损耗

#千峰逆战班,拼搏永向前#

微笑、不失礼 提交于 2020-03-12 02:35:21
总结一波: 1,JDBC引入解耦方式 工厂模式 将编译器依赖变为运行时依赖 配置文件 2,传统三层结构面临的问题 new 关键字的使用 3,自定义Spring容器 将对象创建交给Spring容器进行管理 Spring容器:反射+xml解析+工厂模式 ①,需要将要创建的对象的信息保存到xml配置文件中 配置一个bean标签就对应有一个对象 ②,在自定义Spring容器初始化的时候,将xml文件解析 将解析到的对象信息保存到map集合中 ③,根据这些保存的信息使用反射创建对象, ④,提供一个方法对外提供这些对象 4,自定义Spring容器优化版 ①,需要将要创建的对象的信息保存到xml配置文件中 ②,在自定义Spring容器初始化的时候,将xml文件解析 ③,根据解析到信息创建对象,并把对象保存到map集合 ④,提供一个方法对外提供这些对象 5,自定义Spring容器的使用 初始化spring容器 getBean 6,IoC控制反转 资源的控制权反转了!!! 没有使用Spring容器之前,资源的控制权在java程序手上 使用spring容器之后,资源的控制权到spring容器手上了!! 单例模式 ①,私有化构造方法 ②,声明本类对象,并使用private static修饰 ③,提供一个对外访问方法 重点: 7,饿汉单例设计模式 11111 效率高 浪费内存 不支持懒加载 线程安全

HashMap和Hashtable的区别。

守給你的承諾、 提交于 2020-03-11 22:25:18
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。 2 HashTable是线程安全的一个Collection。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样

多线程创建方式及线程安全问题

女生的网名这么多〃 提交于 2020-03-11 07:42:46
1.创建线程方式 一: 创建线程方式一继承 Thread 类 public clsss MyThread extends Thread{ //重写 run方法 ,设置线程任务 Run(){ } } main(){ new MyThread().start(); } 获取线程名称: Thread.currentThread()获取当前线程对象 Thread.currentThread().getName();获取当前线程对象的名称 二: 创建线程方式 — 实现 Runnable 接口 创建线程的步骤。 1、定义类实现 Runnable接口。 2、覆盖接口中的 run方法。。 3、创建 Thread类的对象 4、将 Runnable接口的子类对象作为参数传递给 Thread类的构造函数。 5、调用 Thread类的 start方法开启线程。 l 代码演示: public class Demo02 { public static void main(String[] args) { // 创建线程执行目标类对象 Runnable runn = new MyRunnable(); // 将 Runnable 接口的子类对象作为参数传递给 Thread 类的构造函数 Thread thread = new Thread(runn); Thread thread2 = new Thread

Servlet学习笔记

本秂侑毒 提交于 2020-03-11 06:32:31
一、Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的 数据库 或应用程序之间的中间层。 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。 Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势: 1、性能明显更好。 2、Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。 3、Servlet 是独立于平台的,因为它们是用 Java 编写的。 4、服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。 5、Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。 二、Servlet的生命周期 Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程: 1、Servlet 通过调用 init () 方法进行初始化

wamp环境PHP安装mongodb扩展

北城余情 提交于 2020-03-10 16:07:29
转载地址:http://www.jianshu.com/p/2c53e201ba84 pecl的mongodb扩展链接 我们很多开发工作都要在windows下进行,但是在windows下给这些脚本程序安装一些插件扩展都比较麻烦,没有办法像linux环境一样一行命令完成,这里我在为PHP安装mongodb扩展的时候遇到了一些问题,特此写一遍wamp安装php扩展的教程。 1.下载mongodb扩展 下载windows环境下php的mongodb扩展。 windows下的php的扩展一般都是dll文件,mongodb的php扩展在这里下载: http://pecl.php.net/package/mongo 我们这里选择最新的dll下载就好了。 扩展一般会区分non thread safe (非线程安全)和thread safe(线程安全)区别就在于,非线程安全一般搭配IIS环境使用,线程安全搭配apache使用。当然除此之外php还有 VC6 VC9版本区分VC6和VC9一个支持apache一个支持IIS,VC9 用在apache上也没问题。当然这里还有更多内容这里就不再详细讨论了。 我的环境是win10 64位 wamp(apache+php5.5)那么就下载php5.5 Thread Safe(TS)x64的那个文件。 2.安装mongodb扩展

Java并发编程保护线程安全

断了今生、忘了曾经 提交于 2020-03-09 07:33:37
我们编程的时候经常会用到并发编程。在java中是通过多线程来实现的,多线程会提高程序的性能,但是也会引出很多的问题,比如死锁,脏数据。 解决问题的方法是: 1 不在线程之间共享状态变量。 2 将对象变为不可变变量。 3 在访问方法的使用同步,ynchronized和Lock都可以。 来源: https://www.cnblogs.com/yanzhao-x/p/11042463.html

Java多线程系列--“JUC原子类”02之 AtomicLong原子类

耗尽温柔 提交于 2020-03-09 05:38:33
什么是线程安全? 当多个线程访问某个类时,不管这些的线程的执行顺序如何,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 哈哈书上的解释,还是翻译过来的,看了半天还是觉得有点奇怪。比如说 “类都能表现出正确的行为” 是毛线意思?在网上搜了一番 "线程安全就是说多线程访问同一代码,不会产生不确定的结果" 这样反而跟容易理解,果然读书要么读原版中文书要么读原版英文书,看英文的翻译版真的是蛋疼无比。说到这里,我以前貌似把多线程及线程安全一个根本性问题搞混淆了: 所谓的多线程是指多个线程跑同一段代码,所以线程安全的概念是针对于这段代码而言的而不是针对线程。 一个 无状态 的Servlet //程序清单2-1 一个无状态的Servelet @ThreadSafe public class StatelessFactorizer implements Servlet{ public void service(ServlerRequest req, ServletResponse resp){ BigInteger i = extractFromRequest(req); BigInteger[] factors = factor(i); encodeIntoResponse(resp, factors); } }