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

  

 输出结果就都为

 赶紧试一试吧

最后总结一下

原文地址:https://www.cnblogs.com/imfjj/p/6109876.html