线程的三大特性

1、 原子性


原子性指的就是一个操作是不可中断,即使有多个线程执行,一个操作开始也不会受其他线程影响,即可以理解为线程的最小执行单元,不可被分割。当然这个最小执行单元可以只是一个操作也可以是一段代码。在线程中实现原子性的操作可以为 synchronized修饰或通过lock( ReenTrantLock)实现
下面见示例:
在这里插入图片描述
通过for循环创建10个线程,并对count进行自加,我们想的到的结果应该为10000,但是程序跑出的结果是变化的结果,结果是<=10000的
在这里插入图片描述
原因是:count++这个操作其实是分为了三步的
1) 读取count的值;
2) 计算count++;
3) 写回计算后的count的值
故此操作实际为三步,10个线程并行操作无法保证步骤的原子性即可能会发生count值覆盖操作。
下面通过synchronized关键字进行修饰,其实就是添加同步锁,使之同一时刻只有一个线程在执行这部分代码
在这里插入图片描述

2、可见性


可见性指的就是当某个线程修改了其内存中共享变量的值时,其他线程能立刻感知到其值的变化,这既是可见性,对于串行线程来说,这个可见性现象是不存在的。下面通过例子来说明下变量的可见性现象:
在这里插入图片描述
通过创建两个线程,两个线程中共用一个成员变量,线程2对flag状态进行变更,发现线程1未嗅探到flag状态的变更,在线程1的flag状态还是false,示例图如下:
在这里插入图片描述
通过 volatile关键字、 synchronized或通过lock( ReenTrantLock)实现均可实现变量的可见性,但其原理是不一样的,volatile是通过内存屏障实现,而其他两个是通过加锁保证了同一时刻只有一个线程访问资源,即是串行操作。
在这里插入图片描述
在这里插入图片描述

3、有序性


有序性即是程序按一定规则进行顺序的执行,期间会进行编译器优化重排、指令重排、内存重排等,执行规则遵循as-if-serial语义规则和happens-before 原则,其中
1) as-if-serial语义规则:即是不管怎么重排,最后的执行结果是不能改变的;
2) happens-before规则:
●程序顺序原则,即在一个线程内必须保证语义串行性,也就是说按照代码顺序执行。
●锁规则 解锁(unlock)操作必然发生在后续的同一个锁的加锁(lock)之前,也就是说,如果对于一个锁解锁后,再加锁,那么加锁的动作必须在解锁动作之后(同一个锁)。
●volatile规则 volatile变量的写,先发生于读,这保证了volatile变量的可见性,简单的理解就是,volatile变量在每次被线程访问时,都强迫从主内存中读该变量的值,而当该变量发生变化时,又会强迫将最新的值刷新到主内存,任何时刻,不同的线程总是能够看到该变量的最新值。
●线程启动规则 线程的start()方法先于它的每一个动作,即如果线程A在执行线程B的start方法之前修改了共享变量的值,那么当线程B执行start方法时,线程A对共享变量的修改对线程B可见
●传递性 A先于B ,B先于C 那么A必然先于C
●线程终止规则 线程的所有操作先于线程的终结,Thread.join()方法的作用是等待当前执行的线程终止。假设在线程B终止之前,修改了共享变量,线程A从线程B的join方法成功返回后,线程B对共享变量的修改将对线程A可见。
●线程中断规则 对线程 interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测线程是否中断。
●对象终结规则对象的构造函数执行,结束先于finalize()方法
在满足上面规则的基础上,会做相应的重排优化,针对于多线程,可能会出现结果不一致的情况,这时候可通过volatile禁止相应代码的指令重排, volatile的原理即是通过 内存屏障(一是保证特定程序的执行顺序;二是强制刷出cpu缓存数据,实现数据的可见性)实现禁止指令重排。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值