zoukankan      html  css  js  c++  java
  • 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++却不是原子操作。

  • 相关阅读:
    System.Web.Mvc.HttpHeadAttribute.cs
    System.Web.Mvc.HttpOptionsAttribute.cs
    System.Web.Mvc.HttpDeleteAttribute.cs
    sqlite-dbeaver-heidisql
    java实现圆周率
    java实现圆周率
    java实现圆周率
    java实现圆周率
    java实现圆周率
    java实现最近距离
  • 原文地址:https://www.cnblogs.com/heben/p/5746610.html
Copyright © 2011-2022 走看看