线程安全

多线程浅谈

我与影子孤独终老i 提交于 2019-12-06 13:55:31
在多线程学习的开始,首先要了解几个重要的概念 一、线程和进程 进程:是操作系统进行资源分配和调度的独立单位 线程:是进程中独立运行的子任务 一个进程 可能包含 多个线程 二、随机 即使启动线程的代码有先后顺序,实际上线程的启动和调用是随机的,cpu时间片一直在切换 三、线程安全和非线程安全 在多线程下,使用加锁等技术保证共享数据不被脏读、篡改等是线程安全的,反之是非线程安全 四、守护线程和用户线程 线程有两种: 守护线程 和 用户线程 守护线程特征:当最后一个用户线程结束时,守护线程会随着JVM一起结束, GC 就是 最典型的守护线程 五、原子性 一个操作要么都做,那么都不做(不会存在只做了一半的情况) 来源: https://www.cnblogs.com/g1191613819/p/11987949.html

单例模式

放肆的年华 提交于 2019-12-06 13:47:55
单例模式 创建方式 饿汉式( 静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重检查 静态内部类 枚举 饿汉式( 静态常量) 步骤: 构造器私有化 (防止 new ) 类的内部创建对象 向外暴露一个静态的公共方法(getInstance) 示例1 单例对象: public class Singleton01 { private Singleton01() {} private final static Singleton01 instance = new Singleton01(); public static Singleton01 getInstance() { return instance; } } 测试类 public class Type01Test { public static void main(String[] args) { Singleton01 instance = Singleton01.getInstance(); Singleton01 instance2 = Singleton01.getInstance(); System.out.println(instance == instance2); // true System.out.println("instance

java知识点整理 - 2

落爺英雄遲暮 提交于 2019-12-06 12:53:27
1、抽象类能不能被实例化?为什么?    抽象类不能被实例化,因为抽象类和接口的设计就是来规定子类行为特征的,就是让其他类继承,是多态思想的一种设计体现。 2、抽象方法可以被private修饰吗?为什么   抽象方法不能被private修饰,因为抽象方法就是要子类继承重写,而private子类不可被重写 3、接口能不能有方法体   jdk8之前接口不能有方法体,jdk 8之后新增了static方法和default方法 4、集合   4.1 list和set的区别 list允许有多个null值,set只允许有一个null值 list允许有重复元素,set不允许有重复元素 list可以保证每个元素的存储顺序,set无法保证   4.2 那种集合可以实现自动排序   TreeSet集合实现了元素的自动排序   4.3 vector、ArrayList、linkedlist有什么区别?使用场景有什么区别?   区别: vector是java提供的动态数组,使用synchronized来保证线程安全,如果非线程安全需要,不建议使用。、 ArrayList是最常用的动态数组,本身并不是线程安全 linkedlist是双向链表集合,非线程安全   使用场景: vector和ArrayList的内部结构是以数组形式存储的,因此非常适合随机访问,但非尾部的删除或新增性能较差

从JVM内存模型谈线程安全

牧云@^-^@ 提交于 2019-12-06 12:14:27
作为一个三个多月没有去工作的独立开发者而言,今天去小米面试了一把.怎么说呢,无论你水平如何,请确保在面试之前要做准备,就像其中一位面试官说的一样,我知道你水平不错,但是无论如何也是要准备下的,不然你怎么会连这个方法也忘记了? 此刻,我突然觉得我是一个假程序员.为什么这么说呢,作为一个从12年就开始写代码的程序员来说,忘记某个方法太可耻了.等赶明写一篇文章就叫做"我是个假程序员"来谈谈这些有趣的事儿. 话不多说,今天要谈的主题是相对较深,较广,但我努力的让他看起来清晰明了. 存储器层次结构 对于开发者来说,存储器的层次结构应该是非常熟悉的,大体如下: 这里写图片描述 其中寄存器,L1,L2,L3都被封装在CPU芯片中,作为应用开发者而言我们很少去注意和使用它.之所以引入L1,L2,L3高速寄存器,其根本是为了解决访问运算器和内存速度不匹配.但缓存的引入也带来两个问题: 缓存命中率:缓存的数据都是主存中数据的备份,如果指令所需要的数据恰好在缓存中,我们就说缓存命中,反之,需要从主存中获取.一个好的缓存策略应该尽可能的提高命中率,如何提高却是一件非常困难的事情. 缓存一致性问题:我们知道缓存是主存数据的备份,但每个核心都有自己的缓存,当缓存中的数据和内存中的数据不一致时,应该以谁的数据为准呢,这就是所谓缓存一致性问题. 上面只是展示存储器的层次结构

java基础

早过忘川 提交于 2019-12-06 10:45:19
浅谈对String,StringBuilder,StringBuffer的认识 String类是final修饰的类,final修饰的类不能够被继承。String类是字符串类,常常被用来进行字符串的操作,但是String的值是不可变的,这就导致每次对String的操作都会产生新的对象,效率低下,而且浪费了大量的内存空间。 由于对字符串的操作产生了大量的对象,浪费空间,为了解决这种状况StringBuilder应运而生,StringBuilder是可变字符串,能够解决字符串操作浪费空间的问题,并且不产生新的对象。但是StringBuilder线程不安全。 为了解决线程安全的问题StringBuffer应运而生,StringBuffer之所有线程安全是因为StringBuffer几乎所有的方法都加入了Synchronized,但是正是因为加入了Synchronized同步锁,使得速度速度变慢,而StringBuilder没有同步锁,所以它的访问速度要比StringBuffer快。 String:使用与少量字符串操作的情况,大量的操作浪费空间,效率低下。 StringBuilder:使用与单线程下在字符缓冲进行大量的操作的情况,它是线程不安全的。 StringBuffer:使用多线程下在字符缓冲区进行大量的操作的情况,它是线程安全的 来源: https://www.cnblogs.com

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

百般思念 提交于 2019-12-06 08:48:11
iOS多线程:『NSOperation、NSOperationQueue』详尽总结 转载: 原地址https://www.jianshu.com/p/4b1d77054b35 本文首发于我的个人博客: 『不羁阁』 文章链接: 传送门 本文更新时间:2018年03月06日17:27:55 笔者对之前写的原文重新整理,修改了部分内容,又增加了许多关于 NSOperation、NSOperationQueue 的知识及用法,希望大家喜欢。 本文用来介绍 iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。 通过本文,您将了解到: NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperation 操作依赖和优先级、线程间的通信、线程同步和线程安全,以及 NSOperation、NSOperationQueue 常用属性和方法归纳。 文中 Demo 我已放在了 Github 上,Demo 链接: 传送门 1. NSOperation、NSOperationQueue 简介 NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装

不管你年底换不换工作,了解下单例模式

只谈情不闲聊 提交于 2019-12-06 07:07:41
1. 单例模式 什么是单例模式?简言之就是确保定义为单例模式的类在程序中有且只有一个实例。单例模式的特点: 只有一个实例 (只能有一个对象被创建) 自我实例化(类构造器私有) 对外提供获取实例的静态方法 2.单例模式的实现 常见的单例模式实现方式有五种: 2.1. 懒汉式 懒汉式(一般也称之为 饱汉式),具体代码实现如下: public class Singleton { /** * 自我实例化 */ private static Singleton singleton; /** * 构造方法私有 */ private Singleton() { System.out.println("创建单例实例..."); } /** * 对外提供获取实例的静态方法 */ public static Singleton getInstance() { if (null == singleton) { singleton = new Singleton(); } return singleton; } } 从代码实现中可以看到,实例并不是在一开始就是初始化的,而是在调用 **getInstance()**方法后才会产生单例,这种模式延迟初始化实例,但它并非是线程安全的。 public class SingleTonTest { /** * 多线程模式下测试懒汉模式是否线程安全 * *

PHP版本VC6与VC9、Thread Safe与None-Thread Safe等的区别

余生颓废 提交于 2019-12-06 06:31:12
转载一篇 最近发现很多PHP程序员对PHP版本知识了解不是很清楚,自己也看了不少类似的文章,还是感觉不够明确和全面,网上的结论又都是模棱两可,在此,给出最完整甚至武断的解释。 本文讲解:VC6与VC9,Thread Safety与None-Thread Safe,Apache module与fastcgi的区别与选择。 PHP的大版本主要分三支:PHP4/PHP5/PHP6   其中,PHP4由于太古老、对OO支持不力已基本被淘汰,请无视PHP4。   PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,很多功能已在PHP5.3.3上实现,所以也不详述,请无视PHP6。   PHP5的版本主要分四支:PHP5.2之前的版本、PHP5.2.X、PHP5.3和日前发布的PHP5.4。 那我们应该如何选择适用自己项目的版本呢? PHP5.2之前的版本不值得考虑,因为某些功能缺陷或者BUG,PHP5.2之前的版本。PHP5.4还处于Beta试用的版本号,非稳定版本,请无视PHP5.4。   主流PHP程序对PHP5.2.X的兼容性最好,而每次版本号的升级带来的都是安全性和稳定性的改善,所以宜挑选最新的版本。目前PHP5.2系列最新的是PHP5.2.17。   而如果产品是自己开发自己使用,PHP5.3在某些方面更具优势,在稳定性上更胜一筹,增加了很多PHP5.2所不具有的功能

并发容器之ConcurrentHashMap(JDK 1.8版本)

本秂侑毒 提交于 2019-12-06 05:27:57
1.ConcurrentHashmap简介 在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronized进行线程安全的控制,可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。另外一种方式通过Collections的 Map<K,V> synchronizedMap(Map<K,V> m) 将hashmap包装成一个线程安全的map。比如SynchronzedMap的put方法源码为: public V put(K key, V value) { synchronized (mutex) {return m.put(key, value);} } 实际上SynchronizedMap实现依然是采用synchronized独占式锁进行线程安全的并发控制的。同样,这种方案的性能也是令人不太满意的。针对这种境况,Doug Lea大师不遗余力的为我们创造了一些线程安全的并发容器,让每一个java开发人员倍感幸福。相对于hashmap来说,ConcurrentHashMap就是线程安全的map,其中利用了锁分段的思想提高了并发度。 ConcurrentHashMap在JDK1

实现单例模式的 五种 方式

元气小坏坏 提交于 2019-12-06 04:58:17
1、饿汉式 在类加载的时候完成 类的初始化。     1.1 静态代码块 获取 对象     1.2 直接 new 一个对象 结论 可以用 可能会造成 内存的 浪费 (这个类 可能会被别的方式 初始化 比如 子类 被初始化 通过反射,或者调用 这个类的静态方法) 2、懒汉式     在使用 获取对象的方法时返回一个对象。线程不安全。 开发时不用     在使用 获取对象的方法时可以加个同步的 synchronized 解决线程安全 问题 效率太低 不使用。 3、双重锁模式     判断 对象是不是空 是空的化 进入一个同步方法 方法里面 由判断了下 对象 是空就 new 对象 是推荐使用的。解决线程安全问题 和 实现懒加载。 4、静态内部类的方式     推荐使用 外部类加载的时候内部类不一定加载 只有在使用到内部类的时候才加载 jvm加载类 是线程安全的。解决线程安全问题,和实现懒加载。 5、枚举类的方式获取对象     推荐使用 解决线程安全问题 代码如下 public enum Singleton {   INSTANCE;   public void sayHello(){     System.out.println("ok");   } } public class Test {   public static void main(String[] args) {