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(内存地址,期望值,新数据)失败)
    
  • 相关阅读:
    Json 操作
    visual studio 单元测试的认识
    EntityFramework 贪婪加载与延迟加载以及资源回收
    idea 查看源码
    idea技巧快速生成构造函数 get set
    Spring Boot Jpa框架自定义查询语句返回自定义实体
    启动redis
    查找nginx安装目录并启动
    idea技巧 --查找当前方法都被哪些类引用
    第一个webapi及swagger
  • 原文地址:https://www.cnblogs.com/mozq/p/12031631.html
Copyright © 2011-2022 走看看