zoukankan      html  css  js  c++  java
  • 原子类解决i++问题

    原子类解决i++问题

    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * 一个完整的i++,多线程并发安全问题演示。及使用java.util.concurrent.atomic.AtomicInteger解决方案。
     * @author jie
     *
     */
    public class Counter {
    	public static void main(String[] args) {
    		//定义并发线程数量
    		int threadCount = 10;
    		Thread[] t = new Thread[threadCount];
    		
    		//开启多个线程进行计数
    		for(int i = 0; i < t.length; i++) {
    			t[i] = new Thread(new Runnable() {
    				public void run() {
    					for(int j = 0; j < 10000; j++) {
    						AtomicCount.increment();//1
    						//Count.increment();//2
    					}
    				}
    			});
    			t[i].start();
    		}
    		
    		//等待所有线程结束,打印最终的结果
    		for(int i = 0; i < t.length; i++) {
    			try {
    				t[i].join();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		System.out.println(AtomicCount.i);//1
    		//System.out.println(Count.i);//2
    	}
    }
    
    class AtomicCount{
    	public static AtomicInteger i = new AtomicInteger(0);
    	
    	public static void increment() {
    			i.addAndGet(1);
    	}
    }
    
    //普通的类,无法保证线程安全。
    class Count{
    	public static int i = 0;
    	
    	public static void increment() {
    			i++;
    	}
    }
    

    原子类实现方式CAS

    CAS
    	什么是CAS?
    	比较并交换。一种原子性操作。3个操作数,内存地址,期望值,新值。
    	比较内存地址值和期望值是否一致,一致则表示期望值确实是最新的内存值,
    	基于期望值得到的新值是有效的,将内存值改为新值,操作成功。否则失败。
    	
    	do{
    		1.获取内存值,做为期望值
    		2.基于内存值进行操作,得到新数据
    	}while(CAS(内存地址,期望值,新数据)失败)
    
  • 相关阅读:
    Ubuntu 18.04.4 系统优化
    Ubuntu 18.04.4 LTS 更换国内系统源
    django 数据库迁移
    django2.0解决跨域问题
    python requests get请求传参
    python 常用排序方法
    python 电脑说话
    centos6.x配置虚拟主机名及域名hosts
    php 合并,拆分,追加,查找,删除数组教程
    PHP统计在线用户数量
  • 原文地址:https://www.cnblogs.com/mozq/p/12031631.html
Copyright © 2011-2022 走看看