• JAVA 堆栈知识和Volatile关键字


    以下两个程序均不能达到预期效果(即num=100的期望)

    package com.test.thread;
    
    public class VolatileSample {
        private static int num=0;
        public static void main(String[] args) {
            
            for (int i = 0; i < 100; i++) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        num++;
                        
                    }
                }).start();
            }
            System.out.println("num: "+num);
        }
    }

    上面的程序无法总是得出正确的结果,是因为一个任务做出地修改,即使在不中断地意义上讲是原子性的,对其他任务也可能是不可视的(例如,修改只是暂时性地存储在本地处理器地缓存中),因此不同的任务对应用的状态有不同的视图。另一方面,同步机制强制在处理器系统中,一个任务做出的修改必须在应用中是可视的。如果没有同步机制,那么修改时可视将无法确定。

    public class Client {
        private static volatile int num = 0;
        public static void main(String[] args) {
    
            for (int i = 0; i < 100; i++) {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        num++;
    
                    }
                }).start();
            }
            System.out.println("num: " + num);
        }
    }

    上面的程序中,num虽然对各个线程具有可视性,但是num++却不是原子操作。

  • 相关阅读:
    DrawerLayout Demo
    解析没有key的Json
    Actionbar Demo
    Fragment 创建及替换
    Android 图片在SD卡及包下的存储
    获取SD卡下Android/data/下文件
    判断软键盘的弹出
    Volley
    HttpClient Post请求
    Git .gitignore 设置为全局global
  • 原文地址:https://www.cnblogs.com/heben/p/5746610.html
Copyright © 2020-2023  润新知