线程安全

java 8 Date & Time

一个人想着一个人 提交于 2019-12-19 02:55:01
文章目录 Local Date-Time 的简单使用 Zoned 的简单使用 Chrono Units Enum Period and Duration Backward Compatibility Java 8 之前使用的时间类:Date存在缺点: Not thread safe - java.util.Date是非线程安全的,使用时必须处理并发问题。而新的时间类是不可变的,并且没有 set 方法。 Poor design - java.util.Date中日期从1900开始,月从1开始,天从0开始,十分不统一;原来的API提供了很少的时间操作。 Difficult time zone handing - 原来的API需要花费大量代码处理区域时间。 Java 8 加入了新的API:java.time Java.time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中 Local - 简单时间API Zoned - 区域时间API * Instance 时间戳 * LocalDate 不包含时间的日期 * LocalTime 不包含日期的时间 * LocalDateTime 包含时间及日期(没有偏移信息 / 时区) * ZonedDateTime 包含时区的完整的日期时间,偏移量是以UTC / 格林威治时间为基准的。 Local Date-Time

单例模式的优缺点

蹲街弑〆低调 提交于 2019-12-18 09:50:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、时间和空间 比较上面两种写法:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。 饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。 2、线程安全 (1)从线程安全性上讲,不加同步的懒汉式是线程不安全的,比如,有两个线程,一个是线程A,一个是线程B,它们同时调用getInstance方法,那就可能导致并发问题。如下示例: 复制代码 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } 复制代码 程序继续运行,两个线程都向前走了一步,如下: 复制代码 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } 复制代码 (2)饿汉式是线程安全的,因为虚拟机保证只会装载一次

Linux系统编程之线程内容补充

旧巷老猫 提交于 2019-12-18 08:32:01
线程安全(论可重入性):函数可以供多个线程安全调用,称之为安全函数。 实现线程安全主要有两种方法: 将函数与互斥量关联使用,在函数返回时解锁; 将共享变量与互斥量关联起来,这种较为复杂。 函数实现为可重入函数(可重入函数即无需使用互斥量,即可多线程安全调用,就是避免对全局变量和静态变量的使用) 来源: CSDN 作者: 黄先生-? 链接: https://blog.csdn.net/huang422600/article/details/103572547

hashmap和hashtable

夙愿已清 提交于 2019-12-18 01:31:12
HashTable 底层数组+链表实现,无论key还是value都 不能为null ,线程 安全 ,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为 11 ,扩容:newsize = olesize*2+1 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length HashMap 底层数组+链表实现,可 以存储null键和null值 ,线程 不安全 初始size为 16 ,扩容:newsize = oldsize*2,size一定为2的n次幂 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容) 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀 计算index方法:index = hash & (tab.length – 1) HashMap的初始值还要考虑加载因子: 哈希冲突 :若干Key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对Key的查找需要遍历Entry链上的每个元素执行equals()比较。 加载因子 :为了降低哈希冲突的概率

Java集合类的概述

我的未来我决定 提交于 2019-12-18 01:25:38
前述   复习一下Java中的集合类,是面试笔试中常考察的一个点,特地做的整理。 什么是集合类?   集合类,也叫容器类。Java集合类可以用来存储数量庞大的对象。   我们和数组进行对比:   数组:存储基本数据类型,数据类型单一,长度固定,不能动态增大容量。   集合:存储的即可是基本类型的值,也可以是对象,可以存储多种数据类型,长度可变,可以动态增大容量。 Java集合类的体系   Java集合类主要有两个接口派生而出:Collection和Map。即集合类都是实现的这两个接口。我们在实际编程中经常使用的有 List、Set、Queue(这些是实现的 Collection 接口)HashMap、TreeMap、HashTable(这些实现的 Map 接口) Collection接口结构   Collection 接口位于 Java.util 包下,是一个父接口, List、Set、Queue 都是实现的 Collection 接口。Collection 做为父接口提供一些操作集合类的方法,因此它的子接口也有这些方法。   Collection 接口不能被实例化,并且在实际的编程过程中几乎不会使用它进行数据的存储。 Map接口结构   Map 接口实现的是键值对的存储,类似 python 中的 dict。   Map中比较常见的是 HashMap、TreeMap

Java并发多线程 - 并发工具类JUC

爷,独闯天下 提交于 2019-12-18 01:11:33
安全共享对象策略 1. Java线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都不能修改它 3.线程安全对象 : 一个线程安全的对象或则容器,在内部通过同步机制来保证线程安全, 所以其他线程无需额外的同步就可以通过公共接口随意访问它 4.被守护对象 : 被守护对象只能通过获取特定的锁来访问 线程安全 - 同步容器 采用synchronized关键字同步,缺点 : 不能完成做到线程安全 性能差 ArrayLisy -> Vector, Stack HashMap -> HashTable (key、value不能为null) Collections.synchronizedXXX(List、Set、Map) 线程安全 - 并发容器 J.U.C ArrayList -> CopyOnWriteArrayList HashSet、TreeSet -> CopyOnWriteArraySet ConcurrentSkipListSet HashMap、TreeMap -> ConcurrentHashMap ConcurrentSkipListMap AbstractQueuedSynchronizer - AQS 使用Node实现FIFO队列

单例模式

放肆的年华 提交于 2019-12-17 17:27:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 单例模式:确保一个类只有一个实例,并提供一个全局访问点(head first设计模式)。 应用场景:对象需要被共同频繁使用的地方,如多个模块使用同一个数据源连接对象等等。 单例模式的组件: Singleton(需单实例的类,构造方法是私有化的) tip:目前单例模式实现的手段一般有五种: 1、饿汉方式:特点是线程安全,无法懒加载,反序列需要注意。 2、懒汉方式:特点是线程不安全,可以懒加载, 反序列需要注意。 3、双重校验懒汉方式(DCL):可以懒加载,线程安全,如果不加volatile禁止指令重排序的话可能会出问题, 反序列需要注意。 4、内部静态类方式:线程安全,调用效率高,可以延时加载,反序列需要注意,较推荐。 5、枚举类:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用,但是可读性很差,不推荐。 单例模式组件示例: java.lang.Runtime(饿汉式) 具体代码请参考JDK源码,此处就不列举了。 单例模式总结: 单例类必定会有一个私有化的构造器。 单例类可以限制实例的个数,节省内存,尤其是频繁的创建和销毁实例。 可以避免对资源的多重占用。 来源: oschina 链接: https://my.oschina.net/u/3057088/blog/3144061

Java五种单例模式与线程安全

只愿长相守 提交于 2019-12-17 14:46:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 懒汉式 顾名思义,lazy loading(延迟加载,一说懒加载),在需要的时候才创建单例对象,而不是随着软件系统的运行或者当类被加载器加载的时候就创建。当单例类的创建或者单例对象的存在会消耗比较多的资源,常常采用lazy loading策略。这样做的一个明显好处是提高了软件系统的效率,节约内存资源。下面我们看看最简单的懒汉单例模式: 代码1-1 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Singleton { private static Singleton singleton = null ; //私有的、类型为Singleton自身的静态成员变量 //构造方法被设为私有,防止外部使用new来创建对象,破坏单例 private Singleton(){ System.out.println( "构造函数被调用" ); } //公有的静态方法,供外部调用来获取单例对象 public static Singleton getInstance(){ if (singleton == null ){ //第一次调用该方法时,创建对象。 singleton = new Singleton(); } return singleton; } }

Servlet 单例多线程

大城市里の小女人 提交于 2019-12-17 14:34:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 深入研究Servlet线程安全性问题 http://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例); 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等。 3.当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者; 4.线程执行Servlet的service方法; 5.请求结束,放回线程池,等待被调用; (注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题) 从上面可以看出: 第一:Servlet单实例,减少了产生servlet的开销; 第二

Linux多线程服务器端编程

泄露秘密 提交于 2019-12-17 14:03:31
目录 Linux多线程服务器端编程 线程安全的对象生命期管理 对象的销毁线程比较难 线程同步精要 借shared_ptr实现写时拷贝(copy-on-write) 多线程服务器的适用场合与常用编程模型 单线程服务器的常用编程模型 多线程服务器的常用编程模型 分布式系统中使用TCP长连接通信 C++多线程系统编程精要 高效的多线程日志 日志功能的需求 多线程异步日志 muduo网络库简介 TCP网络编程最本质的是处理三个半事件: 在一个端口上提供服务,并且要发挥多核处理器的计算能力 muduo编程示例 一种自动反射消息类型的Google Protobuf网络传输方案 短址服务 muduo库设计与实现 分布式系统工程实践 C++编译链接模型精要 Linux多线程服务器端编程 源码链接 。 muduo的编译安装 . 陈硕的编译教程 。 bazel编译文件不能有中文路径。 安装到指定目录: /usrdata/usingdata/studying-coding/server-development/server-muduo/build/release-install-cpp11/lib/libmuduo_base.a. 这本书前前后后看了三四遍,写得非常有深度,值得推荐。 编译和安装 . 线程安全的对象生命期管理 利用shared_ptr和weak_ptr避免对象析构时存在的竞争条件