线程安全

Java并发核心知识教程

狂风中的少年 提交于 2019-11-30 21:45:42
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。 一、共享性 数据共享性是线程安全的主要原因之一。如果所有的数据只是在线程内有效,那就不存在线程安全性问题,这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。但是,在多线程编程中,数据共享是不可避免的。最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据,即使是在主从的情况下,访问的也同一份数据,主从只是为了访问的效率和数据安全,而对同一份数据做的副本 二、原子性 原子性就是指对数据的操作是一个独立的、不可分割的整体。换句话说,就是一次操作,是一个连续不可中断的过程,数据不会执行的一半的时候被其他线程所修改。保证原子性的最简单方式是操作系统指令,就是说如果一次操作对应一条操作系统指令,这样肯定可以能保证原子性。但是很多操作不能通过一条指令就完成。 三、互斥性 资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。 四、有序性

智能指针是否线程安全

不问归期 提交于 2019-11-30 19:36:46
1.9 再论shared_ptr 的线程安全 虽然我们借shared_ptr 来实现线程安全的对象释放,但是shared_ptr 本身不是100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr 有两个数据成员,读写操作不能原子化。根据文档11,shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即: 一个shared_ptr 对象实体可被多个线程同时读取; 两个shared_ptr 对象实体可以被两个线程同时写入,“析构”算写操作; 如果要从多个线程读写同一个shared_ptr 对象,那么需要加锁。 请注意,以上是shared_ptr 对象本身的线程安全级别,不是它管理的对象的线程安全级别。 要在多个线程中同时访问同一个shared_ptr,正确的做法是用mutex 保护: MutexLock mutex; // No need for ReaderWriterLock shared_ptr < Foo > globalPtr; // 我们的任务是把globalPtr 安全地传给doit() void doit(const shared_ptr < Foo >& pFoo); globalPtr 能被多个线程看到,那么它的读写需要加锁。注意我们不必用读写锁,而只用最简单的互斥锁,这是为了性能考虑

夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

妖精的绣舞 提交于 2019-11-30 19:00:19
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进程所创建的对象资源(内存资源)。java.lang.Thread对象负责统计和控制这种行为。 每个程序都至少拥有一个线程-即作为Java虚拟机(JVM)启动参数运行在主类main方法的线程。在Java虚拟机初始化过程中也可能启动其他的后台线程。这种线程的数目和种类因JVM的实现而异。然而所有用户级线程都是显式被构造并在主线程或者是其他用户线程中被启动。 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前,首先让我们来了解下在操作系统中进程和线程的区别:   进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)   线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

安装xampp扩展你要注意这些

∥☆過路亽.° 提交于 2019-11-30 16:39:15
Windows下安装PHP扩展是一件很麻烦的事情,看一个xampp扩展的附件名一般都是这样的命名规则,如:xampp_http-5.3-nts-svn20091125-vc9-x86.zip 你要了解如下信息: (1)知道你PHP编译器类型 VC6:legacy Visual Studio 6 compiler,是使用这个编译器编译的。 VC9:Visual Studio 2008 compiler,就是这个编译器编译的。 (2)不同线程安全设定 TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查 NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查 官方并不建议你将Non Thread Safe 应用于生产环境,所以我们选择Thread Safe 版本的PHP来使用。 (3) 当前xampp的版本,通过PHPinfo可以查看 (4)需要知道你PHP扩展【xampp Extension Build】的版本,通过phpinfo可以查看 转载请注明: XAMPP中文组官网 » 安装xampp扩展你要注意这些 PHP---XAMPP 环境安装扩展redis 转自: https://www.jianshu.com/p/095a61ebda3b PHP Version 7.3.9 Compiler MSVC15

面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的

和自甴很熟 提交于 2019-11-30 14:49:51
为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。 那说说JDK1.7中Segment的原理 刚刚说的一段一段就是指Segment,它继承了ReentrantLock,具备锁和释放锁的功能。ConcurrentHashMap只有16个Segment,并且不会扩容,最多可以支持16个线程并发写。 JDK1.8的ConcurrentHashMap怎么实现线程安全的 JDK1.8放弃了锁分段的做法,采用CAS和synchronized方式处理并发。以put操作为例,CAS方式确定key的数组下标,synchronized保证链表节点的同步效果。 JDK1.8的做法有什么好处呢 减少内存开销 假设使用可重入锁,那么每个节点都需要继承AQS,但并不是每个节点都需要同步支持,只有链表的头节点(红黑树的根节点)需要同步,这无疑消耗巨大内存。 获得JVM的支持 可重入锁毕竟是API级别的,后续的性能优化空间很小。synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等

进程和线程,线程安全,python如何实现多进程,多线程

梦想与她 提交于 2019-11-30 13:32:16
进程和线程的区别 进程是对运行时程序的封装,是系统资源调度和分配的基本单位 线程是进程的子任务,cpu调度和分配的基本单位,实现进程内并发。 一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存 什么是线程安全 一个线程的修改被另一个线程的修改覆盖掉。 python中哪些操作是线程安全的 一个操作可以在多线程环境中使用,并且获得正确的结果。 线程安全的操作线程是顺序执行的而不是并发执行的。 一般涉及到写操作需要考虑如何让多个线程安全访问数据。 线程同步的方式 互斥量(锁): 通过互斥机制防止多个线程同时访问公共资源。 信号量(Semphare): 控制同一时刻多个线程访问同一个资源的线程数。 ps:python的threading 文档 事件(信号): 通过通知的方式保持多个线程的同步。 进程间的通信方式 (IPC:Inter-Process Communication 进程间传递信号或者数据) 管道/匿名管道/有名管道(pipe) 信号(Signal):比如用户使用ctrl+c产生SIGINT程序终止信号 消息队列(Message) 共享内存(share memory) 进程间的信号量(Semaphore) 套接字(socket):最常用的方式,我们的web应用就是这种方式 多线程的例子 # python实现多线程 import threading lock =

String数据类型,StringBuffer以及 StringBuild

半城伤御伤魂 提交于 2019-11-30 12:22:37
2.1String String数据类型在JDK 中定义使用了final 关键字,也就是说一个String 对象一旦生成就无法改变存放在常量池中直到被GC,对String 变量重新赋值其实只是对变量的引用重新赋值,字符串内容并未改变,优点:极大的复用了相同的字符串不需要每次都去创建一个字符串对象。 2.2String 常量池 专门用来存储已经创建好的字符串常量(New的字符串存在于堆中) 常量池的位置:JDK1.6之前与方法区 JDK1.7在堆中 JDK1.8之后在元空间 2.3常见的API 1.length():字符串的长度 2.Indexof(String ch):字符串ch中第一次出现的下标位置,不包含则返回-1. 3.SubString():取子串:参数两种(int begin) (int begin,int end) 4.char charAt(int index) :根据位置index 取字符 5.boolean Contains(String str):字符串是否包含str这个串 6.boolean startwith(String str):是否以str开头 7.boolean endwith(String str):是否以str结尾 8.Char[] toCharArray() :将字符串转换为字符数组 9.String[] str=Str.split(",");

多线程(六)线程安全

人走茶凉 提交于 2019-11-30 12:22:26
线程安全 –在拥有共享数据的多条线程并行执行的程序中, 线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行, 不会出现数据污染等意外的情况 –可以选择使用synchronized来保证线程安全 线程安全与不安全的区别 –线程安全: –优点: 可靠 –缺点:执行速度慢 –使用建议:需要线程共享时使用 –线程不安全: – 优点: 速度快 – 缺点: 可能与预期不符合 –使用建议: 在线程内部使用, 无需线程间共享 线程不安全的类 – Vector 是线程安全的, ArrayList, LinkedList 是线程不安全的 –Vector中 addElement() 方法是用 synchronized 修饰的 –ArrayList等中的 add 是没有用 synchronized 修饰的 – Properties是线程安全的 , HashSet, TreeSet, HashMap 是不安全的 – StringBuffer 是线程安全的, StringBuilder 是线程不安全的 – HashTable 是线程安全的, HashMap 是线程不安全的 来源: https://blog.csdn.net/qq_32060101/article/details/101370064

volatile能否保住线程安全性

余生颓废 提交于 2019-11-30 11:57:29
volatile能否保住线程安全性? 今天有人问 volatile能否保住线程安全性问题。那答案是不能。 那咱们分析下 为什么不能保证安全性问题。 一、线程安全问题发生在读写方面,原子性操作可以保证线程安全。 二、volatile 关键字的作用是 1、可见性 2、禁止指令重排续。 volatile 只是保证了数据的可见性 没有保证数据的一致性。 在并发的情况下 一样会产生线程安全问题。 例如 两个线程同时取到 volatile修饰的变量a= 1 对该变量做++操作a++。 因为++操作不是原子性操作,在一个线程刚执行++操作时,cpu时间片切换到另一个线程上 那线程读取的数还是1,那还是进行++操作。这样就会产生多线程问题。 来源: https://blog.csdn.net/weixin_43992555/article/details/101346550

List、Set、Map详解及区别

自闭症网瘾萝莉.ら 提交于 2019-11-30 10:34:39
一、List接口 List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。 ArrayList ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量: private static final int DEFAULT_CAPACITY = 10; 随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。 size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。 ArrayList擅长于随机访问。同时ArrayList是非同步的。 LinkedList