zoukankan      html  css  js  c++  java
  • 可见性

    可见性
    	一个线程对共享变量的修改 能够被其他线程看到
    	共享数据的访问权限都必须定义为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也可以保证内存可见性(修饰的变量一旦赋值不可更改)
    

      

  • 相关阅读:
    测试方案
    如何编写一个好的测试计划
    一个好的测试过程
    java后台生成echarts图表并保存图片
    Javascript数组排序,并获取排序后位置对应的原索引(堆排序实现)
    修改tomcat编码方式
    json序列化反序列化后function丢失
    Mysql数据库存取性能优化
    java创建文件
    Java POI导出ppt简单实现
  • 原文地址:https://www.cnblogs.com/qinyios/p/11124460.html
Copyright © 2011-2022 走看看