关于线程的i++采用volatile标签是否安全的验证

以下写法是错误的

import java.sql.Time;
import java.util.concurrent.TimeUnit;

public class SynLock {
    public static  volatile int i=0;

    public static int geti(){
        //有可能第二个线程在第一个线程取出旧的值和插入新的值期间会读取这个值
        //导致两个线程读取到了相同值,最后出现重复值
        return i++;
    }

    public static void main(String[] args) throws InterruptedException{
       while (true){
           Thread thread=new Thread(()->{
               System.out.println(SynLock.geti());;
           });
           thread.start();
       }
    }
}

以下为验证存在风险的结果,我将结果存入文件后以读取的形式验证是否有重复列

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class CheckSaftyFailer {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        InputStreamReader in=new InputStreamReader(new FileInputStream("F:\\comysp\\src\\main\\java\\data.txt"));
        BufferedReader bufferedInputStream=new BufferedReader(in);
        String b;
        Map test= new HashMap();
        while ((b=bufferedInputStream.readLine())!=null){
            if(test.get(b)!=null){
                System.out.println(b);
            }else {
                test.put(b,b);
            }
        }

    }
}
发布了28 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_28738419/article/details/104063560