走入并行世界
来源:互联网 发布:mac真三国无双5修改器 编辑:程序博客网 时间:2024/04/30 12:08
并发偏重于多个任务交替执行,多个任务之间可能串行,并行是真正意义上的同时执行,真实的并行只能出现在多核CPU,因为一个cpu只能执行一个任务
无障碍
无障碍是一种最弱的非阻塞调度,对于无障碍的线程来说,一但检测到一起修改共享数据,就会立即对自己所做的修改进行回滚,确保数据安全,没有数据竞争,线程顺利完成自己的工作,走出临界区。任何对资源有修改操作的线程,在修改数据前,都需要更新这个一致性标记,线程在操作之前,先读取并保存一致性标记,在操作完成后,再次读取,检查这个标记是否被更改过,俩者一致,说明资源访问没有问题,不一致,说明资源可能在操作过程中与其他写线程冲突,需要重试
无锁
无锁的并行都是无障碍的,无锁的时候,所有的线程都能尝试对临界区进行访问,但无锁的并发保证必然有一个线程能够在有限步内完成操作并离开临界区
可能包含无穷循环,循环中,线程会不断尝试修改共享变量,没有冲突,修改成功,程序退出,否则继续尝试修改
while(!atomicVal.compareAndSet(localVal,localVal+1){localVal = atomicVal.get();}
无等待
要求所有的线程都必须在有限步内完成
原子性
原子性指一个操作是不可中断的,即时是在多个线程一起执行的时候,一个操作一但开始,就不会被其他线程干扰
对于32位系统,long型读写不是原子性的,因为long有64位
public class MultiTherdLong {public static long t=0;public static class ChangeT implements Runnable{private long to;public ChangeT(long to){this.to = to;}@Overridepublic void run() {while(true){MultiTherdLong.t = to;//yield方法,只是人为的通知系统,进行切换, 且有一定机率能切换回本身Thread.yield();}}}public static class ReadT implements Runnable{@Overridepublic void run() {while(true){long tmp=MultiTherdLong.t;if(tmp!=111L&&tmp!=-999L && tmp!=333L && tmp!=-444L){System.out.println(tmp);}Thread.yield();}}}public static void main(String[] args) {new Thread(new ChangeT(111L)).start();new Thread(new ChangeT(-999L)).start();new Thread(new ChangeT(333L)).start();new Thread(new ChangeT(-444L)).start();new Thread(new ReadT()).start();}}
32位系统long不是原子性的,多线程之间相互干扰
可见性
可见性指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改
串行可见性问题不会出现,因为任何一个操作步骤中修改某个变量,后续的步骤中,读取这个变量的值,一定是修改后的新值,
并行会出现可见性问题
有序性
volatile变量的写,先发生于读,保证volatile变量的可见性
阅读全文
0 0
- 走入并行世界
- 第一章 走入并行世界
- 走入并行世界 读书笔记
- 走入IBM小型机世界
- 走入ios的世界
- 走入PHP的世界
- 走入jquery的世界
- 走入“地图定位、导航”开发的世界
- 走进并行世界
- AJAX的革命性框架,带大家走入ZK的世界
- PD(problem detection 经验谈--摘自走入小型IBM世界)
- 走入C++程序世界-------第一个C++程序
- 今天“农村打工仔”带你们走入Android的世界
- 初学cocoa开发:带你走入不一样的世界
- 初学cocoa开发:带你走入不一样的世界
- 带你一步步走入Paxos的世界 -- 序列1
- 带你一步步走入Paxos的世界 -- 序列2
- 带你一步步走入Paxos的世界 -- 序列1
- cc2541工程代码,main函数初始化讲解
- 常见的排序算法与MSQL
- CSS中外联link属性、内嵌style元素、@import指令、内联style属性、注释
- 面向对象 方法的调用 汽车速度加减
- opencv3学习之绘图基础
- 走入并行世界
- PHP之PDO操作mysql数据库
- 快速幂1002
- Android检测程序崩溃框架CustomActivityOnCrash
- 超分辨率重建最新算法总结
- mybatis 批量增加 报异常 Parameter '__frch_item_0' not found. Available parameters are [list]
- apicloud使用api.execScript在frame与win中传值
- ubuntu install jdk
- 【树状数组--二维】poj 2029 Get Many Persimmon Trees