可见性

可见性
	一个线程对共享变量的修改 能够被其他线程看到
	共享数据的访问权限都必须定义为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