线程安全

设计模式—创建型模式

不问归期 提交于 2019-11-29 15:04:57
文章目录 创建型模式 1、工厂模式 1.1、简单工厂模式 1.2、工厂方法模式 1.3、抽象工厂模式 2、单例模式 2.1、懒汉单例模式 2.1.1、非线程安全的懒汉单例模式 2.1.2、线程安全的懒汉单例模式 2.1.3、返回一个reference指向local static对象(非线程安全) 2.2、饿汉单例模式 3、建造者模式 4、原型模式 创建型模式 创建型模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。 优点:程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可以创建一个产品。 缺点:工厂类集中了所有产品类的创建逻辑,如果产品量较大,会使得 工厂类变的非常臃肿 。 /* 1、创建一个 Shape 接口和实现 Shape 接口的实体类。 2、定义工厂类 ShapeFactory。 3、使用 ShapeFactory 来获取 Shape 对象

strtok and strtok_s

喜夏-厌秋 提交于 2019-11-29 13:35:36
语言的运行库为了支持多线程特性,必须做出一些改进。一种改进的办法就是修改所有的线程不安全的函数的参数列表,改成某种线程安全的版本。比如MSVC的CRT就提供了线程安全版本的strtok()函数:strtok_s,它们的原型如下: char *strtok(char *strToken, const char *strDelimit ); char *strtok_s( char *strToken, const char *strDelimit, char**context); 改进后的strtok_s增加了一个参数,这个参数context是由调用者提供一个char*指针,strtok_s将每次调用后的字符串位置保存在这个指针中。而之前版本的strtok函数会将这个位置保存在一个函数内部的静态局部变量中,如果有多个线程同时调用这个函数,有可能出现冲突。与MSVCCRT类似,Glibc也提供了一个线程安全版本的strtok()叫做strtok_r()。 但是很多时候改变标准库函数的做法是不可行的。标准库之所以称之为“标准”,就是它具有一定的权威性和稳定性,不能随意更改。如果随意更改,那么所有遵循该标准的程序都需要重新进行修改,这个“标准”是不是值得遵循就有待商榷了。所以更好的做法是不改变任何标准库函数的原型,只是对标准库的实现进行一些改进,使得它能够在多线程的环境下也能够顺利运行

Java回顾--集合

痴心易碎 提交于 2019-11-29 12:16:40
1、Collection接口和Collections包装类:    Collection概念: 是一个集合接口,提供了对集合对象进行基本操作的通用接口方法。   有以下结构:     |--List     |  |--LinkedList     |  |--ArrayList     |  |--Vector     |    |--stack     |--Set    Collections: 包含各种有关集合操作的静态多态方法,且该类无法实例化,相当于一个工具类。 2、HashMap、HashTable和ConcurrentHashMap:    HashMap的特点 :线程不安全,允许传入 null值,不能保存映射的顺序。由数组(默认长度为16)+链表组成,jdk1.8后,若其链表长度大于8,就会转变成红黑树。     ps:HashMap线程不安全,是因为多个对象同时对同一HashMap进行操作时,会导致脏读、数据丢失的发生。   详细参考:https://www.cnblogs.com/aspirant/p/8908399.html    HashTable: 可以理解为线程安全的HashMap,为什么是线程安全的,因为它的put、remove、get方法都被synchronized修饰,使其同步,自然是线程安全的了。    ConcurrentHashMap:

java面试07——设计模式

血红的双手。 提交于 2019-11-29 11:19:47
1.什么是设计模式 设计模式就是经过前人无数次的实践总结出的,设计过程可以反复使用的,可以解决特定问题的设计方法。 2.常用的设计模式有哪些 2.1单例模式(饱汉模式、饿汉模式、双重锁模式) https://blog.csdn.net/zhangliangzi/article/details/52438401 1.构造方法私有化,让除了自己类中能创建外,其他地方不能创建; 2.在自己类中创建一个单实例(饱汉模式是一出来就创建单实例,而饿汉模式需要的时候才创建); 3.提供一个方法获取该实例对象(饿汉模式创建时需要进行方法同步)。 //饿汉模式,很饿很着急,所以类加载时即创建实例对象 public class Singleton1 { private static Singleton1 singleton = new Singleton1(); private Singleton1(){ } public static Singleton1 getInstance(){ return singleton; } } //饱汉模式,很饱不着急,延迟加载,啥时候用啥时候创建实例,存在线程安全问题 public class Singleton2 { private static Singleton2 singleton; private Singleton2(){ } public

Java集合类学习笔记

喜你入骨 提交于 2019-11-29 10:28:22
前言:下载Java的API,需要使用接口时,可在API中进行查询。 1、collection接口:可理解为一个动态的对象数组,不同的是集合中对象的内容可以任意扩充。 特点:性能高;易扩展和修改。 常用子类接口:List、Set、Queue。 2、List接口有ArrayList、vector子类,两者的使用方法相同,不同的是ArrayList是异步处理方式,性能高,但是非线程安全;vector同步处理方式,性能低,但是线程安全。在不要求线程安全的时候采用ArrayList子类。 使用实例: package com.webdashen.list; import java.util.ArrayList; import java.util.List; public class listdemo01 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List<String> lists =null; lists=new ArrayList<String>();//接口不能实例化,用其子类进行实例化 lists.add("Hello");//集合对象内容任意,且对象可重复 lists.add("Xueshi"); lists.add(

简单定义多线程!

≡放荡痞女 提交于 2019-11-29 09:51:43
1 说到线程,首先来说下进程,以下是进程的定义: 进程是操作系统结构的基础,是程序的一次执行,是一个程序及其数据结构在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。 简单来说一个任务管理器中列表的一个exe文件就可以理解成进程,如QQ.exe就是一个进程,进程是受系统管理的基本运行单元。 1.1 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。 简单来说,线程可以理解成为在进程中独立运行的子任务。比如,QQ.exe运行中就有很多的子任务在同时运行。 1.2 进程和线程的区别 1.2.1 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 。 1.2.2 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。 1.2.3 拥有资源:进程是拥有资源的一个独立单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。进程之间是不能共享地址空间的, 而线程是共享着所在进程的地址空间的。 1.2.4 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。 1.3 什么是多线程?

java集合框架详解

纵然是瞬间 提交于 2019-11-29 09:40:37
一、数组和集合的比较 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1 :数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身! 2 :数组容易固定无法动态改变,集合类容量动态改变。 3 :数组无法判断其中实际存有多少元素, length 只告诉了数组的容量,而集合的 size() 可以确切知道元素的个数 4 :集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式 5 :集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率 二、 Java 集合 此图可用 Windows 系统自带画图工具查看比较清晰 Collection 和 Map ,是集合框架的根接口。 Collection 的子接口: Set: 接口 --- 实现类: HashSet 、 LinkedHashSet Set 的子接口 SortedSet 接口 --- 实现类: TreeSet List: 接口 --- 实现类: LinkedList,Vector,ArrayList List 集合 有序列表,允许存放重复的元素; 实现类: ArrayList :数组实现,查询快,增删慢,轻量级; ( 线程不安全 ) LinkedList :双向链表实现,增删快

随手记java开发实习生面试

谁说胖子不能爱 提交于 2019-11-29 08:33:12
闲话 大三暑假学校安排了实训计划,去一些公司体验实习,其实是去培训机构上课。8人一个宿舍,于是自己就开始了海投模式,现在基本弃疗了。。。投了8家,就一家回复了我。。。算了,还是去吧。没错我这次面试又是日常失败。总结下还是没有项目经验,很吃亏。一定要写个小项目啊,准备暑假按照教程写个分布式,然后看看spring,jdk的源码,面试都是会问的,数据库同样要加强。 开始 早上11点起床,发现面试官qq加我了,吓醒了之后回复了一下,于是面试官发了一套题目,要我做一下。 笔试 主要是包含了操作系统,线程通信,数据结构(大根堆,栈),http,java类的构造执行过程,递归,jvm内存模型,linux命令. 2道编程题,比较水,第一道是经典的走n阶楼梯,你可以每次走1步或者2步,直接是fib数列,第二道是字符串大小写转化。 还有2道数据库的题目,是手写sql语句,这里真的是写的最差的地方,主要是自己写的项目很少(没有),sql靠着回忆勉强写出来。 题目做完了面试官说通过了笔试,等一会电话面试,这一等就是一下午。。。于是我主动联系了一下,才知道面试官太忙了。 面试 面试是电话面试,但是还是很紧张,问的挺多的。 主要是: 开始问项目经验,我把我的弱弱的项目介绍了一下,面试官听了,没有丝毫兴趣。开始了问面试题(哭。 GC算法(还好有看过,但是我面试忘了一些),扯了下内存模型,年轻代,老年代,持久代

第二章节 - 单例模式

大憨熊 提交于 2019-11-29 08:28:11
单例模式 - 章节 概念 ·只创建一个实例 ·保证对资源的控制 ·延迟加载 ·例子: - 运行时 - 记录器 - Spring bean - 图形管理 设计考虑 类负责生命周期 静态本质上 需要线程安全 私人实例 私有构造函数 构造不需要参数 示例-运行时环境 创建单例 创建单例 只演示创建的一个实例 懒加载 线程安全的操作 陷阱 ·经常过度使用 ·难以进行单元测试 ·如果不小心,就不是线程安全的 ·有时与工厂混淆 ·java. util. Calendar不是单例的 - 原型 来源: https://blog.csdn.net/u012596785/article/details/100623474

解决高并发的新姿势(通过线程安全的set集合来实现,使用压力测试模拟器检验)

喜你入骨 提交于 2019-11-29 06:38:49
关于高并发时的线程安全问题 在项目开发的过程中,一次偶然的测试(当时网络环境不好),模拟出了高并发的问题。出现了数据的脏读。 虽然项目的定位在实际使用过程中,高并发的情况很少,但是在测试的环境中已经发现了这个问题,还是有必要把这个潜在的问题给解决了。 为了解决这个高并发的问题,前后选择了三种方式: 第1种是通过关键字synchronized来对代码块进行加锁;但是这种方式的加锁性能比较低下,最终也是没有采用; 第2种方式是通过redis来实现;redis的加锁性能是比synchronized的性能好了很多,但是在该微服务中,没有用到redis,考虑到如果只是为了加锁来维护一个redis,不太划算,也就放弃了;最终采用了第3种方式。 第3种方式是通过线程安全的set集合来实现。 使用线程安全的set集合具体的加锁,解锁的解读 首先在成员变成获取一个私有的线程安全的集合,获取方式可以使用以下两种方式,我在项目中才用的第一种方式获取 /** * 成员位置初始化线程安全的set集合 */ //方式1: 该方式是在1.8中出现的,比较新的获取方式 private Set<String> lock = ConcurrentHashMap.newKeySet(); //方式2: 该方式是在1.6中出现的,相比上面的一种方式比较老 private Set<String> oldStyle =