1.6关于volatile 关键字的探讨

其实我是发现有矛盾的问题的。

多线程主要是 可见性、原子性的问题,volatile 主要是 解决了可见性的问题,原子性并未解决,所以仍是线程不安全的。

如果没有volatile 关键字,两个线程,左边线程从共享内存中获取x=1 ,将x给到自己的工作内存,修改后,写回共享内存,此时线程2是不知道的,获取的仍是x=1;

加了volatile ,则线程1 ,直接对共享内存的x操作,线程2是立刻知道的。


package com.caolh.middle;

import java.util.ArrayList;
import java.util.List;


public class DemoThread13{
	
	private List<String> list = new ArrayList<String>();
	private volatile boolean canGet = false;
	
	public void put(){
		for(int i=0;i<10;i++){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			list.add("A");
			System.out.println("线程"+Thread.currentThread().getName()+"添加第"+i+"个元素");
			if(i==5){
				//循环到第次则通知其他线程开始获取数据进行处理
				canGet = true;
				System.out.println("线程"+Thread.currentThread().getName()+"发出通知");
			}
		}
	}
	
	public void get(){
		while(true){
			if(canGet){
				for(String s:list){
					System.out.println("线程"+Thread.currentThread().getName()+"获取元素:"+s);
				}
				break;
			}
		}
	}
	
	public static void main(String[] args) {
		
		final DemoThread13 demo = new DemoThread13();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				demo.put();
			}
		},"t1").start();;
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				demo.get();
			}
		},"t2").start();
		
	}

	
}

不加volatile ,线程2 关闭不掉。但是我们一般 的多线程访问同一个变量,是可以立即可见的吧?这里程序一直停不掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值