zoukankan      html  css  js  c++  java
  • volatile不能保证原子性

    1.看图自己体会

    2.体会不了就给你个小程序

    package cs.util;
    
    public class VolatileDemo {
       
    	private volatile int count =0;
    	
    	
    	public int getCount() {
    		return this.count;
    	}
    
    
    	public void setCount() {
    		try {
    			Thread.sleep(100);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		this.count++;
    	}
    
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		VolatileDemo demo=new VolatileDemo();
            for (int i = 0; i < 1000; i++) {
    			new Thread(new Runnable() {
    				
    				@Override
    				public void run() {
    					// TODO Auto-generated method stub
    					demo.setCount();
    				}
    			}).start();
    		}
            while(Thread.activeCount()>1)
            {
            	Thread.yield();
            }
            System.out.println(demo.getCount());
    	}
    
    }
    

      输出的结果是

    不等于1000其实也不怪,这是由于count++其实是有三个操作组成 1.从主存拿共享变量count  2.进行count++ 3.把count写进 内存

     本该为7的,最后却为6,少了1,道理知道了吧

    3.怎么解决没有出现1000的情况呢 很简单 有几种做法 

    一.可以加入 synchronized 

    public void setCount() {
    		try {
    			Thread.sleep(100);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
             //对count进行原子性操作 synchronized (this) { this.count++; } }

     二、使用jdk1.5推出的方法 具体修改如下

    	//定义一个Lock 
            private Lock lock=new ReentrantLock();
    	private volatile int count =0;
    	
    	public int getCount() {
    		return this.count;
    	}
    
    
    	public void setCount() {
    		try {
    			Thread.sleep(100);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
                    //加锁
    		lock.lock();
    		try {
    			this.count++;
    		} finally {
                    //解锁
    			lock.unlock();
    		}
    		
    		
    		
    	}        
    

      

     输出结果就都为

     赶紧试一试吧

    最后总结一下

  • 相关阅读:
    Iaas/paas/saas 三种模式分别都是做什么?
    sender e
    xshell
    JDK 和JRE区别
    mongodb高级聚合查询
    MongoDB 官方文档中的 aggregate 例子当中的 $sum: 1 , 这里的 1 起什么作用?
    MySQL 当记录不存在时插入,当记录存在时更新
    html中跳转方法(含设定时间)
    处理分页
    Js弹出层,弹出框代码
  • 原文地址:https://www.cnblogs.com/imfjj/p/6109876.html
Copyright © 2011-2022 走看看