并发编程CAS

首先搞明白什么是并发编程?

并发编程是指在一台机器上同时处理多个任务。并发是指在同一个实体上的多个事件。多个事件在同一时间间隔发生。

为什么需要并发编程(多线程编程)?

有很多耗时的工作,如上传下载文件、与客户聊天需要建立长时间连接等。这时,一个线程是满足不了的,会因资源独占产生过多的等待 ,因此需要多线程编程。

如果使用并发来编写程序,当一个任务阻塞时,程序中的其他任务还可以继续执行,因此这个任务还可以继续保持向前执行。

java的线程机制是抢占式的,这表示调度机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。线程可以驱动任务,定义任务要实现Runnable()接口并编写run()方法,使得改任务可以执行你的命令。

public class LiftOff implements Runnable{
    protected int countDown=10;
    private static int taskCount=0;
    private final int id=taskCount++;
    public LiftOff(){}
    public LiftOff(int countDown){
        this.countDown=countDown;
    }
    public String status(){
        return "#"+id+"("+(countDown>0? countDown:"LiftOff!")+")";//id可以区分任务的多个实例
    }
    public void run() {
        while(countDown-- >0){
            System.out.println(status());
            Thread.yield();//线程调度器
        }
    }
}

Executor管理Thread对象,在客户端和任务执行之间提供了一个间接层,将由这个对象执行任务而不是客户端执行任务,允许你管理异步任务的执行,无须显式地管理线程的生命周期。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPool {
    public static void main(String[] args) {
        ExecutorService exec=Executors.newCachedThreadPool();  //FixedThreadPool使用了有限的线程集来执行所提交的任务
        for(int i=0;i<5;i++){
            exec.execute(new LiftOff());

        }
        exec.shutdown();
    }
}

结果为:

#1(9)
#0(9)
#3(9)
#2(9)
#3(8)
#2(8)
#3(7)
#2(7)
#1(8)
#2(6)
#3(6)
#0(8)
#4(9)
#4(8)
#4(7)
#4(6)
#4(5)
#4(4)
#4(3)
#4(2)
#4(1)
#4(LiftOff!)
#0(7)
#3(5)
#3(4)
#3(3)
#3(2)
#3(1)
#2(5)
#1(7)
#1(6)
#1(5)
#1(4)
#1(3)
#1(2)
#1(1)
#1(LiftOff!)
#2(4)
#3(LiftOff!)
#0(6)
#0(5)
#0(4)
#0(3)
#0(2)
#0(1)
#0(LiftOff!)
#2(3)
#2(2)
#2(1)
#2(LiftOff!)
CachedThreadPool在程序执行过程中通常会创建与所需数量相同的线程,在它回收旧线程时停止创建新线程。
时间: 2024-10-06 02:19:28

并发编程CAS的相关文章

并发编程--CAS自旋锁

在前两篇博客中我们介绍了并发编程--volatile应用与原理和并发编程--synchronized的实现原理(二),接下来我们介绍一下CAS自旋锁相关的知识. 一.自旋锁提出的背景 由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的进程才能获取资源访问.即是每次只能有且只有一个进程能获取锁,才能进入自己的临界区,同一时间不能两个或两个以上进程进入临界区,当退出临界区时释放锁.设计互斥算法时总是会面临一种情况,即

Java并发编程-CAS

CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值 Unsafe用法: 作用,如果当前值和期望值相等,则将当前值更新为新的值X,并返回true 否则什么都不做,返回false return unsafe.compareAndSwapInt(this, stateOffset, expect, update);/** * Atomica

并发编程-CAS

CAS (compareAndSwap),中文叫比较交换,一种无锁原子算法. 过程是这样:它包含 3 个参数 CAS(V,E,N),V表示要更新变量的值,E表示预期值,N表示新值.仅当 V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做两个更新,则当前线程则什么都不做.最后,CAS 返回当前V的真实值.CAS 操作时抱着乐观的态度进行的,它总是认为自己可以成功完成操作. CAS是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值

基于CAS线程安全的计算方法 java并发编程的艺术上的一个案例

package thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /**  * @author  changxiangxiang  * @date 2014年8月6日 下午3:25:12  * @description  * @since  sprint2  */ public class Counter {     privat

Java并发编程:什么是CAS?这回总算知道了

无锁的思想 众所周知,Java中对并发控制的最常见方法就是锁,锁能保证同一时刻只能有一个线程访问临界区的资源,从而实现线程安全.然而,锁虽然有效,但采用的是一种悲观的策略.它假设每一次对临界区资源的访问都会发生冲突,当有一个线程访问资源,其他线程就必须等待,所以锁是会阻塞线程执行的. 当然,凡事都有两面,有悲观就会有乐观.而无锁就是一种乐观的策略,它假设线程对资源的访问是没有冲突的,同时所有的线程执行都不需要等待,可以持续执行.如果遇到冲突的话,就使用一种叫做CAS (比较交换) 的技术来鉴别线

并发编程的灵魂:CAS机制详解

Java中提供了很多原子操作类来保证共享变量操作的原子性.这些原子操作的底层原理都是使用了CAS机制.在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使用CAS机制. 其实Java并发框架的基石一共有两块,一块是本文介绍的CAS,另一块就是AQS,后续也会写文章介绍. 什么是CAS机制 CAS机制是一种数据更新的方式.在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

Java并发编程:volatile关键字解析(转)

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola

Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola