线程安全

Java 单例模式全面学习

本小妞迷上赌 提交于 2019-12-31 13:45:16
介绍 什么是单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 解决什么问题:省略创建对象所花费的时间,不需要频繁创建对象,减轻 GC 压力。 单例模式有以下几种实现方式: 线程安全 并发性能好 可以延迟加载 序列化/反序列化安全 能抵御反射攻击 饿汉式 Y Y 懒汉式-不加锁 Y Y 懒汉式-加锁 Y Y 双重检查 Double Check Y Y Y 静态内部类 Y Y Y 枚举 Y Y Y 懒汉式 第一次使用的时候才进行加载 // 非线程安全 public class Singleton { private Singleton(){} private static Singleton singleton; public static Singleton getSingleton(){ if (singleton == null){ singleton = new Singleton(); } return singleton; } } // 加锁线程安全,但是每次获取都会加锁判断 public class Singleton { private Singleton(){} private static Singleton singleton; public static synchronized Singleton getSingleton(){ if

字符串:StringBuilder()

*爱你&永不变心* 提交于 2019-12-30 11:18:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 【1】String和StringBuffer String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 , 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以 经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响 ,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 如果是使用 StringBuffer 类则结果就不一样了, 每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。 所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。 在大部分情况下 StringBuffer > String 【2】StringBuffer和StringBuilde StringBuffer Java.lang.StringBuffer 线程安全的可变字符序列 。一个类似于 String 的字符串缓冲区,但

《吊打面试官》系列-ConcurrentHashMap & HashTable

孤人 提交于 2019-12-30 10:03:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前言 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚( 请允许我使用一下夸张的修辞手法 )。 于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写互联网技术栈面试相关的文章,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer! 所有文章的名字只是我的噱头,我们应该有一颗谦逊的心,所以希望大家怀着空杯心态好好学,一起进步。 回手掏 上次面试呀,我发现面试官对我的几个回答还是不够满意,觉得还是有点疑问,我就挑几个回答一下。 16是2的幂,8也是,32也是,为啥偏偏选了16? 我觉得就是一个经验值,定义16没有很特别的原因,只要是2次幂,其实用 8 和 32 都差不多。 用16只是因为作者认为16这个初始容量是能符合常用而已。 Hashmap中的链表大小超过八个时会自动转化为红黑树,当删除小于六时重新变为链表,为啥呢?

【GOF23设计模式】--单例模式

∥☆過路亽.° 提交于 2019-12-30 05:18:12
核心作用 : 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景 windows 的任务管理器 windows 的回收站 项目中,读取配置文件的类 网站的计数器,否则难以同步 应用程序的日志应用,一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加 数据库连接池的设计一般也是采用单例,因为数据库连接是一种数据库资源 Se rvlet 的 Appli cation 内置对象 Servlet 编程中每个 servlet 也是单例的 Spring 中每个 bean 默认就是单例的,这样做的有点是 spring 容器可以管理 spring mvc 框架 /struts1 框架,控制器对象也是单例 单例模式的优点: 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理 常见的五种单例模式实现方式 主要 : 饿汉式(线程安全,调用效率高。但是,不能延时加载) 懒汉式(线程安全,调用效率不高。但是,可以延时加载) 其他: 双重检测锁式(由于 JVM 底层内部模型原因,偶尔会出现问题,不建议使用)

设计模式(一) 单例模式

扶醉桌前 提交于 2019-12-30 04:59:30
核心作用:    保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景: 单例模式的优点: 由于单例模式只生成一个实例,减少了系统的开销,当一个对象的产生需要比较多的资源师,如:读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后 永久驻留内存的方式 来解决 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类负责所有数据表的映射处理 常见的五种单例模式实现方式: 饿汉式(线程安全,调用效率高,不能延时加载)     解释:饿汉式单例代码中,static变量会在类装载是初始化,此时也不会涉及多个线程对象访问该对象的问题。虚拟保证只会装载一次该类,肯定不会发生并发访问的问题。因此不需要synchronized关键字     问题:如果只是加载本类,而不是要调用getInstance(),甚至永远没有调用,则会造成资源浪费    package com.lp.singleton; /*测试饿汉式单例模式*/ /*当类实例化的*/ public class SingletonDemo1 { // ctrl + m 快捷键 优化界面 // 重点:类初始化时立即加载 private static SingletonDemo1 instance = new SingletonDemo1(); /

windows 下安装memcache拓展

我们两清 提交于 2019-12-30 00:51:20
Windows下安装memcached (linux 接下来会继续 学习) 以管理员身份进入CMD 模式,具体方法:C:/windows/system32 管理员身份打开cmd.exe memcached -d install memcached -d start 运行 services.msc ,搜索memcached 服务已启动,则开启成功 或者 telnet localhost 11211 查看是否能正常连接。 1.下载php_memcache.dll 拓展包 网址:http://www.jb51.net/softs/392873.html 2.根据电脑配置选择拓展文件 我的电脑是 win 64 ,如果是wamp集成环境,根据集成环境的配置选择(如果电脑为64位,但集成环境是32位,则需要安装 添加32位拓展文件); ps: 关于文件选择:ts是指线程安全、nts是指线程不安全; 可以在phpinfo中的查找 Thread Safety项,若是enabled则为线程安全。可以在phpinfo中的查找 Thread Safety项,若是enabled则为线程安全。 3.php_memcache.dll 文件复制到php/ext 中,增加php.ini 配置(wamp集成环境中需要修改apache下的php.ini) extension=php_memcache.dll ; 4

线程安全

六月ゝ 毕业季﹏ 提交于 2019-12-29 12:54:05
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。 更多嵌入式linux及编程学习交流的文章,请访问我的个人网站”恩享网” : http://www.enxiang.icoc.cc ,期待与您共同进步。 来源: https://www.cnblogs.com/LJTbozai/archive/2013/04/17/3026981.html

线程安全

£可爱£侵袭症+ 提交于 2019-12-29 12:53:51
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。   如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和 单线程 运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。   或者说:一个类或者程序所提供的接口对于线程来说是 原子操作 或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由 全局变量 及 静态变量 引起的。   若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑 线程同步 ,否则的话就可能影响线程安全。 http://baike.baidu.com/link?url=mEgVF5eXNH0t-ExpopTp7JnXFNeWhsWV9it2E2TdYuvO8PNphoG5S_wRIcmLNDIdRjyXpSwk0C5EqzYiIqrq469t83mNezLdrIh6AH3xQOeT5cF4cY6rzYq2ToDJ54ai 来源: https://www

线程安全

两盒软妹~` 提交于 2019-12-29 12:53:32
  如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和 单线程 运行的结果是一样的,而且其他的 变量 的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是 原子操作 或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由 全局变量 及 静态变量 引起的。 若每个线程中对 全局变量 、 静态变量 只有读操作,而无写操作,一般来说,这个 全局 变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑 线程同步 ,否则的话就可能影响线程安全。 来源: https://www.cnblogs.com/eric-qin/p/4051898.html

线程安全

天涯浪子 提交于 2019-12-29 12:53:22
线程共享的资源与独有的资源: 线程共享的内容包括: 进程代码段 进程的公有数据 进程打开的文件描述符 信号的处理器 进程的当前目录 进程用户 ID 与进程组 ID 线程独有的内容包括: 线程 ID 寄存器组的值 线程的栈 错误返回码 线程的信号屏蔽码 故引入了线程安全与不安全的概念: 线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全:不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 概述 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题通常是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。 来源: https://www.cnblogs.com/GyForever1004/p