• 可见性


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

      

  • 相关阅读:
    HDU 5842 Lweb and String 【乱搞】
    POJ 2342 Anniversary party 【树形DP】
    [ZJOI2008]树的统计Count 【树链剖分】
    UVA 136 & POJ1338 Ugly Numbers
    ccf 201803-2
    ccf 201809-5
    ccf 201809-4
    ccf 201809-2
    ccf 201809-1
    最小费用可行流
  • 原文地址:https://www.cnblogs.com/qinyios/p/11124460.html
Copyright © 2020-2023  润新知