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();
    		}
    		
    		
    		
    	}        
    

      

     输出结果就都为

     赶紧试一试吧

    最后总结一下

  • 相关阅读:
    图像,script,link 空地址带来的困惑
    localStorage变更事件当前页响应新解-awen
    opencv在ios上的开发教程
    torch-ios框架XCODE使用备忘
    重拾老本行_图像处理
    dialogic d300语音卡驱动重装后启动报错问题解决方法
    Winpcap构建用户级网桥
    winpcap usb山寨网卡识别
    最近这段时间
    银行IT入门深似海
  • 原文地址:https://www.cnblogs.com/imfjj/p/6109876.html
Copyright © 2011-2022 走看看