线程执行的几种特性(共享性、互斥性、原子性、可见性、有序性)

一、共享性

多个线程共享同一块内存,会引起线程安全问题。

例如变量A同时被Thread1和Thread2访问,可能发生Thread1和Thread2读取的变量A不是同一个值,大多数情况下Thread1和Thread2不会恰好同一个时间读取变量A,而变量A在这段时间差中可能已被修改。

二、互斥性

对同一个资源来讲,同一个时间只能有一个线程访问。解决了多个线程读取的资源不一致的情况,但是写操作要注意覆盖的问题。

三、原子性

对资源的操作一个完整的过程。不会再执行过程停下再做别的操作。所谓原子性指的是jvm实际执行中而非代码层面。

例如:i++不是原子性操作。

例如:ClassA  classA = new ClassA()。

使用synchronized可以保证原子性和互斥性。

四、可见性

针对共享变量而言,多个线程分别读取同一个共享变量时,将变量值写入独立的内存副本中,在未来的不确定时间与主内存同步,这将导致不同的线程对变量做了修改,而互相之间却不可见。

volatile关键字可以实现共享变量的可见。

五、有序性

可理解为程序是否按照代码编写的顺执行。

关于有序性从线程内和多个线程间两个角度考虑。

线程内时,程序看似是按照代码的编写顺序执行的,实际上不同的jvm都会对程序有不同程度的优化,指令具体的执行都是经过重新排序的。

线程间时,任何代码任何时间都有可能交叉执行。除非使用volatile、synchronized或者lock对程序进行控制。

总的来讲,程序串行执行肯定是因为使用了同步、互斥操作,要么就是纯属巧合。

原文地址:https://www.cnblogs.com/perfumeBear/p/11803504.html

时间: 2024-11-17 04:18:42

线程执行的几种特性(共享性、互斥性、原子性、可见性、有序性)的相关文章

java-多线程深入(二)互斥性和可见性

(一)互斥性 互斥性,即原子性.原子,指最小的物质,具体不可再分性. CPU运算中,对多线程进行时间片分割执行,一个程序块执行时不可分割,即满足互斥性原子性. java中保证互斥性的方法: 1.用sychronized锁住程序块,实行互斥 synchronized (lock) { a++; } 2.用Atomic对变量操作实行互斥 public final static AtomicInteger TEST_INTEGER = new AtomicInteger(1); public stat

线程的共享性、互斥性、原子性、可见性、有序性

参考链接:http://www.cnblogs.com/paddix/p/5374810.html 一.共享性 多个线程之间共享同一个变量,容易引发多线程安全问题.反之,如果每个数据都只是在自己的线程中使用,只属于某一个线程,那么这个数据则为安全的. 二.互斥性 资源互斥是指只允许一个访问者对其进行访问,具有唯一性和排他性.对于共享数据,如果我们只进行读数据,即使没有互斥性,我们也不需要担心其安全,但如果是写操作,则容易引起线程安全问题. 三.原子性 原子性是指对数据的操作是一个独立的.不可分割

linux线程间通信之条件变量和互斥量

一.条件变量定义 有的时候仅仅依靠锁住共享资源来使用它是不够的.有时候共享资源只有某些状态的时候才能够使用.比方说,某个线程如果要从堆栈中读取数据,那么如果栈中没有数据就必须等待数据被压栈.这种情况下的同步使用互斥锁是不够的.另一种同步的方式--条件变量,就可以使用在这种情况下.条件变量(Condition Variable)是线程间的一种同步机制,提供给两个线程协同完成任务的一种方法,使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止.条件变量的测试一般是用互斥量来保护的,用来确保每

iOS:延时执行的三种方式

延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObject (NSDelayedPerforming) ※延时调用在当前线程使用特定模式的方法(如果数组没有数据或者参数为nil,则不会调用selector中方法) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterD

【转】 Linux 线程同步的三种方法

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同步. 初始化锁.在Linux下,线程的互斥量数据类型是pthread_mutex_t.在使用前,要对它进行初始化.静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;动态分配:int pthread_mutex_init(pthread_m

C#线程同步的几种方法

我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线程去处理,然而,多线程不可避免地会带来一个问题,就是线程同步的问题.如果这个问题处理不好,我们就会得到一些非预期的结果. 在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的

归纳一下:C#线程同步的几种方法

转自原文 归纳一下:C#线程同步的几种方法 我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线程去处理,然而,多线程不可避免地会带来一个问题,就是线程同步的问题.如果这个问题处理不好,我们就会得到一些非预期的结果. 在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是

Linux下线程同步的几种方法

Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码.  1. 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr); 其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性. 互斥锁的属性在创建锁的时候指定,在LinuxThreads实

解决线程安全的三种方法

1:线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程的安全问题: 电影院要卖票,我们模拟电影院的卖票过程.假设要播放的电影是 “上海堡垒”,本次电影的座位共50个(只能卖50张票). 我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这50张票)需要窗口,采用线程对象来模拟:需要票,Runnable接口子类