走入并行世界

来源:互联网 发布: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变量的可见性

原创粉丝点击