• 可见性


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

      

  • 相关阅读:
    微信小程序知识点梳理
    Vue基础知识梳理
    JQuery总结
    JS实现简单斗地主效果
    JS应用猜数游戏
    JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
    JS数组的基本操作方法
    JS,ATM代码
    简单理解Vue中的nextTick
    Vue keep-alive实践总结
  • 原文地址:https://www.cnblogs.com/qinyios/p/11124460.html
Copyright © 2020-2023  润新知