zoukankan      html  css  js  c++  java
  • volatile 对于n=n+1,无效

    1.volatile 针对b=b+1 不是原子操作的

      理论上来说结果等于1000,实际上很多时候小于1000

    package com.sun.util;
    class A {
        volatile int b=0;
    
           void add(int n){
            for (int i = 0; i < n; i++) {
                b+=1;
            }
        }
       
    }
    public class VolatileTest {
        
    
        public static void main(String[] args) {
            A aaa = new A();
            Thread[] t=new Thread[100];
            for (int i = 0; i < t.length; i++) {
                final int x=10;
                t[i]=new Thread(()->aaa.add(10));
            }
            for (int i = 0; i < t.length; i++) {
                t[i].start();
            }
            for (int i = 0; i < t.length; i++) {
                try {
                    t[i].join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println(aaa.b);
    
    
        }
    }

    2.用synchronized

    package com.sun.util;
    class A {
        volatile int b=0;
    
        void add(int n){
            for (int i = 0; i < n; i++) {
    //            b+=1;
                inc();
            }
        }
        synchronized void inc(){
            b=b+1;
        }
    
       
        
    
    }
    public class VolatileTest {
        
    
        public static void main(String[] args) {
            A aaa = new A();
            Thread[] t=new Thread[100];
            for (int i = 0; i < t.length; i++) {
                final int x=i+1;
                t[i]=new Thread(()->aaa.add(x));
            }
            for (int i = 0; i < t.length; i++) {
                t[i].start();
            }
            for (int i = 0; i < t.length; i++) {
                try {
                    t[i].join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println(aaa.b);
    
    
    
        }
    }

    或者

    package com.sun.util;
    class A {
        volatile int b=0;
    
        synchronized void add(int n){
            for (int i = 0; i < n; i++) {
                b+=1;
    //            inc();
            }
        }
    //    synchronized void inc(){
    //        b=b+1;
    //    }
    
       
        
    
    }
    public class VolatileTest {
        
    
        public static void main(String[] args) {
            A aaa = new A();
            Thread[] t=new Thread[100];
            for (int i = 0; i < t.length; i++) {
                final int x=i+1;
                t[i]=new Thread(()->aaa.add(x));
            }
            for (int i = 0; i < t.length; i++) {
                t[i].start();
            }
            for (int i = 0; i < t.length; i++) {
                try {
                    t[i].join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println(aaa.b);
    
        }
    }
  • 相关阅读:
    临时表各方式对比
    【译】表变量和临时表的比较(转)
    delete和truncate的一个严重区别
    各种临时表插入数据方式对比(包括自增列和GUID列)
    纤程模式的问题
    转 javascript针对DOM的应用(四)
    转 CSS兼容性(IE和Firefox)技巧大全 (四)
    转 CSS兼容性(IE和Firefox)技巧大全 (五)
    转 javascript针对DOM的应用(三)
    javascript基础知识大全(1)
  • 原文地址:https://www.cnblogs.com/sunupo/p/13496894.html
Copyright © 2011-2022 走看看