可见性

可见性
	一个线程对共享变量的修改 能够被其他线程看到
	共享数据的访问权限都必须定义为private
——————————————————————————————————————

			---工作内存1(拷贝x的副本)--线程1
主内存(共享变量x存放)
			---工作内存2(拷贝x的副本)--线程2
——————————————————————————————————————

synchronize实现可见性、原子性(同步)
	获得互斥锁 
	清空工作内存 
	从主内存拷贝最新副本到工作内存
	执行代码
	将更改后的共享变量刷新到主内存
	释放互斥锁
	
	减少synchronize的粒度(控制范围越小越好)可提高线程安全的性能

volatile实现可见性 不保证原子性(如n++不是原子操作)
	变量每次被线程访问时,都被迫从主内存中读取最新的值,变量发生变化,强迫线程将改后的值
	刷新到主内存

		while(Thread.activeCount()>1) {
			Thread.yield();
		}//主线程等待其他线程执行完再执行

ReentrantLock用法(保证自增操作的原子性)也可使用AtomicInterger
private Lock lock=ReentrantLock();
	public  void addA() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		synchronized(this) {
//			this.a++;
//		}
		lock.lock();
		
		try {
			this.a++;
		} finally {
			lock.unlock();
		}
		
	}


volatile不需要加锁,不会阻塞线程

final也可以保证内存可见性(修饰的变量一旦赋值不可更改)

  

转载于:https://www.cnblogs.com/qinyios/p/11124460.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值